Servlet的基礎知識與使用方法
---------------------------------First---------------------------------
一、Servlet基礎
1.1 Servlet是什麼
Servlet是一種基本元件規範,和JSP,Filter,Tag,Listener等同樣是屬於Java Web的基本元件。
Servlet一般是作為控制層處理檢視層的請求操作的。
1.2 Servlet的原理
剛才說Servlet一般是作為控制層處理前臺頁面的請求操作的,關於Servlet與客戶端請求之間的一個過程首先客戶端即前臺傳送一個請求。Servlet呼叫service()方法進行響應處理。常用的請求方式是get和post方式,service()方法中對請求方式進行了匹配呼叫doget()或者doPost()等方法,然後在對應的方法中呼叫相關物件、方法、引數等處理業務,實現對客戶端請求的響應。本身Servlet介面是沒有doGet()、doPost()等方法的。HttpServlet中定義了這些方法。所以實際開發中我們會通過繼承HttpServlet來建立Servlet類。
1.3 Servlet的生命週期
Servlet的生命週期過程如下:
1>. Servlet容器載入階段
2>. 初始化階段 init(ServletConfig sc)
-->該方法僅被載入一次,用於初始化操作。
3>. 響應服務階段 service(ServletRequest request, ServletResponse response)
-->每次請求都會呼叫該方法,該方法用於請求響應操作。
4>. 銷燬階段 destroy()
---------------------------------Second---------------------------------
二、WEB應用中的Servlet
2.1 Servlet介面類實現
新建一個類TestServlet,然後實現Servlet介面。
程式碼如下:
(閱讀原始碼有助於更好的理解)
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
} 複製程式碼
這就是直接實現Servlet介面的類所有要實現的方法。通過這些方法我們能夠更好的理解Servlet的生命週期。
2.2 配置與對映
在WEB應用中新建上述類 TestServlet,並在web.xml檔案中配置註冊Servlet及對映servlet-mapping
配置如下:
<!-- 註冊和對映 servlet -->
<servlet>
<!-- 1>Servlet註冊的名字 -->
<servlet-name>testServlet</servlet-name>
<!-- 2>Servlet的全類名 -->
<servlet-class>cn.edu.hpu.rfeng.TestServlet</servlet-class>
<!-- 3>配置Servlet的初始化引數 -->
<init-param>
<!-- 初始化一個引數user其資料為root -->
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 2.1>需要和某一個servlet name一致 -->
<servlet-name>testServlet</servlet-name>
<!-- 2.2>對映具體的訪問路徑:‘/’代表當前WEB應用的根目錄 -->
<url-pattern>/test</url-pattern>
</servlet-mapping> 複製程式碼
配置後可測試該Servlet。
2.3 執行測試一個Servlet
在tomcat7下執行該WEB應用,瀏覽器上訪問對應TestServlet的路徑,訪問 5 次即發出 5 次對TestServlet的請求。對應請求的響應結果輸出在控制檯。
如圖所示:
圖2.模擬請求servlet圖
圖3.模擬Servlet響應請求圖
根據結果看到,5次請求的響應結果中,Servlet都呼叫了service()方法,init()只呼叫了一次。
init()方法僅在第一次被Servlet容器載入時呼叫了一次。所以初始化操作一般在init()方法中操作。
service()方法會對每次請求給出響應。一般響應操作邏輯程式碼寫在Servlet的service()方法中。
2.4 實際開發中的Servlet
一般不會通過實現Servlet這個介面來寫控制層的Servlet。實際開發中通過繼承HttpServlet,覆蓋其中的doPost(),doGet()方法來處理檢視層傳來的請求。(一般可以通過開發工具直接建立一個servlet檔案)
新建Servlet檔案DevelopServlet,
程式碼如下:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DevelopServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
} 複製程式碼
2.5 Servlet下的request與response
servlet下有HttpServletRequest,HttpServletResponse,ServletRequest,ServletResponse物件。看命名大致也能看出這些物件之間的聯絡。其中request物件簡單來說就是用於接收客戶端瀏覽器提交的資料,response物件則將服務端的資料傳送到客戶端瀏覽器
request物件的常用方法:
setAttribute(String name,Object o): 設定屬性名和屬性值
Object getAttribute();獲取屬性值
Enumeration getAttributeNames();獲取所有屬性組成的名字
void removeAttribute(String a)移除指定物件的屬性
getParameter()獲取引數 複製程式碼
---------------------------------Third---------------------------------
三、模擬案例
模擬登入案例
3.1 案例描述
前端html頁面有個表單有兩個文字框,向服務端傳送請求,Servlet接收處理請求,獲取請求引數。將瀏覽器傳來的資料和預設的使用者資料user:zhangsan;password:123456進行比對。若比對成功,處理操作返回前臺頁面並提示使用者登入成功!若比對失敗,也返回前臺頁面提示使用者名稱或密碼錯誤!
3.2 案例實現
1>在WEB專案下新建登入頁面 login.html
程式碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="DevelopServlet" method="post">
賬戶:<input type="text" name="name" /><br>
密碼:<input type="password" name="password" /><br>
<input type="submit" value="login" />
</form>
</body>
</html> 複製程式碼
點選對應頁面的登入按鈕,會向DevelopServlet發出請求,Servlet接收請求並響應
2>在DevelopServlet中的邏輯操作
程式碼如下:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DevelopServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取請求引數
String name = request.getParameter("name");
String password = request.getParameter("password");
//比對資料並做出處理
if (name.equals("zhangsan") && password.equals("123456")) {
response.sendRedirect("success.html");//重定向到登入成功頁面
return;
}
response.sendRedirect("error.html");//重定向到登入失敗頁面
}
} 複製程式碼
其中的success.html和error.html檔案就很簡單了,實現在頁面顯示登入成功或失敗的字樣。3>web.xml配置檔案
注意:對Servlet必須在web.xml檔案中進行註冊對映。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!--註冊servlet -->
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<!-- servlet的命名 -->
<servlet-name>DevelopServlet</servlet-name>
<!-- servlet類全類名,包名加上類名 -->
<servlet-class>cn.edu.hpu.rfeng.DevelopServlet</servlet-class>
</servlet>
<!-- 配置對映 -->
<servlet-mapping>
<servlet-name>DevelopServlet</servlet-name>
<url-pattern>/DevelopServlet</url-pattern>
</servlet-mapping>
</web-app>
複製程式碼
在tomcat7下執行該WEB應用:效果如下:
1>文字框輸入正確的賬戶密碼時:點選登入按鈕經servlet處理請求重定向到登入成功頁面
圖4.正確賬戶登入圖
圖5.登入成功圖
2>錯誤情況下:經servlet處理驗證賬戶錯誤重定向到登入錯誤提示頁面
圖6.錯誤賬戶登入圖
圖7.登入失敗圖
---------------------------------The End---------------------------------