1.Servlet是JSP的底層實現(xiàn),而且JSP也是通過轉譯成Servlet后才能執(zhí)行的。
2.Servlet其實就是一個Java類,所以其創(chuàng)建方法和創(chuàng)建Java類完全相同(但注意:它沒有main()方法),所有的Servlet類都必須繼承HttpServlet類。HttpServlet接口包含很多方法,除了init()和destroy()方法用來處理Servlet初始化和銷毀。還包括一些常用方法,如doGet方法、doPost以及Service方法。
3.Servlet的生命周期
Servlet也是一個普通的Java類,所以其一樣具有生命周期。Servlet從生成到銷毀必須進過如下幾個步驟。
(1)生成Servlet,加載到Servlet Engine(Web容器)中,并通過調(diào)用其init()方法來進行初始化。
(2)通過提供的響應方法來處理客戶端的請求。
(3)調(diào)用destroy()方法進行銷毀,并通過垃圾收集器進行收集清理。
————————————————————————————————————————
————————————————————————————————————————
doGet方法:doGet方法用來處理客戶端瀏覽器直接訪問和表單get方式提交的表單。
實例如下(本頁面是JSP頁面,雖然還沒有學到JSP,但我覺得在用Servlet時用JSP已經(jīng)不是什么
難題,況且下面這個JSP是很簡單的):USERFORM.JSP
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>用戶表單</title>
</head>
<body>
<form action="DoGetDemo" method="get">
用戶名:<input type="text" name="username"/><br>
密碼:<input type="password" name="password"/><br>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
OK,接下來相對應的Servlet代碼如下:
package com.javaweb.ch10;
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 DoGetDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("gb2312");
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("<html>");
out.println("<body>");
out.println("用戶名:" + username + "<br>");
out.println("密碼:" + password);
out.println("</body>");
out.println("</html>");
}
}
好了,現(xiàn)在我來解釋一下上面代碼的意思:
第一個JSP文件是用于客戶端向服務端提交表單的文件,這個JSP文件很簡單,和一個HTML文件大同小異,我們雖然還沒有學到JSP,但對如此簡單的JSP應該還是會寫的,本文件相對于一個HTML文件來講只有第一行是新東西,第一行一看就知道是什么意思,它無非就是一個JSP的腳本指令,此腳本指令定義了本腳本的使用語言為java,腳本的編碼類型及規(guī)范為text/html和GB2312,OK!到此為止其余的諸如表單一類的東西都是已經(jīng)接觸過的了,不用再多費口舌。
第二個文件是一個Servlet類,這幾天都在學這個東西,應該對他不會陌生,它用來處理客戶端動態(tài)頁面請求,因為客戶端提交的請求是DoGetDemo,所以服務端必須要有此Servlet才能做出正確響應,否則客戶端將拋出404錯誤,好了,接下來因為客戶端是以get方式提交表單,所以服務端需要用doGet方法來處理這類請求信息,至于處理的過程及結果大家都能看懂,我就不多說了。
另外說明一下,doGet方法只能用來處理get方式提交上來的表單,不能處理post方式提交的表單。
————————————————————————————————————————————
————————————————————————————————————————————
doPost方法是用來處理表單post方式提交的表單,不能處理客戶端瀏覽器直接訪問。
實例如下:USERFORM2.JSP
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>用戶表單</title>
</head>
<body>
<form action="DoPostDemo" method="post">
用戶名:<input type="text" name="username"/><br>
密碼:<input type="password" name="password"/><br>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
接下來,相對應的Servlet代碼如下(DOPOSTDEMO.JAVA)
package com.javaweb.ch10;
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 DoPostDemo extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("gb2312");
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("<html>");
out.println("<body>");
out.println("用戶名:" + username + "<br>");
out.println("密碼:" + password);
out.println("</body>");
out.println("</html>");
}
}
解釋一下上面代碼的意思:
實例代碼DOPOSTDEMO.JAVA的主體代碼與前面的doGet方法的主體代碼相似,只是將代碼寫在了doPost中,doPost方法能處理Post方式提交的表單,但無法處理瀏覽器的直接訪問。實際上,我這樣寫的目的就是想說不論是doGet方法還是doPost方法都能處理各自的提交方式,但兩個方法之間對同一種請求的處理則是不允許混用。如果要想用一種方法來同時處理客戶端的get及post請求請關注下周博文中的service方法。
————————————————————————————————————
————————————————————————————————————
service方法用來處理客戶端瀏覽器直接訪問和表單以get方式提交以及表單以post方式提交的情況。
首先說表單的寫法(這里說的是常規(guī)寫法):
<form action="ServiceDemo" method="post">
用戶名:<input type="text" name="username"/><br>
密碼:<input type="password" name="password"/><br>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
相對應的Servlet寫法(因為篇幅問題,我省略了包導入語句):
public class ServiceDemo extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("gb2312");
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("<html>");
out.println("<body>");
out.println("用戶名:" + username + "<br>");
out.println("密碼:" + password);
out.println("</body>");
out.println("</html>");
}
}
其實,這個service方法的用法與前面的doGet與doPost方法的用法完全一樣,它實現(xiàn)了對這兩種提交方式的處理,只要在代碼中實現(xiàn)了這個方法,具體的調(diào)用過程由Web容器去處理。
需要說明的是現(xiàn)在很多人都不這樣寫,而是直接寫兩個方法,即:doGet與doPost,在其中任意一個方法中調(diào)用上一種方法來完成對兩種提交方式的處理,這種做法除了增加代碼的可讀性之外其余我還沒有看到有什么優(yōu)點可言。