1. 程式人生 > >Servlet&ServletContext

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);

控制檯輸出:

張三