亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

servlet學習筆記(二)

2024-04-27 15:10:54
字體:
來源:轉載
供稿:網友

參考:http://www.cnblogs.com/xdp-gacl/p/3763559.html http://blog.csdn.net/zhouguosen_always/article/details/10740017/

一.ServletConfig

1.配置servlet初始化參數

可以在web.xml中,使用<init-param>標簽,來配置servlet的初始化參數。每對標簽初始化一個參數。 如:

<servlet> <servlet-name>AutoServlet</servlet-name> <servlet-class>com.test1.AutoServlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>TestServlet</param-value> </init-param> <init-param> <param-name>passWord</param-name> <param-value>123456</param-value> </init-param> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

當servlet配置了初始化參數后,web容器在實例化servlet對象時,會將參數封裝到ServletConfig中,并在調用servlet實例的init()方法時,將ServletConfig對象傳遞過去。因此,可以通過ServletConfig對象獲取當前servle實例的初始化參數。

package com.test1;import java.io.IOException;import java.io.PRintWriter;import java.util.Enumeration;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.xml.internal.security.Init;public class AutoServlet extends HttpServlet { //創建一個ServletConfig對象 private ServletConfig config; //重寫init()方法 public void init(ServletConfig config) throws ServletException{ this.config = config; } //從ServletConfig對象中獲取初始化參數 public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ //根據參數名稱獲取參數 String param1 = this.config.getInitParameter("name");//根據名稱獲取初始化信息的值 response.getWriter().write(param1); response.getWriter().write("<hr/>");//打印一條分割線 //獲取所有初始化參數 Enumeration <String> e = this.config.getInitParameterNames();//獲取所有初始化信息的名稱 while(e.hasMoreElements()) { String name = e.nextElement(); String value = this.config.getInitParameter(name); response.getWriter().print(name + "=" + value + "<br/>"); } } public void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ this.doGet(request, response); }}

在ie中打開,顯示的是理想的效果: ie顯示的效果 但是,在360瀏覽器(IE以及Chrome雙內核)中打開時,<hr><br/>標簽都沒有起到預期的效果,顯示的結果為: 360顯示的效果

二.ServletContext

這部分的詳細內容,參考: http://blog.csdn.net/lvzhiyuan/article/details/4664624 ServletContext是一個全局的存儲信息的空間,用于存儲一些重要的、所有用戶共享的、線程安全的信息,作為Web應用程序的上下文,被所有的用戶所共享,一直到服務器關閉,它才會被釋放。 安裝在一個服務器中的一個特定URL名字空間(比如,/myapplication)下的所有Servlet,jsp,JavaBean等Web部件的集合構成了一個Web的應用,每一個Web應用(同一JVM),容器都會有一個背景對象,而javax.servlet.ServletContext接口就提供了訪問這個背景對象的途徑。 也就是說,在整個web應用中,只有一個ServletContext,WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。

1.多個servlet通過ServletContext實現數據共享

如:

package com.test1;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*由于在ServletConfig中維護了對于ServletContext的引用 * 所以,在開發過程中,可以通過config找到對應的context */ ServletContext context = this.getServletConfig().getServletContext(); //將數據寫入到ServletContext對象中 String data = "some message"; context.setAttribute("data", data); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

package com.test1;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //直接獲取對應的context實例 ServletContext context = this.getServletContext(); //從context中取出數據 String data = (String) context.getAttribute("data"); response.getWriter().write("data = " + data); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

先運行Test1,將data寫入到ServletContext中,然后運行Test2,就能夠將寫入的data讀出來。 因為Test1和Test2位于同一個web容器以及同一個JVM中,它們對應同一個上下文,所以,可以通過ServletContext實現數據的共享。

2.獲取web應用的初始化參數

與配置servlet的初始化參數相類似,可以在web.xml中,使用<context-param></context-param>標簽來配置web應用的初始化參數。 如:

<context-param> <param-name>name</param-name> <param-value>webApplication</param-value> </context-param>

那么,可以在servlet中,通過ServletContext來獲取這些初始化參數。

package com.test1;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //直接獲取對應的context實例 ServletContext context = this.getServletContext(); //獲取整個web應用的初始化參數 String data = context.getInitParameter("name"); response.getWriter().write("data = " + data); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

3.實現請求的轉發

如:

package com.test1;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "Test-1"; response.getWriter().write(data);; ServletContext context = this.getServletContext(); //設置請求轉發對象:當test1被請求時,將秦秋轉發到test2 RequestDispatcher rd = context.getRequestDispatcher("/servlet/Test2");//地址寫Test2的url-pattern rd.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

package com.test1;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "Test-2"; response.getWriter().write("data = " + data); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

那么,在瀏覽器中訪問Test1,請求將會被轉發到Test2 請求轉發效果

4.讀取資源的配置文件

如:項目目錄如下: 項目目錄 要讀取其中的兩個資源配置文件:

package com.test1;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.text.MessageFormat;import java.util.Enumeration;import java.util.Properties;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.xml.internal.security.Init;public class AutoServlet extends HttpServlet { //利用ServletContext讀取資源配置文件 public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ /*等價于:response.setContentType("text/html;charset=UTF-8") * 將內容的字符集設為UTF-8,防止出現中文亂碼 */ response.setHeader("content-type", "text/html;charset=UTF-8"); //讀取WebRoot文件夾下的db.properties文件 readProFile(response, "/db.properties"); //路徑中,/*指的是web根目錄 //讀取src.com.test1.db2.properties //對于一個普通web項目,properties文件可以放在src目錄下,經過編譯器編譯之后目錄變為WEB-INF/classes目錄。 readProFile(response, "/WEB-INF/classes/com/test1/db2.properties"); } //讀取特定目錄下的資源配置文件 private void readProFile(HttpServletResponse response, String url) throws IOException { ServletContext context = this.getServletContext(); InputStream is = context.getResourceAsStream(url); Properties prop = new Properties(); prop.load(is); //根據key讀出value String name = prop.getProperty("name"); String user = prop.getProperty("user"); String password = prop.getProperty("password"); //輸出 //這里相當于直接在html頁面寫代碼,所以使用println時不換行,需要加上<br/> response.getWriter().println("讀取資源配置文件:" + url + "<br/>"); //使用MessageFormat.format方法,格式化輸出 response.getWriter().println( MessageFormat.format("name={0},user={1},password={2}", name,user,password) + "<hr/>" ); } public void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ this.doGet(request, response); }}

那么,在瀏覽器中訪問該servlet: 讀取資源配置文件 此外,還可以使用類裝載器來讀取資源的配置文件

注意,這種方法不適合用來裝載大文件,否則可能會造成JVM內存溢出。

例子如下(使用和上一個例子相同的目錄)

package com.test1;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.text.MessageFormat;import java.util.Enumeration;import java.util.Properties;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.xml.internal.security.Init;public class AutoServlet extends HttpServlet { //利用類裝載器讀取資源配置文件 public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ /*等價于:response.setContentType("text/html;charset=UTF-8") * 將內容的字符集設為UTF-8,防止出現中文亂碼 */ response.setHeader("content-type", "text/html;charset=UTF-8"); //讀取src.com.test1.db2.properties readProFile(response, "com/test1/db2.properties"); //讀取WebRoot文件夾下的db.properties文件 readProFile(response, "db.properties"); } //讀取特定目錄下的資源配置文件 private void readProFile(HttpServletResponse response, String url) throws IOException { //獲取類裝載器 ClassLoader loader = AutoServlet.class.getClassLoader(); InputStream is = loader.getResourceAsStream(url); //按字節讀出資源配置文件中的內容 ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] by = new byte[1024]; int len = 0; try { while((len = is.read(by))!= -1){ baos.write(by, 0, len); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } String content = new String(baos.toByteArray()); response.getWriter().write("使用類裝載器讀取文件:" + url + "<br/>"); response.getWriter().write(content + "<hr/>"); } public void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ this.doGet(request, response); }}

瀏覽器訪問的結果為: 類加載器訪問資源配置文件 從圖中可以看到,讀取WEB-ROOT目錄下的db.properties文件時,并沒有成功地將內容讀出來,后臺報了一個空指針錯誤。 這是因為,類加載器是加載類路徑下的文件,因此,配置的url路徑與直接使用ServletContext讀取配置文件時有所不同。此時,需要將配置文件放在src目錄下,寫路徑時從包名開始寫,前面不加正斜杠(/)

6.在客戶端緩存servlet的輸出

對于不常變化的數據,可以在servlet中設置一定緩存時間值,已避免瀏覽器頻繁地像服務器發送請求,已提高服務器的性能。 如:

package com.test1;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.text.MessageFormat;import java.util.Enumeration;import java.util.Properties;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.xml.internal.security.Init;public class AutoServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ /*設置合理的緩存時間,避免瀏覽器頻繁向服務器發送請求 * 這里將時間設為1天 */ String data = "This is some data"; response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000); response.getOutputStream().write(data.getBytes()); } public void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ this.doGet(request, response); }}

從ie瀏覽器的“Internet選項-瀏覽歷史記錄-設置”位置,找到當前瀏覽器的緩存存放位置,但是,本機上查看時,并未找到對應名稱的緩存文件,因此,此處持保留意見,有待后續補充。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产高清高潮精品美女| 日本精品视频在线观看| 国产精品丝袜久久久久久不卡| 亚洲片av在线| 九色91av视频| 欧美日产国产成人免费图片| 亚洲精品久久久久久久久久久久| 深夜成人在线观看| 成人黄色免费网站在线观看| 久久久久久欧美| 国产精品专区h在线观看| 欧美性受xxx| 色综合老司机第九色激情| 亚洲精品www久久久久久广东| 国产成人精品一区二区在线| 精品福利一区二区| 久久精品中文字幕| 欧美电影免费观看电视剧大全| 在线播放日韩av| 成人激情黄色网| 黑人极品videos精品欧美裸| 国产精品久久精品| 欧美高清视频一区二区| 久久露脸国产精品| 国产亚洲一区二区在线| 色噜噜狠狠色综合网图区| 日韩在线观看网址| 亚洲在线第一页| 成人午夜一级二级三级| 日韩av中文字幕在线| 日韩视频在线免费观看| 欧美精品一区二区免费| 国产69久久精品成人| 日韩精品中文字幕在线观看| 欧美日韩国产精品一区二区三区四区| 亚州精品天堂中文字幕| 日本电影亚洲天堂| 91av视频在线播放| 一道本无吗dⅴd在线播放一区| 日韩欧美亚洲范冰冰与中字| 中文欧美日本在线资源| 欧美午夜久久久| 久久天天躁夜夜躁狠狠躁2022| 亚洲午夜久久久久久久| 久久亚洲私人国产精品va| 日韩欧美国产网站| 久久影院资源站| 国产精品精品视频一区二区三区| 亚洲欧美日韩一区二区三区在线| 成人精品久久av网站| 欧美xxxx综合视频| 国产主播精品在线| 欧美激情喷水视频| 久久久久久91| 91美女片黄在线观看游戏| 欧美性猛交丰臀xxxxx网站| 91精品久久久久久久久久| 韩国精品久久久999| 丝袜美腿亚洲一区二区| 一区二区成人av| 中文字幕亚洲综合| 亚洲色图15p| 九色精品免费永久在线| 久久久久久一区二区三区| 欧美日韩免费区域视频在线观看| 韩国欧美亚洲国产| 亚洲国产精彩中文乱码av| 欧美第一页在线| 国产免费一区二区三区在线能观看| 国产精品在线看| 97涩涩爰在线观看亚洲| 国产欧美 在线欧美| 亚洲偷熟乱区亚洲香蕉av| 日韩一区二区在线视频| 成人午夜在线观看| 91人人爽人人爽人人精88v| 国产精品丝袜久久久久久高清| 国产精品福利在线观看网址| 亚洲男人av在线| 日韩一区二区精品视频| 欧美夫妻性生活视频| 国产精品视频免费观看www| 国产精品成熟老女人| 国产精品久久久久免费a∨大胸| 国产精品久久久久久久久久东京| 欧美精品videossex性护士| 91精品国产91久久久| 国产精品一区二区三区在线播放| 亚洲精品在线视频| 久久久久久美女| 久久99国产精品自在自在app| 国产精品情侣自拍| 国产精品户外野外| 色婷婷综合成人av| 精品中文字幕久久久久久| 黄网站色欧美视频| 日韩中文字幕在线视频播放| 奇门遁甲1982国语版免费观看高清| 国产一区二区在线免费| 91精品国产综合久久香蕉| 91精品国产91久久久久久最新| 97国产精品人人爽人人做| 国产精品成人v| 亚洲成人网在线| 日韩av在线资源| 成人黄色短视频在线观看| 亚洲成色999久久网站| 国产精品视频yy9099| 亚洲国产精品久久精品怡红院| 国产免费亚洲高清| 亚洲第一页中文字幕| 国产精品成人免费视频| 亚洲色图第三页| 国产香蕉97碰碰久久人人| 欧美乱人伦中文字幕在线| 亚洲片国产一区一级在线观看| 中文字幕日韩综合av| 热99在线视频| 国产精品成人一区二区三区吃奶| 欧美性猛交视频| 亚洲色图色老头| 日本精品免费一区二区三区| 亚洲电影中文字幕| 亚洲已满18点击进入在线看片| 国产亚洲激情在线| 久久色免费在线视频| 亚洲电影免费在线观看| 久久精品视频一| 国产成人在线一区二区| 国产第一区电影| 日本午夜在线亚洲.国产| 日韩成人在线视频网站| 日韩中文字幕欧美| 国产精品亚洲欧美导航| 精品国内产的精品视频在线观看| 少妇高潮 亚洲精品| 91成人天堂久久成人| 精品国产网站地址| 国产日韩欧美在线看| 亚洲黄一区二区| 亚洲图片欧美日产| 一区二区欧美日韩视频| 亚洲国产一区二区三区在线观看| 日本一区二区在线免费播放| 在线日韩日本国产亚洲| 亚洲精品乱码久久久久久按摩观| 亚洲美女在线观看| 中文字幕久久久av一区| 91精品啪在线观看麻豆免费| 亚洲精品在线不卡| 国产精品久久久久免费a∨大胸| 中文字幕亚洲一区二区三区| 亚洲午夜性刺激影院| 国产综合在线视频| 欧美色欧美亚洲高清在线视频| 日韩毛片在线看| 日韩电影免费观看在线| 欧美精品做受xxx性少妇| 岛国精品视频在线播放| 亚洲自拍偷拍一区| 国产久一一精品| 搡老女人一区二区三区视频tv| 日韩一区二区久久久| 亚洲欧美日韩网|