參考:http://www.cnblogs.com/xdp-gacl/p/3763559.html http://blog.csdn.net/zhouguosen_always/article/details/10740017/
可以在web.xml中,使用<init-param>
標簽,來配置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中打開,顯示的是理想的效果: 但是,在360瀏覽器(IE以及Chrome雙內核)中打開時,
<hr>
和<br/>
標簽都沒有起到預期的效果,顯示的結果為:
這部分的詳細內容,參考: 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應用。
如:
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實現數據的共享。
與配置servlet的初始化參數相類似,可以在web.xml中,使用<context-param></context-param>
標簽來配置web應用的初始化參數。 如:
那么,可以在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); }}如:
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
如:項目目錄如下: 要讀取其中的兩個資源配置文件:
那么,在瀏覽器中訪問該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目錄下,寫路徑時從包名開始寫,前面不加正斜杠(/)
對于不常變化的數據,可以在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選項-瀏覽歷史記錄-設置”位置,找到當前瀏覽器的緩存存放位置,但是,本機上查看時,并未找到對應名稱的緩存文件,因此,此處持保留意見,有待后續補充。
新聞熱點
疑難解答