国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 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選項-瀏覽歷史記錄-設置”位置,找到當前瀏覽器的緩存存放位置,但是,本機上查看時,并未找到對應名稱的緩存文件,因此,此處持保留意見,有待后續補充。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭水| 东海县| 缙云县| 吉林省| 桑植县| 遂平县| 康马县| 广饶县| 即墨市| 张北县| 山阳县| 镇坪县| 崇义县| 吐鲁番市| 平顶山市| 苍溪县| 道真| 昌图县| 桂阳县| 广安市| 江门市| 溧水县| 高唐县| 政和县| 德化县| 忻州市| 伽师县| 富源县| 临朐县| 泾阳县| 寿宁县| 石门县| 隆昌县| 甘泉县| 沿河| 富锦市| 乐平市| 贵溪市| 西吉县| 石阡县| 汝州市|