1. 程式人生 > >Servlet(二)

Servlet(二)

Servlet 如何獲取瀏覽器提交的引數

通過登入行為,演示servlet如何獲取從瀏覽器提交的賬號密碼

在web中建立login.html

<!DOCTYPE html>     //宣告文件的解析型別為標準型別,頁面在所有的瀏覽器裡顯示的就都是一個樣子了

<html>

<head>

<meta charset="UTF-8">

<title>登入頁面</title>

</head>

<body>

新增一個form元素action="login" 標題會提交到login路徑,會對映到LoginServlet,post表示提交的資訊在位址列看不到

<form action="login" method="post">   

準備賬號和密碼的input元素 因為要提交兩個資料,在servlet端為了區分哪個是賬號,哪個是密碼,要給這兩個input元素的name屬性分別叫做name和password。

賬號: <input type="text" name="name"> <br>

密碼: <input type="password" name="password"> <br>

<input type="submit" value

="登入">

</form>

</body>

</html>

建立 LoginServlet

建立一個LoginServlet 因為瀏覽器中的form的method是post,所以LoginServlet需要提供一個doPost方法 在doPost方法中,通過request.getParameter 根據name取出對應的賬號和密碼 然後用System.out.println() 列印在控制檯(不是網頁)

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 loginServlet extends HttpServlet{
	protected void doPost(HttpServletRequest request,HttpServletResponse response) 
			throws ServletException, IOException{ 
		String name = request.getParameter("name");
		String password = request.getParameter("pasword");
	
		System.out.println("name:"+name);
		System.out.println("password:"+password);
	}
}

對映LoginServlet到路徑login

在web.xml中新增對映

<servlet>

<servlet-name>LoginServlet</servlet-name>

<servlet-class>LoginServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>LoginServlet</servlet-name>

<url-pattern>/login</url-pattern>

</servlet-mapping>   

判斷賬號密碼是否為 admin 123,如果是就列印 success 否則就列印 fail 根據賬號密碼,建立對應的html字串。 然後通過response.getWriter().println() 傳送到瀏覽器。 注: 比較的時候把常量字串"admin" "123"放前面,因為使用者可能沒有輸入賬號密碼就提交,servlet會獲取到null。 這樣就規避了空指標異常的問題。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        String name = request.getParameter("name");
        String password = request.getParameter("password");
  
        String html = null;
  
        if ("admin".equals(name) && "123".equals(password))
            html = "<div style='color:green'>success</div>";
        else
            html = "<div style='color:red'>fail</div>";
  
        PrintWriter pw = response.getWriter();
        pw.println(html);
  
    }
  
}

二、ServletConfig講解

流程圖

首先訪問

http://127.0.0.1/login.html

開啟一個靜態的html頁面,在這個頁面中可以通過form,以post的形式提交資料  

在上一步的login.html中,用form,把賬號和密碼,提交到/login這個路徑,並且附帶method="post"

tomcat接受到一個新的請求:

http://127.0.0.1/login

其路徑是/login,接著就到配置檔案web.xml進行匹配,發現/login,對應的Servlet類是 LoginServlet。 接下來的工作,就會基於這個LoginServlet進行。

找到對應的Servlet

例項化Servlet物件

  Tomcat定位到了LoginServlet後,發現並沒有LoginServlet的例項存在,於是就呼叫LoginServlet的public無參的構造方法LoginServlet()例項化一個LoginServlet物件以備後續使用  

呼叫doGet或者doPost

    Tomcat從上一步拿到了LoginServlet的例項之後,根據頁面login.html提交資訊的時候帶的method="post",去呼叫對應的doPost方法。

request獲取引數

         在這個方法中,通過引數request,把頁面上傳遞來的賬號和密碼資訊取出來

String name = request.getParameter("name");

String password = request.getParameter("password");

response設定響應

接著,根據賬號和密碼是否正確(判斷是否是admin和123), 建立不同的html字串。 然後把html字串通過如下方式,設定在了response物件上。

PrintWriter pw = response.getWriter();

pw.println(html);

到這裡,Servlet的工作就做完了。

tomcat把html傳遞給瀏覽器

在Servlet完成工作之後,tomcat拿到被Servlet修改過的response,根據這個response生成html 字串,然後再通過HTTP協議,這個html字串,回發給瀏覽器,瀏覽器再根據HTTP協議獲取這個html字串,並渲染在介面上。 這樣在效果上,瀏覽器就可以看到Servlet中生成的字串了。

Servlet 需要提供對應的doGet() 與 doPost()方法

當瀏覽器使用get方式提交資料的時候,servlet需要提供doGet()方法 哪些是get方式呢? form預設的提交方式 如果通過一個超鏈訪問某個地址 如果在位址列直接輸入某個地址 ajax指定使用get方式的時候

當瀏覽器使用post方式提交資料的時候,servlet需要提供doPost()方法 哪些是post方式呢? 在form上顯示設定 method="post"的時候 ajax指定post方式的時候

LoginServlet繼承了HttpServlet,同時也繼承了一個方法

service(HttpServletRequest , HttpServletResponse )

實際上,在執行doGet()或者doPost()之前,都會先執行service() 由service()方法進行判斷,到底該呼叫doGet()還是doPost() 可以發現,service(), doGet(), doPost() 三種方式的引數列表都是一樣的。 所以,有時候也會直接重寫service()方法,在其中提供相應的服務,就不用區分到底是get還是post了。 比如把前面的登入的LoginServlet,改為提供service方法,也可以達到相同的效果

獲取中文的引數

為了成功獲取中文引數,需要做如下操作 1. login.html中加上

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

這句話的目的是告訴瀏覽器,等下發訊息給伺服器的時候,使用UTF-8編碼 2. login.html form的method修改為post

3.servlet進行處理

request.setCharacterEncoding("UTF-8");

並且把這句話放在request.getParameter()之前

返回中文的響應

在Servlet中,加上

response.setContentType("text/html; charset=UTF-8");

生命週期

一個Servlet的生命週期由 例項化初始化提供服務銷燬被回收 幾個步驟組成

生命週期

例項化

只有一次

配置Servlet初始化引數

  在Servlet的配置檔案web.xml中,可以使用一個或多個<init-param>標籤為servlet配置一些初始化引數。

無論訪問了多少次LoginSerlvet init初始化 只會執行一次

例如:

<servlet>         <servlet-name>HelloServlet</servlet-name>         <servlet-class>HelloServlet</servlet-class>      <!--配置初始化引數 -->     <init-param>         <param-name>name</param-name>         <param-value>cxy</param-value>     </init-param>      <init-param>         <param-name>password</param-name>         <param-value>123</param-value>     </init-param>     <init-param>         <param-name>charset</param-name>         <param-value>UTF-8</param-value>     </init-param>          </servlet>

提供服務

銷燬

destroy() 在如下幾種情況下,會呼叫destroy() 1. 該Servlet所在的web應用重新啟動 在serverl.xml中配置該web應用的時候用到了

<Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />

如果把 reloadable="false" 改為reloadable="true" 就表示有任何類發生的更新,web應用會自動重啟 當web應用自動重啟的時候,destroy()方法就會被呼叫

2. 關閉tomcat的時候 destroy()方法會被呼叫,但是這個一般都發生的很快,不易被發現

被回收

當該Servlet被銷燬後,就滿足垃圾回收的條件了。 當下一次垃圾回收GC來臨的時候,就有可能被回收。

這個。。。也是不容易被觀察到的現象。