WEB應用開發中的Servlet

Servlet的基礎知識與使用方法

---------------------------------First---------------------------------html

1、Servlet基礎

1.1 Servlet是什麼

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

Servlet通常是做爲控制層處理視圖層的請求操做的。java

1.2 Servlet的原理


圖1. servlet原理圖

剛纔說Servlet通常是做爲控制層處理前臺頁面的請求操做的,關於Servlet與客戶端請求之間的一個過程首先客戶端即前臺發送一個請求。Servlet調用service()方法進行響應處理。經常使用的請求方式是get和post方式,service()方法中對請求方式進行了匹配調用doget()或者doPost()等方法,而後在對應的方法中調用相關對象、方法、參數等處理業務,實現對客戶端請求的響應。自己Servlet接口是沒有doGet()、doPost()等方法的。HttpServlet中定義了這些方法。因此實際開發中咱們會經過繼承HttpServlet來建立Servlet類。web

1.3 Servlet的生命週期

Servlet的生命週期過程以下:瀏覽器

1>. Servlet容器加載階段tomcat

2>. 初始化階段 init(ServletConfig sc)bash

-->該方法僅被加載一次,用於初始化操做。app

3>. 響應服務階段 service(ServletRequest request, ServletResponse response)ide

-->每次請求都會調用該方法,該方法用於請求響應操做。工具

4>. 銷燬階段 destroy()

---------------------------------Second---------------------------------

2、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、模擬案例

模擬登陸案例

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

相關文章
相關標籤/搜索