Servlet(Servlet Applet),全程Java Servlet,是用Java編寫的服務器端程序,其主要功能在於交互式地浏覽和修改數據,生成動態WEB內容。俠義的servlet是指Java語言實現的一個接口,廣義的servlet是指任何實現了這個servlet接口的類,一般情況先,人們將servlet理解為後者。
Servlet可以被認為是服務器端的applet。servlet被web服務器加載和執行,就如同applet被浏覽器加載執行一樣,servlet從客戶端(通過web服務器)接受請求,執行某種作業,然後返回結果。
2.1.servlet類
創建一個servlet就是編寫一個特殊類的子類,這個特殊類就是javax.servlet.http包中的HttpServlet類,HttpServlet類實現了Servlet接口,實現了響應客戶的方法。HttpServlet的子類習慣被稱為一個servlet類,這樣的類床架的對象習慣上稱為一個servlet。
JDK的目錄中沒有javax.servlet.http包,要將tomcat安裝目錄lib子目錄中的servlet-api.jar文件復制到tomcat所使用JDK的拓展目錄下,jdk*/jre/lib/ext中。
2.2.保存字節碼文件
想要使用servlet,必須要先編譯,那麼tomcat如何訪問到這個字節碼文件呢?就如同之前訪問javabean一樣,我們需要在項目目錄下的WEB-INF/classes下建立相應的包去存儲servlet的字節碼文件。
2.3.編寫部署文件web.xml
Servlet類的字節碼文件保存到指定的目錄後,必須為Tomcat服務器編寫一個部署文件,只有這樣Tomcat才會按照用戶的請求使用servlet字節碼文件創建對象。編寫的web.xml文件應該存儲在項目目錄下WEB-INF目錄下。
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- xml聲明以<? xml開始,以?>結束,encoding屬性用於指定編碼方式,如果准備用ASCII字符,該屬性可以是iso-8859-1,如果該屬性值為utf-8,那麼標記及標記內容除了可以使用ASCII字符外,還可以使用漢字,日文中的平假名、片假名等--> <web-app> <!-- xml文件必須有一個根標記,這個就是根標記--> <servlet> <!-- 可有若干個servlet標記,標記內容由tomcat服務器處理--> <servlet-name>hello</servlet-name> <!-- 指定tomcat服務器創建的servlet的名字--> <servlet-class>myservlet.test.test_servlet</servlet-class> <!-- 指定tomcat服務器用哪個servlet類來創建--> </servlet> <servlet-mapping> <!-- tomcat服務器創建的servlet的名字,必須與上邊servlet-name的值一致--> <servlet-name>hello</servlet-name> <!----> <url-pattern>/lookHello</url-pattern> <!-- 指定請求servlet的url格式--> </servlet-mapping> </web-app>
web服務目錄的WEB-INF子目錄下的web.xml文件負責管理該web服務目錄下的全部servlet,當web服務器提供更多的servlet時,只需要在web.xml文件中添加<servlet>和<servlet-mapping>標記即可。web.xml編寫正確才能啟動tomcat服務。
Servlet類可以使用getServletName()方法返回配置文件中<servlet-name>標記給出的servlet的名字。
2.4.向servlet傳遞參數的值
在請求servlet時,可以在請求的<url-pattern>中額外的加入參數及其值,格式:
servlet名?參數1=值1&參數2=值…..參數n=值
被請求的servlet可以通過request對象獲取參數的值:
request.getParameter(參數n)
4.1.servlet對象的生命周期
一個servlet的生命周期主要有以下3個過程組成:
(1)初始化servlet,servlet第一次被請求加載時,服務器要創建一個servlet,這個servlet必須調用init方法完成必要的初始化工作,並且只調用一次。
(2)再調用service方法響應用戶的請求
(3)當服務器關閉時,調用destroy方法銷毀servlet
4.2.init方法
該方法是HttpServlet類中的方法,可以在子類中重寫這個方法。init方法的聲明格式:
public void init(ServletConfig config) throws ServletException
該方法在執行的時候,服務器會把一個ServletConfig對象傳遞給init方法,這個對象就被保存到servlet中,直到servlet被銷毀,這個ServletConfig對象負責向servlet傳遞服務器設置信息,如果傳遞失敗就會發生ServletException,servlet不能正常工作。
4.3.service方法
該方法是HttpServlet類中的方法,可以在子類中直接繼承或重寫該方法。該方法的聲明格式:
public void service(HttpServletRequest request HttpServletResponse reponse) throw ServletException,IOException
當servlet成功創建和初始化之後,調用service方法來處理用戶的請求並返回響應,服務器將兩個參數傳遞個該方法。一個是HttpServletRequeset類型的對象,該對象用來響應用戶的請求信息;一個是HttpServletResponse類型的對象,該對象用來響應用戶的請求。
service方法的功能是檢查HTTP請求類型(get、post等),並在service方法中根據用戶的請求方式,在service方法中對應的調用doGet或doPost方法。
service方法可以被多次調用,只要有用戶請求servlet時,就會調用執行service方法,調用過程運行在不同的線程中,互不干擾。
4.4.destroy方法
該方法是HttpServlet類中的方法,子類可以直接繼承這個方法,一般不需要重寫。聲明格式:
public destroy()
當服務器終止時,比如關閉服務器,destroy()方法才會被執行,銷毀servlet。
5.1.通過表單向servlet提交數據
Web服務目錄下的JSP頁面都可以通過表單請求該Web服務目錄下的某個servlet。如果web.xml文件中的<servlet-mapping>標記的子標記<url-pattern>指定的請求servlet格式為”/hello”,那麼action給出的值就是”hello”.
<form action="hello"> </form>另外一種就是在servlet中額外加入參數及其值
<form action="hello?h=10&e=11&l=2"> </form>通過JSP頁面訪問servlet的好處就是,JSP頁面可以負責頁面的信息顯示,信息相關的處理交給servlet去完成。
5.2.通過超鏈接訪問servlet
和表單處理一樣,如果<url-pattern>指定為“/hello”,那麼<a>中的href值是“hello”。
<a href="hello">hello</a>
HttpServlet提供了doGet和doPost方法用來處理用戶的請求並做出相應。
可以在Servlet中重寫doGet或doPost方法來響應用戶的請求,這樣可以增加響應的靈活性並降低服務器的負擔。doGet和doPost的處理過程完全相同,可以只在doPost方法中編寫處理過程,在doGet方法中調用doPost方法即可,反之亦可。
如果根據請求類型進行不同的處理,就要在兩個方法中編寫不同的處理過程。
重定向的功能:將用戶從當前頁面或servlet定向到另一個JSP頁面或servlet。
轉發的功能:將用戶對當前JSP頁面或servlet的請求轉發給另外一個JSP頁面或servlet。
7.1.重定向sendRedirect方法
該方法是HttpServletResponse類中的方法。當用戶請求一個servlet時,該servlet在處理數據後,可以使用重定向方法將用戶從當前頁面或servlet重定向到一個JSP頁面或servlet,但不能將用戶對當前頁面或servlet的請求轉發給所定向的資源。
重定向的目標頁面或servlet無法使用request獲取用戶提交的數據。
7.2.轉發對象RequestDispatcher
該對象可以把用戶對當前JSP頁面或servlet的請求轉發給另一個JSP頁面或servlet,而且將用戶對當前頁面或servlet的請求和響應傳遞給目標頁面或servlet。
轉發的目標頁面或servlet可以使用request獲取用戶提交的數據。
轉發步驟:
(1)得到RequestDispatcher對象。用戶請求的當前頁面或servlet可以讓HttpServletRequest對象request調用public RequestDispatcher getRequestDispatcher(String path)方法返回一個RequestDispatcher對象,其中參數path是要轉發的目標頁面或servlet。例如:
RequestDispatcher dis=request.getRequestDispatcher(“a.jsp”);
(2)轉發。在(1)中獲取的RequestDispatcher對象調用void forward(ServletRequest request,ServletResponse reponse)throw ServletException.java.io.IOException方法將用戶對當前頁面或servlet的請求轉發個RequestDispatcher對象指定的頁面或servlet。例如:
dis.forward(request,response);
和重定向方法不同的是,用戶在浏覽器地址欄看不到目標頁面或servlet地址,只能看到目標頁面或servlet的運行效果,浏覽器地址欄中依然是當前頁面或servlet地址,刷新頁面將請求當前頁面或servlet。
HttpServletRequest對象request調用getSession方法獲取用戶的session對象:
HttpSession se=request.getSession(true);