WEB應用開發中的Servlet

niaonao發表於2017-11-06

Servlet的基礎知識與使用方法

---------------------------------First---------------------------------

一、Servlet基礎

1.1 Servlet是什麼

Servlet是一種基本元件規範,和JSP,Filter,Tag,Listener等同樣是屬於Java Web的基本元件。

Servlet一般是作為控制層處理檢視層的請求操作的。

1.2 Servlet的原理


圖1. 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 {
      }
}  複製程式碼

    可以直接在doGet(),doPost方法中寫對請求的處理操作。

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

相關文章