---------------------------------First---------------------------------html
Servlet是一種基本組件規範,和JSP,Filter,Tag,Listener等一樣是屬於Java Web的基本組件。前端
Servlet通常是做爲控制層處理視圖層的請求操做的。java
剛纔說Servlet通常是做爲控制層處理前臺頁面的請求操做的,關於Servlet與客戶端請求之間的一個過程首先客戶端即前臺發送一個請求。Servlet調用service()方法進行響應處理。經常使用的請求方式是get和post方式,service()方法中對請求方式進行了匹配調用doget()或者doPost()等方法,而後在對應的方法中調用相關對象、方法、參數等處理業務,實現對客戶端請求的響應。自己Servlet接口是沒有doGet()、doPost()等方法的。HttpServlet中定義了這些方法。因此實際開發中咱們會經過繼承HttpServlet來建立Servlet類。web
Servlet的生命週期過程以下:瀏覽器
1>. Servlet容器加載階段tomcat
2>. 初始化階段 init(ServletConfig sc)bash
-->該方法僅被加載一次,用於初始化操做。app
3>. 響應服務階段 service(ServletRequest request, ServletResponse response)ide
-->每次請求都會調用該方法,該方法用於請求響應操做。工具
4>. 銷燬階段 destroy()
---------------------------------Second---------------------------------
新建一個類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的生命週期。
在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。
在tomcat7下運行該WEB應用,瀏覽器上訪問對應TestServlet的路徑,訪問 5 次即發出 5 次對TestServlet的請求。對應請求的響應結果輸出在控制檯。
如圖所示:
圖2.模擬請求servlet圖
圖3.模擬Servlet響應請求圖
根據結果看到,5次請求的響應結果中,Servlet都調用了service()方法,init()只調用了一次。
init()方法僅在第一次被Servlet容器加載時調用了一次。因此初始化操做通常在init()方法中操做。
service()方法會對每次請求給出響應。通常響應操做邏輯代碼寫在Servlet的service()方法中。
通常不會經過實現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 {
}
} 複製代碼
servlet下有HttpServletRequest,HttpServletResponse,ServletRequest,ServletResponse對象。看命名大體也能看出這些對象之間的聯繫。其中request對象簡單來講就是用於接收客戶端瀏覽器提交的數據,response對象則將服務端的數據發送到客戶端瀏覽器
request對象的經常使用方法:
setAttribute(String name,Object o): 設置屬性名和屬性值
Object getAttribute();獲取屬性值
Enumeration getAttributeNames();獲取全部屬性組成的名字
void removeAttribute(String a)移除指定對象的屬性
getParameter()獲取參數 複製代碼
---------------------------------Third---------------------------------
模擬登陸案例
前端html頁面有個表單有兩個文本框,向服務端發送請求,Servlet接收處理請求,獲取請求參數。將瀏覽器傳來的數據和默認的用戶數據user:zhangsan;password:123456進行比對。若比對成功,處理操做返回前臺頁面並提示用戶登陸成功!若比對失敗,也返回前臺頁面提示用戶名或密碼錯誤!
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文件就很簡單了,實如今頁面顯示登陸成功或失敗的字樣。
注意:對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---------------------------------