Servlet(二)
Servlet 如何獲取瀏覽器提交的引數
通過登入行為,演示servlet如何獲取從瀏覽器提交的賬號密碼
在web中建立login.html
新增一個form元素action="login" 標題會提交到login路徑,會對映到LoginServlet,post表示提交的資訊在位址列看不到
準備賬號和密碼的input元素 因為要提交兩個資料,在servlet端為了區分哪個是賬號,哪個是密碼,要給這兩個input元素的name屬性分別叫做name和password。
= "登入" >
|
建立 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物件
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來臨的時候,就有可能被回收。
這個。。。也是不容易被觀察到的現象。