Servlet&ServletContext
Servlet&ServletContext
@(04JavaEE)
Servlet概念
Servlet是執行在伺服器端的Java小程式,是sun公司提供的一套規範 Servlet是執行在伺服器端的Java小程式,是sun公司提供的一套規範(介面),用來處理客戶端請求、響應給瀏覽器的動態資源,但Servlet的實質就是Java程式碼,通過Java的API動態地向客戶端輸出內容。使用servlet需要匯入jar包,tomcat自帶。
Servlet的API
Servlet介面中的方法
init(ServletConfig config)
Servlet物件建立的時候執行。 ServletConfig 代表該Servlet物件的配置資訊(例如Servlet配置檔案的name) servletConfig.getServletName()可以獲得獲得該Servlet的name servletConfig.getInitParameter()可以獲得該Servlet的初始化引數 servletConfig.getServletContext()可以獲得Servletcontext物件
service(ServletRequest request, ServletResponse response)
上面的程式碼每次請求都會執行。 每次訪問service()方法都和建立一對新的request和response ServletRequest 代表請求,內部封裝的是http請求資訊 ServletResponse 代表響應,內部封裝的是http響應資訊
destroy()
上面的程式碼再Servlet物件銷燬時執行。
HttpServlet類中的方法
init(ServletConfig config)
doGet()
doPost()
destroy()
與Servlet介面中的方法類似,實際上service()方法也會在doGet()和doPost()中執行。HttpServlet類中的方法比Servlet介面中的方法更常用。
Setvlet的生命週期
建立
預設第一次訪問Servlet時建立該物件。
銷燬
伺服器關閉。
每次訪問必然執行的方法
service(ServletRequest request, ServletResponse response)方法。
web.xml的配置
servlet的類的配置
<servlet> <servlet-name>abc</servlet-name> <servlet-class>com.wangshaogang.servlet.QuickStartServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql:///mydb</param-value> </init-param> </servlet>
servlet的虛擬路徑的配置
<servlet-mapping>
<servlet-name>abc</servlet-name>
<!--1.完全匹配-->
<url-pattern>/QuickStartServlet</url-pattern>
<!--2.目錄匹配-->
<url-pattern>/aaa/*</url-pattern>
<!--3.副檔名匹配,不能與目錄匹配混用-->
<url-pattern>*.wsg</url-pattern>
</servlet-mapping>
歡迎頁的配置
<welcome-file-list>
<welcome-file>11111.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
越靠上優先順序越高,如果不配置,會用tomcat的全域性歡迎頁配置,index.jsp優先順序最高。
修改servlet物件建立次序
在servlet的類的配置中加上<load-on-startup>3</load-on-startup>
,中間的數字是優先順序,越小優先順序越高。
預設servlet
在servlet的虛擬路徑的配置中加上/,代表該servlet時預設的servlet,當訪問資源地址所有的servlet都不匹配時,預設的servlet負責處理。 配置了預設servlet以後不能訪問靜態html,因為這裡配置的預設servlet會覆蓋tomcat的全域性預設servlet,只能把.html當成一個字串,tomcat的全域性預設servlet才能訪問靜態html。
ServletContext
ServletContext是一個web應用的上下文物件,內部封裝的是該web應用的資訊,一個web應用有一個ServletContext物件,一個web應用有多Servlet物件。
生命週期
建立:該web應用被載入(伺服器啟動時或在伺服器啟動的狀態下發布應用) 銷燬:該web應用被解除安裝(伺服器關閉或從伺服器中移除該web應用)
獲得
ServletContext servletContext = config.getServletContext();
ServletContext servletContext = this.getServletContext();
建議使用第二種。
作用
獲得web應用全域性初始化引數
在web.xml中配置,與servlet同級,如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>abcd</param-name>
<param-value>1111</param-value>
</context-param>
</web-app>
獲得引數:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String initParameter = context.getInitParameter("abcd");
System.out.println(initParameter);
}
獲得web應用中任何資源的絕對路徑(重要)
引數是相對WEB應用的相對路徑。
String realPath_a = context.getRealPath("/a.txt");
String realPath_b = context.getRealPath("/WEB-INF/b.txt");
String realPath_c = context.getRealPath("/WEB-INF/classes/c.txt");
System.out.println(realPath_a);
System.out.println(realPath_b);
System.out.println(realPath_c);
控制檯輸出:
D:\Program Files\Apache Software Foundation\apache-tomcat-7.0.52\webapps\WEB13_2\a.txt
D:\Program Files\Apache Software Foundation\apache-tomcat-7.0.52\webapps\WEB13_2\WEB-INF\b.txt
D:\Program Files\Apache Software Foundation\apache-tomcat-7.0.52\webapps\WEB13_2\WEB-INF\classes\c.txt
D:\Program Files\Apache Software Foundation\apache-tomcat-7.0.52\webapps\WEB13_2\d.txt
獲得絕對路徑的方式只有兩種,另一種方式是通過類載入器獲得。
ServletContext是一個域物件(重要)
儲存資料的區域就是域物件。利用ServletContext儲存的資料是全域性資料,可以避免頁面重新整理時servlet資料重置的問題。 存資料:
context.setAttribute("name","張三");
取資料:
Stringname=(String)this.getServletContext().getAttribute("name");
System.out.println(name);
控制檯輸出:
張三