在Servlet的配置文件web.xml中,能夠使用一個或多個<init-param>標籤爲servlet配置一些初始化參數。html
例如:java
1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class> 4 <!--配置ServletConfigDemo1的初始化參數 --> 5 <init-param> 6 <param-name>name</param-name> 7 <param-value>gacl</param-value> 8 </init-param> 9 <init-param> 10 <param-name>password</param-name> 11 <param-value>123</param-value> 12 </init-param> 13 <init-param> 14 <param-name>charset</param-name> 15 <param-value>UTF-8</param-value> 16 </init-param> 17 </servlet>
當servlet配置了初始化參數後,web容器在建立servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,咱們經過ServletConfig對象就能夠獲得當前servlet的初始化參數信息。mysql
例如:程序員
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import java.util.Enumeration; 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletConfigDemo1 extends HttpServlet { 12 13 /** 14 * 定義ServletConfig對象來接收配置的初始化參數 15 */ 16 private ServletConfig config; 17 18 /** 19 * 當servlet配置了初始化參數後,web容器在建立servlet實例對象時, 20 * 會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時, 21 * 將ServletConfig對象傳遞給servlet。進而,程序員經過ServletConfig對象就能夠 22 * 獲得當前servlet的初始化參數信息。 23 */ 24 @Override 25 public void init(ServletConfig config) throws ServletException { 26 this.config = config; 27 } 28 29 public void doGet(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 //獲取在web.xml中配置的初始化參數 32 String paramVal = this.config.getInitParameter("name");//獲取指定的初始化參數 33 response.getWriter().print(paramVal); 34 35 response.getWriter().print("<hr/>"); 36 //獲取全部的初始化參數 37 Enumeration<String> e = config.getInitParameterNames(); 38 while(e.hasMoreElements()){ 39 String name = e.nextElement(); 40 String value = config.getInitParameter(name); 41 response.getWriter().print(name + "=" + value + "<br/>"); 42 } 43 } 44 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 this.doGet(request, response); 48 } 49 50 }
運行結果以下:web
WEB容器在啓動時,它會爲每一個WEB應用程序都建立一個對應的ServletContext對象,它表明當前web應用。
ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,能夠經過ServletConfig.getServletContext方法得到ServletContext對象。
因爲一個WEB應用中的全部Servlet共享同一個ServletContext對象,所以Servlet對象之間能夠經過ServletContext對象來實現通信。ServletContext對象一般也被稱之爲context域對象。sql
範例:ServletContextDemo1和ServletContextDemo2經過ServletContext對象實現數據共享瀏覽器
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import javax.servlet.ServletContext; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class ServletContextDemo1 extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 String data = "xdp_gacl"; 15 /** 16 * ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時, 17 * 能夠經過ServletConfig.getServletContext方法得到ServletContext對象。 18 */ 19 ServletContext context = this.getServletConfig().getServletContext();//得到ServletContext對象 20 context.setAttribute("data", data); //將data存儲到ServletContext對象中 21 } 22 23 public void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 doGet(request, response); 26 } 27 }
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import javax.servlet.ServletContext; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class ServletContextDemo2 extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 ServletContext context = this.getServletContext(); 15 String data = (String) context.getAttribute("data");//從ServletContext對象中取出數據 16 response.getWriter().print("data="+data); 17 } 18 19 public void doPost(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 doGet(request, response); 22 } 23 }
先運行ServletContextDemo1,將數據data存儲到ServletContext對象中,而後運行ServletContextDemo2就能夠從ServletContext對象中取出數據了,這樣就實現了數據共享,以下圖所示:緩存
在web.xml文件中使用<context-param>標籤配置WEB應用的初始化參數,以下所示:服務器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 3 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 4 <display-name></display-name> 5 <!-- 配置WEB應用的初始化參數 --> 6 <context-param> 7 <param-name>url</param-name> 8 <param-value>jdbc:mysql://localhost:3306/test</param-value> 9 </context-param> 10 11 <welcome-file-list> 12 <welcome-file>index.jsp</welcome-file> 13 </welcome-file-list> 14 </web-app>
獲取Web應用的初始化參數,代碼以下:app
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import javax.servlet.ServletContext; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 11 public class ServletContextDemo3 extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 ServletContext context = this.getServletContext(); 17 //獲取整個web站點的初始化參數 18 String contextInitParam = context.getInitParameter("url"); 19 response.getWriter().print(contextInitParam); 20 } 21 22 public void doPost(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 doGet(request, response); 25 } 26 27 }
運行結果:
ServletContextDemo4
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.RequestDispatcher; 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ServletContextDemo4 extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 String data = "<h1><font color='red'>abcdefghjkl</font></h1>"; 17 response.getOutputStream().write(data.getBytes()); 18 ServletContext context = this.getServletContext();//獲取ServletContext對象 19 RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//獲取請求轉發對象(RequestDispatcher) 20 rd.forward(request, response);//調用forward方法實現請求轉發 21 } 22 23 public void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 } 26 }
ServletContextDemo5
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class ServletContextDemo5 extends HttpServlet { 10 11 public void doGet(HttpServletRequest request, HttpServletResponse response) 12 throws ServletException, IOException { 13 response.getOutputStream().write("servletDemo5".getBytes()); 14 } 15 16 public void doPost(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 this.doGet(request, response); 19 } 20 21 }
運行結果:
訪問的是ServletContextDemo4,瀏覽器顯示的倒是ServletContextDemo5的內容,這就是使用ServletContext實現了請求轉發
項目目錄結構以下:
1 package gacl.servlet.study; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.text.MessageFormat; 8 import java.util.Properties; 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 /** 15 * 使用servletContext讀取資源文件 16 * 17 * @author gacl 18 * 19 */ 20 public class ServletContextDemo6 extends HttpServlet { 21 22 public void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 /** 25 * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼; 26 * 這樣就不會出現中文亂碼了 27 */ 28 response.setHeader("content-type","text/html;charset=UTF-8"); 29 readSrcDirPropCfgFile(response);//讀取src目錄下的properties配置文件 30 response.getWriter().println("<hr/>"); 31 readWebRootDirPropCfgFile(response);//讀取WebRoot目錄下的properties配置文件 32 response.getWriter().println("<hr/>"); 33 readPropCfgFile(response);//讀取src目錄下的db.config包中的db3.properties配置文件 34 response.getWriter().println("<hr/>"); 35 readPropCfgFile2(response);//讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件 36 37 } 38 39 /** 40 * 讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件 41 * @param response 42 * @throws IOException 43 */ 44 private void readPropCfgFile2(HttpServletResponse response) 45 throws IOException { 46 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/gacl/servlet/study/db4.properties"); 47 Properties prop = new Properties(); 48 prop.load(in); 49 String driver = prop.getProperty("driver"); 50 String url = prop.getProperty("url"); 51 String username = prop.getProperty("username"); 52 String password = prop.getProperty("password"); 53 response.getWriter().println("讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件:"); 54 response.getWriter().println( 55 MessageFormat.format( 56 "driver={0},url={1},username={2},password={3}", 57 driver,url, username, password)); 58 } 59 60 /** 61 * 讀取src目錄下的db.config包中的db3.properties配置文件 62 * @param response 63 * @throws FileNotFoundException 64 * @throws IOException 65 */ 66 private void readPropCfgFile(HttpServletResponse response) 67 throws FileNotFoundException, IOException { 68 //經過ServletContext獲取web資源的絕對路徑 69 String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.properties"); 70 InputStream in = new FileInputStream(path); 71 Properties prop = new Properties(); 72 prop.load(in); 73 String driver = prop.getProperty("driver"); 74 String url = prop.getProperty("url"); 75 String username = prop.getProperty("username"); 76 String password = prop.getProperty("password"); 77 response.getWriter().println("讀取src目錄下的db.config包中的db3.properties配置文件:"); 78 response.getWriter().println( 79 MessageFormat.format( 80 "driver={0},url={1},username={2},password={3}", 81 driver,url, username, password)); 82 } 83 84 /** 85 * 經過ServletContext對象讀取WebRoot目錄下的properties配置文件 86 * @param response 87 * @throws IOException 88 */ 89 private void readWebRootDirPropCfgFile(HttpServletResponse response) 90 throws IOException { 91 /** 92 * 經過ServletContext對象讀取WebRoot目錄下的properties配置文件 93 * 「/」表明的是項目根目錄 94 */ 95 InputStream in = this.getServletContext().getResourceAsStream("/db2.properties"); 96 Properties prop = new Properties(); 97 prop.load(in); 98 String driver = prop.getProperty("driver"); 99 String url = prop.getProperty("url"); 100 String username = prop.getProperty("username"); 101 String password = prop.getProperty("password"); 102 response.getWriter().println("讀取WebRoot目錄下的db2.properties配置文件:"); 103 response.getWriter().print( 104 MessageFormat.format( 105 "driver={0},url={1},username={2},password={3}", 106 driver,url, username, password)); 107 } 108 109 /** 110 * 經過ServletContext對象讀取src目錄下的properties配置文件 111 * @param response 112 * @throws IOException 113 */ 114 private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException { 115 /** 116 * 經過ServletContext對象讀取src目錄下的db1.properties配置文件 117 */ 118 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties"); 119 Properties prop = new Properties(); 120 prop.load(in); 121 String driver = prop.getProperty("driver"); 122 String url = prop.getProperty("url"); 123 String username = prop.getProperty("username"); 124 String password = prop.getProperty("password"); 125 response.getWriter().println("讀取src目錄下的db1.properties配置文件:"); 126 response.getWriter().println( 127 MessageFormat.format( 128 "driver={0},url={1},username={2},password={3}", 129 driver,url, username, password)); 130 } 131 132 public void doPost(HttpServletRequest request, HttpServletResponse response) 133 throws ServletException, IOException { 134 this.doGet(request, response); 135 } 136 137 }
運行結果以下:
1 package gacl.servlet.study; 2 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.text.MessageFormat; 8 import java.util.Properties; 9 10 import javax.servlet.ServletException; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 15 /** 16 * 用類裝載器讀取資源文件 17 * 經過類裝載器讀取資源文件的注意事項:不適合裝載大文件,不然會致使jvm內存溢出 18 * @author gacl 19 * 20 */ 21 public class ServletContextDemo7 extends HttpServlet { 22 23 public void doGet(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 /** 26 * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼; 27 * 這樣就不會出現中文亂碼了 28 */ 29 response.setHeader("content-type","text/html;charset=UTF-8"); 30 test1(response); 31 response.getWriter().println("<hr/>"); 32 test2(response); 33 response.getWriter().println("<hr/>"); 34 //test3(); 35 test4(); 36 37 } 38 39 /** 40 * 讀取類路徑下的資源文件 41 * @param response 42 * @throws IOException 43 */ 44 private void test1(HttpServletResponse response) throws IOException { 45 //獲取到裝載當前類的類裝載器 46 ClassLoader loader = ServletContextDemo7.class.getClassLoader(); 47 //用類裝載器讀取src目錄下的db1.properties配置文件 48 InputStream in = loader.getResourceAsStream("db1.properties"); 49 Properties prop = new Properties(); 50 prop.load(in); 51 String driver = prop.getProperty("driver"); 52 String url = prop.getProperty("url"); 53 String username = prop.getProperty("username"); 54 String password = prop.getProperty("password"); 55 response.getWriter().println("用類裝載器讀取src目錄下的db1.properties配置文件:"); 56 response.getWriter().println( 57 MessageFormat.format( 58 "driver={0},url={1},username={2},password={3}", 59 driver,url, username, password)); 60 } 61 62 /** 63 * 讀取類路徑下面、包下面的資源文件 64 * @param response 65 * @throws IOException 66 */ 67 private void test2(HttpServletResponse response) throws IOException { 68 //獲取到裝載當前類的類裝載器 69 ClassLoader loader = ServletContextDemo7.class.getClassLoader(); 70 //用類裝載器讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件 71 InputStream in = loader.getResourceAsStream("gacl/servlet/study/db4.properties"); 72 Properties prop = new Properties(); 73 prop.load(in); 74 String driver = prop.getProperty("driver"); 75 String url = prop.getProperty("url"); 76 String username = prop.getProperty("username"); 77 String password = prop.getProperty("password"); 78 response.getWriter().println("用類裝載器讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件:"); 79 response.getWriter().println( 80 MessageFormat.format( 81 "driver={0},url={1},username={2},password={3}", 82 driver,url, username, password)); 83 } 84 85 /** 86 * 經過類裝載器讀取資源文件的注意事項:不適合裝載大文件,不然會致使jvm內存溢出 87 */ 88 public void test3() { 89 /** 90 * 01.avi是一個150多M的文件,使用類加載器去讀取這個大文件時會致使內存溢出: 91 * java.lang.OutOfMemoryError: Java heap space 92 */ 93 InputStream in = ServletContextDemo7.class.getClassLoader().getResourceAsStream("01.avi"); 94 System.out.println(in); 95 } 96 97 /** 98 * 讀取01.avi,並拷貝到e:\根目錄下 99 * 01.avi文件太大,只能用servletContext去讀取 100 * @throws IOException 101 */ 102 public void test4() throws IOException { 103 // path=G:\Java學習視頻\JavaWeb學習視頻\JavaWeb\day05視頻\01.avi 104 // path=01.avi 105 String path = this.getServletContext().getRealPath("/WEB-INF/classes/01.avi"); 106 /** 107 * path.lastIndexOf("\\") + 1是一個很是絕妙的寫法 108 */ 109 String filename = path.substring(path.lastIndexOf("\\") + 1);//獲取文件名 110 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/01.avi"); 111 byte buffer[] = new byte[1024]; 112 int len = 0; 113 OutputStream out = new FileOutputStream("e:\\" + filename); 114 while ((len = in.read(buffer)) > 0) { 115 out.write(buffer, 0, len); 116 } 117 out.close(); 118 in.close(); 119 } 120 121 public void doPost(HttpServletRequest request, HttpServletResponse response) 122 throws ServletException, IOException { 123 124 this.doGet(request, response); 125 } 126 127 }
運行結果以下:
對於不常常變化的數據,在servlet中能夠爲其設置合理的緩存時間值,以免瀏覽器頻繁向服務器發送請求,提高服務器的性能。例如:
1 package gacl.servlet.study; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class ServletDemo5 extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 String data = "abcddfwerwesfasfsadf"; 15 /** 16 * 設置數據合理的緩存時間值,以免瀏覽器頻繁向服務器發送請求,提高服務器的性能 17 * 這裏是將數據的緩存時間設置爲1天 18 */ 19 response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000); 20 response.getOutputStream().write(data.getBytes()); 21 } 22 23 public void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 26 this.doGet(request, response); 27 } 28 29 }