1.Servlet是JSP的底層實(shí)現(xiàn),而且JSP也是通過轉(zhuǎn)譯成Servlet后才能執(zhí)行的。
2.Servlet其實(shí)就是一個(gè)Java類,所以其創(chuàng)建方法和創(chuàng)建Java類完全相同(但注意:它沒有main()方法),所有的Servlet類都必須繼承HttpServlet類。HttpServlet接口包含很多方法,除了init()和destroy()方法用來處理Servlet初始化和銷毀。還包括一些常用方法,如doGet方法、doPost以及Service方法。
3.Servlet的生命周期
Servlet也是一個(gè)普通的Java類,所以其一樣具有生命周期。Servlet從生成到銷毀必須進(jìn)過如下幾個(gè)步驟。
(1)生成Servlet,加載到Servlet Engine(Web容器)中,并通過調(diào)用其init()方法來進(jìn)行初始化。
(2)通過提供的響應(yīng)方法來處理客戶端的請(qǐng)求。
(3)調(diào)用destroy()方法進(jìn)行銷毀,并通過垃圾收集器進(jìn)行收集清理。
————————————————————————————————————————
————————————————————————————————————————
doGet方法:doGet方法用來處理客戶端瀏覽器直接訪問和表單get方式提交的表單。
實(shí)例如下(本頁(yè)面是JSP頁(yè)面,雖然還沒有學(xué)到JSP,但我覺得在用Servlet時(shí)用JSP已經(jīng)不是什么
難題,況且下面這個(gè)JSP是很簡(jiǎn)單的):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,接下來相對(duì)應(yīng)的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)在我來解釋一下上面代碼的意思:
第一個(gè)JSP文件是用于客戶端向服務(wù)端提交表單的文件,這個(gè)JSP文件很簡(jiǎn)單,和一個(gè)HTML文件大同小異,我們雖然還沒有學(xué)到JSP,但對(duì)如此簡(jiǎn)單的JSP應(yīng)該還是會(huì)寫的,本文件相對(duì)于一個(gè)HTML文件來講只有第一行是新東西,第一行一看就知道是什么意思,它無(wú)非就是一個(gè)JSP的腳本指令,此腳本指令定義了本腳本的使用語(yǔ)言為java,腳本的編碼類型及規(guī)范為text/html和GB2312,OK!到此為止其余的諸如表單一類的東西都是已經(jīng)接觸過的了,不用再多費(fèi)口舌。
第二個(gè)文件是一個(gè)Servlet類,這幾天都在學(xué)這個(gè)東西,應(yīng)該對(duì)他不會(huì)陌生,它用來處理客戶端動(dòng)態(tài)頁(yè)面請(qǐng)求,因?yàn)榭蛻舳颂峤坏恼?qǐng)求是DoGetDemo,所以服務(wù)端必須要有此Servlet才能做出正確響應(yīng),否則客戶端將拋出404錯(cuò)誤,好了,接下來因?yàn)榭蛻舳耸且詆et方式提交表單,所以服務(wù)端需要用doGet方法來處理這類請(qǐng)求信息,至于處理的過程及結(jié)果大家都能看懂,我就不多說了。
另外說明一下,doGet方法只能用來處理get方式提交上來的表單,不能處理post方式提交的表單。
————————————————————————————————————————————
————————————————————————————————————————————
doPost方法是用來處理表單post方式提交的表單,不能處理客戶端瀏覽器直接訪問。
實(shí)例如下: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>
接下來,相對(duì)應(yīng)的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>");
}
}
解釋一下上面代碼的意思:
實(shí)例代碼DOPOSTDEMO.JAVA的主體代碼與前面的doGet方法的主體代碼相似,只是將代碼寫在了doPost中,doPost方法能處理Post方式提交的表單,但無(wú)法處理瀏覽器的直接訪問。實(shí)際上,我這樣寫的目的就是想說不論是doGet方法還是doPost方法都能處理各自的提交方式,但兩個(gè)方法之間對(duì)同一種請(qǐng)求的處理則是不允許混用。如果要想用一種方法來同時(shí)處理客戶端的get及post請(qǐng)求請(qǐng)關(guān)注下周博文中的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>
相對(duì)應(yīng)的Servlet寫法(因?yàn)槠鶈栴},我省略了包導(dǎo)入語(yǔ)句):
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>");
}
}
其實(shí),這個(gè)service方法的用法與前面的doGet與doPost方法的用法完全一樣,它實(shí)現(xiàn)了對(duì)這兩種提交方式的處理,只要在代碼中實(shí)現(xiàn)了這個(gè)方法,具體的調(diào)用過程由Web容器去處理。
需要說明的是現(xiàn)在很多人都不這樣寫,而是直接寫兩個(gè)方法,即:doGet與doPost,在其中任意一個(gè)方法中調(diào)用上一種方法來完成對(duì)兩種提交方式的處理,這種做法除了增加代碼的可讀性之外其余我還沒有看到有什么優(yōu)點(diǎn)可言。