【java項(xiàng)目實(shí)戰(zhàn)】Servlet詳解以及Servlet編寫(xiě)登陸頁(yè)面(二)

Servlet是Sun公司提供的一門(mén)用于開(kāi)發(fā)動(dòng)態(tài)web網(wǎng)頁(yè)的技術(shù)。Sun公司在API中提供了一個(gè)servlet接口,我們?nèi)绻胧褂胘ava程序開(kāi)發(fā)一個(gè)動(dòng)態(tài)的web網(wǎng)頁(yè),只需要實(shí)現(xiàn)servelet接口,并把類(lèi)部署到web服務(wù)器上就可以運(yùn)行了。
到底什么是Servlet呢?
? ? ? ?通俗一點(diǎn),只要是實(shí)現(xiàn)了servlet接口的java程序,均稱(chēng)Servlet。Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小應(yīng)用程序),Servlet是在服務(wù)器端運(yùn)行的小程序。
編寫(xiě)一個(gè)現(xiàn)實(shí)登陸的Servlet,并部署訪問(wèn)
1、我們先寫(xiě)一個(gè)簡(jiǎn)單的HTML,可以在WebRoot新建,也可以復(fù)制一個(gè)寫(xiě)好的HTML,我們用post提交方式,當(dāng)然也可以用get提交,大家可以自己嘗試一下。
2、完成Servlet,在Web項(xiàng)目的src中右鍵新建一個(gè)類(lèi)LoginServlet,輸入下面代碼即可。
//引入所需要的包
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
?
public class LoginServlet extends HttpServlet {
//重寫(xiě)doGet方法
public void doGet(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response)
? ? ?throws ServletException,
? ? ? ? ? ? IOException {
String username = request.getParameter("username");? ?
String password = request.getParameter("password");? ? ??
//服務(wù)器端打印信息
//System.out.println("username=" + username);
//System.out.println("password=" + password);
//設(shè)置編碼格式
response.setContentType("text/html;charset=GB18030");
//返回html頁(yè)面
response.getWriter().println("");
response.getWriter().println("
");response.getWriter().println("
response.getWriter().println("");
response.getWriter().println("
");response.getWriter().println("歡迎【" + username + "】用戶(hù)登錄成功?。?!");
response.getWriter().println("");
response.getWriter().println("");
}? ? ? ? ? ? ? ? ?
//重寫(xiě)doPost方法
public void doPost(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response)
? ? throws ServletException,
? ? ? ? ? ? IOException {
doGet(request, response);? ? ? ? ? ? ? ?
}? ? ?
}
3、在WebRoot下的WEB-INF的web.xml,部署我們的Servlet,啟動(dòng)服務(wù)器。
xmlns="http://java.sun.com/xml/ns/j2ee"? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee? http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
4、一定要啟動(dòng)服務(wù)器,之后在瀏覽器中輸入你的URL,此時(shí)我們就可以調(diào)用Servlet了。
? ? ? ? ? ? ?
==============================================================================================================================
?如果不知道怎么配置java Web項(xiàng)目,可以移駕到我的上篇(一步步教你使用MyEclipse搭建java Web項(xiàng)目開(kāi)發(fā)環(huán)境(一)),下面我們?cè)敿?xì)介紹Servlet的基礎(chǔ)知識(shí)。
==============================================================================================================================
Servlet基礎(chǔ)
1、解讀API文檔,純手工編寫(xiě)一個(gè)Servlet程序,并部署訪問(wèn)(如上所示)。
? ? ? ? ?
? ? ? 解讀API對(duì)于拒絕學(xué)習(xí)API的程序員們是一種煎熬,但它卻是我們學(xué)習(xí)和進(jìn)步的最好工具,且學(xué)且珍惜。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?大家可以在點(diǎn)進(jìn)去看一看,從上圖,可以看出Servlet接口定義三個(gè)實(shí)現(xiàn)類(lèi),分別是FacesServlet, GenericServlet, HttpServlet。下面我們簡(jiǎn)單的介紹一下。
2、Servlet接口實(shí)現(xiàn)類(lèi)
? ? ?
? ? ?(1)FacesServlet是一個(gè)用于管理利用JSF(JavaServer Faces)構(gòu)建用戶(hù)界面的web應(yīng)用程序請(qǐng)求處理生命周期的Servlet。(FacesServletis a servlet that manages the request processing lifecycle for web applications that are utilizing JavaServer Faces to construct the user interface.),大家如果想深入的學(xué)習(xí),可以點(diǎn)這里。
? ? ?(2)GenericServlet是HttpServlet的父類(lèi),包含了servlet的常用方法。GenericServlet使得程序員寫(xiě)servlets更加簡(jiǎn)單,它提供了初始化和銷(xiāo)毀生命周期的方法,以及實(shí)現(xiàn)了寫(xiě)日志文件的方法。
? ? ?(3)HttpServlet指能夠處理HTTP請(qǐng)求的servlet。這是開(kāi)發(fā)人員在編寫(xiě)Servlet時(shí),通常應(yīng)繼承這個(gè)類(lèi)即可。
? ? ??
? ? ? ? 對(duì)于這三個(gè)實(shí)現(xiàn)類(lèi),只為大家做一個(gè)簡(jiǎn)單的介紹,如果想深入的研究,直接看API就好。
3、Servlet部署
? ? ? ?
? ? ? ?客戶(hù)端通過(guò)URL地址訪問(wèn)web服務(wù)器中的資源,所以若想訪問(wèn)Servlet必須要把servlet程序映射到一個(gè)URL地址上,在web.xml文件中使用
? ? ? ? *
? ? ? ? *
? ? ? ? 在servlet映射到URL有兩種格式:
? ? ? ? 1.“*.擴(kuò)展名”
? ? ? ? 2.以正斜杠(/)開(kāi)頭并以“/*”結(jié)尾。
? ? ? ? servlet對(duì)url的匹配規(guī)則以及路徑問(wèn)題,大家可以上網(wǎng)查,有很多相關(guān)的資料,例如:http://blog.csdn.net/xh16319/article/details/8014107
? ? ? ? ? ? ?
4、Web服務(wù)器調(diào)用Servlet過(guò)程(Servlet生命周期)
? ? ?
? ? ? servlet程序是由web服務(wù)器調(diào)用,web服務(wù)器實(shí)現(xiàn)了對(duì)servlet生命周期的管理。servlet的生命周期分為四步:
? ? ? ? ? 1)實(shí)例化以及加載servlet,new的過(guò)程。
? ? ? ? ? 2)初始化init(ServletConfig)。
? ? ? ? ? 3)處理請(qǐng)求,調(diào)用servlet的service,doget,dopost方法將Request和Response,作為參數(shù)傳遞。
? ? ? ? ? 4)退出服務(wù),調(diào)用destory方法釋放資源。
? ? ? ? ??
?注意:
? ? ? ? ?1、servlet只實(shí)例化一次。感覺(jué)有點(diǎn)單例模式的意思,大家可以研究一下Tomcat的實(shí)現(xiàn)原理。
? ? ? ? ?2、init方法也只執(zhí)行一次。servlet實(shí)例只創(chuàng)建一次,所以init初始化只調(diào)用一次。
5、Servlet線程安全問(wèn)題
? ? ? ?當(dāng)多個(gè)客戶(hù)端并發(fā)訪問(wèn)同一個(gè)Servlet時(shí),web服務(wù)器會(huì)為每一個(gè)客戶(hù)端的訪問(wèn)請(qǐng)求創(chuàng)建一個(gè)線程,并在這個(gè)線程上調(diào)用service方法,因此,service方法內(nèi)如果訪問(wèn)了同一個(gè)資源的話(huà),就有可能引發(fā)線程安全問(wèn)題。大家重點(diǎn)理解下面兩句即可:
(1) Servlet是單實(shí)例多線程的,如果存在可以修改的成員變量將會(huì)出現(xiàn)線程安全問(wèn)題。
(2) 使用Servlet最好保證Servlet是無(wú)狀態(tài)的,也就是沒(méi)有可以修改的成員變量。
? ? ? ?這篇博文只是介紹了Servlet基礎(chǔ)知識(shí),大家還有什么疑問(wèn)可以給我留言,我會(huì)及時(shí)給大家解決。
=============================================================================================================================
? ? ? ? 下篇,我們做一個(gè)JDBC連接Oracle數(shù)據(jù)庫(kù)的實(shí)例!
————————————————

