国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > WEB開(kāi)發(fā) > 正文

servlet學(xué)習(xí)筆記(一)

2024-04-27 15:07:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

SERVLET入門(mén)(一)

參考:http://www.cnblogs.com/xdp-gacl/p/3760336.html 這個(gè)博主的知識(shí)點(diǎn)寫(xiě)的非常棒而且細(xì)致,推薦新手入門(mén)的大家直接過(guò)去充能~

一.什么是servlet

servlet是按照servlet規(guī)范編寫(xiě)的java類(lèi)。它運(yùn)行于支持java的應(yīng)用服務(wù)器中,主要用于響應(yīng)web(HTTP)方面的請(qǐng)求。

二.servlet的作用

servlet在服務(wù)器端運(yùn)行,主要用于處理客戶端的請(qǐng)求。 web服務(wù)器習(xí)慣于處理靜態(tài)頁(yè)面,對(duì)于動(dòng)態(tài)請(qǐng)求,一般交由一個(gè)幫助程序進(jìn)行處理,再將處理后的靜態(tài)頁(yè)面返回給web服務(wù)器。servlet就是這樣的幫助程序。通常由瀏覽器向web容器發(fā)送HTTP請(qǐng)求,根據(jù)web容器中的web.xml文件,決定由具體的某個(gè)servlet來(lái)對(duì)其進(jìn)行處理。

三.servlet生命周期

servlet生命周期指的是,從創(chuàng)建servlet實(shí)例后,servlet存在到銷(xiāo)毀的整個(gè)過(guò)程。 生命周期中主要有以下幾個(gè)階段: 1.實(shí)例化。servlet容器加載servlet類(lèi),并將.class 文件讀取到內(nèi)存中,由servlet容器創(chuàng)建一個(gè)servlet實(shí)例。 2.初始化。servlet容器調(diào)用init()函數(shù)完成參數(shù)的初始化。 3.運(yùn)行。當(dāng)servlet容器接收到請(qǐng)求時(shí),會(huì)根據(jù)請(qǐng)求創(chuàng)建ServletRequest和ServletResponse對(duì)象,并將其傳遞給調(diào)用的service()方法。service()方法通過(guò)request獲取請(qǐng)求的內(nèi)容,并對(duì)其進(jìn)行處理,將請(qǐng)求的結(jié)果封裝在response中。每個(gè)請(qǐng)求均在獨(dú)立的線程中運(yùn)行。 4.銷(xiāo)毀。servlet容器調(diào)用destroy()方法,銷(xiāo)毀servlet對(duì)象,并釋放它占用的資源。

在一個(gè)生命周期中,init()方法和destroy()方法都只會(huì)被調(diào)用一次。而service方法執(zhí)行的次數(shù)則取決于被客戶端訪問(wèn)的次數(shù)。

四.使用MyEclipse建立一個(gè)基礎(chǔ)的servlet

1.新建一個(gè)web-PRoject,生成的目錄如下: web-project 2.在src目錄下,新建一個(gè)servlet文件 新建servlet1 新建servlet2 新建servlet3 那么,自動(dòng)生成的servlet文件和在web.xml文件中的配置如下: AutoServlet文件:

package com.test1;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 AutoServlet extends HttpServlet { /** * Constructor of the object. */ public AutoServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here }}

對(duì)于每一個(gè)具體的程序塊的用途,MyEclipse自動(dòng)生成時(shí)都附上了詳細(xì)的注釋。 web.xml文件:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>AutoServlet</servlet-name> <servlet-class>com.test1.AutoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/servlet/AutoServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>

主要看<servlet></servlet><servlet-mapping></servlet-mapping> 這兩對(duì)標(biāo)簽中的內(nèi)容。在這里,配置了對(duì)特定servlet文件的映射關(guān)系。

注意: (1)兩個(gè)servlet-name必選相同; (2)默認(rèn)的url-pattern為:/servlet/servlet-name

接下來(lái),將這個(gè)web-project部署到tomcat上,啟動(dòng)tomcat后,就可以在網(wǎng)頁(yè)上訪問(wèn)這個(gè)servlet了。 網(wǎng)頁(yè)訪問(wèn)servlet

訪問(wèn)的地址為: http://localhost:8080/servlet-test/servlet/AutoServlet 也就是:"http://localhost:8080/" + web項(xiàng)目名稱(chēng)+web.xml中配置的url-pattern

五.其他細(xì)節(jié)

1.servlet的url映射配置

由于客戶端是根據(jù)url來(lái)訪問(wèn)web中的資源,因此,要想訪問(wèn)一個(gè)servlet,就要把它映射到一個(gè)url地址上,這個(gè)工作,在web.xml中,由<servlet></servlet><servlet-mapping></servlet-mapping> 這兩對(duì)標(biāo)簽來(lái)完成。 <servlet></servlet> 標(biāo)簽用于注冊(cè)servlet,其中,servlet-name是servlet的名稱(chēng),servlet-class中寫(xiě)servlet所在的完整類(lèi)名。 <servlet-mapping></servlet-mapping> 標(biāo)簽用于映射一個(gè)已注冊(cè)的servlet和它的對(duì)外訪問(wèn)路徑。一個(gè)注冊(cè)的servlet可以有多個(gè)訪問(wèn)路徑。 如:

<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>AutoServlet</servlet-name> <servlet-class>com.test1.AutoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/servlet/AutoServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/1.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/2.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/3.php</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/4.aspX</url-pattern> </servlet-mapping>

那么,使用地址: http://localhost:8080/servlet-test/servlet/AutoServlet http://localhost:8080/servlet-test/1.html http://localhost:8080/servlet-test/2.jsp http://localhost:8080/servlet-test/3.php http://localhost:8080/servlet-test/4.ASPX 都可以訪問(wèn)同一servlet。

此外,還可以使用*通配符來(lái)匹配映射的url地址。 使用通配符時(shí),只有兩種固定格式: 1.使用*.擴(kuò)展名 2.使用正斜杠(/)開(kāi)頭,并以/*結(jié)尾。 如: 對(duì)于上述例子中的servlet,在web.xml中配置

<servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/servlet/AutoServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/find/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>

那么,就可以使用: http://localhost:8080/servlet-test/find/aabbcc 或: http://localhost:8080/servlet-test/aabbcc.do 來(lái)訪問(wèn)上述servlet (aabbcc可以由任意字符串代替)

對(duì)于多個(gè)注冊(cè)的servlet都使用了通配符的情況,在映射過(guò)程中,遵循那個(gè)更相似,就匹配到哪一個(gè)的原則

2.<load-on-startup>標(biāo)簽

根據(jù)上面的知識(shí)點(diǎn),可以知道,在處理客戶端的servlet請(qǐng)求時(shí),首先需要有一個(gè)servlet實(shí)例。對(duì)于多次請(qǐng)求,僅創(chuàng)建一個(gè)實(shí)例,調(diào)用一次init()方法。每次請(qǐng)求過(guò)程中,servlet引擎將創(chuàng)建新的HttpServletRequest請(qǐng)求對(duì)象和HttpServletResponse響應(yīng)對(duì)象,并將其作為參數(shù)傳遞給service(),service()再根據(jù)請(qǐng)求的內(nèi)容,調(diào)用響應(yīng)的doXXX方法,對(duì)請(qǐng)求進(jìn)行處理。 在web.xml中配置<load-on-startup>,那么,在web應(yīng)用啟動(dòng)時(shí),就會(huì)裝載并實(shí)例化servlet,并調(diào)用實(shí)例對(duì)象的init()方法。

<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>AutoServlet</servlet-name> <servlet-class>com.test1.AutoServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

標(biāo)簽中的數(shù)字,用于標(biāo)記容器是否在啟動(dòng)時(shí)就加載這個(gè)servlet,以及加載的優(yōu)先級(jí)。 當(dāng)數(shù)字為負(fù)數(shù)或是無(wú)指定值時(shí),容器只在該servlet被選擇是才對(duì)它進(jìn)行加載。 當(dāng)數(shù)字為非負(fù)數(shù)是,表示容器在啟動(dòng)時(shí)就加載這個(gè)servlet。數(shù)字越小,啟動(dòng)這個(gè)servlet的優(yōu)先級(jí)越高(如:0的優(yōu)先級(jí)大于1)

3.缺省的servlet

當(dāng)一個(gè)servlet的訪問(wèn)路徑(url-pattern)配置為一個(gè)正斜杠(/)時(shí),這個(gè)servlet就稱(chēng)為web容器的缺省servlet。 即,凡是找不到對(duì)應(yīng)的<servlet-mapping></servlet-mapping>的url請(qǐng)求,都將訪問(wèn)該缺省servlet。

4.servlet線程安全

當(dāng)多個(gè)客戶端并發(fā)訪問(wèn)一個(gè)servlet時(shí),web服務(wù)器就會(huì)為每一個(gè)訪問(wèn)創(chuàng)建一個(gè)線程,每個(gè)線程分別調(diào)用servlet實(shí)例的service()方法。如果多個(gè)service()方法同時(shí)訪問(wèn)同一個(gè)資源,就會(huì)導(dǎo)致線程安全問(wèn)題。 線程安全問(wèn)題只存在多個(gè)線程并發(fā)操作同一個(gè)資源的情況下,所以在編寫(xiě)Servlet的時(shí)候,如果并發(fā)訪問(wèn)某一個(gè)資源(變量,集合等),就會(huì)存在線程安全問(wèn)題。 就之前學(xué)過(guò)的java基礎(chǔ)部分的知識(shí)點(diǎn)而言,可以使用線程鎖synchronized來(lái)解決線程問(wèn)題.即,將可能產(chǎn)生線程安全問(wèn)題的程序塊寫(xiě)在

synchronized(this) { ....}

中。當(dāng)有線程訪問(wèn)該資源時(shí),它就拿到了這把鎖。那么,如果有并發(fā)的線程同時(shí)訪問(wèn)該資源,就必須等待上一個(gè)線程訪問(wèn)完畢,將鎖釋放出來(lái)。 但是,在實(shí)際的應(yīng)用中,使用servlet時(shí),不可以使用該方式。針對(duì)線程安全問(wèn)題,在servlet2.4之前,采用的方法是,讓servlet繼承Sun公司提供的標(biāo)記接口:SingleThreadModel,這樣,這個(gè)servlet無(wú)論何時(shí),都將單線程運(yùn)行。 需要注意的是,這種方法的實(shí)質(zhì)是產(chǎn)生多個(gè)Servlet實(shí)例對(duì)象,每個(gè)并發(fā)的線程分別對(duì)應(yīng)一個(gè)實(shí)例對(duì)象。因此,這種方法并沒(méi)有真正解決多并發(fā)的線程安全性問(wèn)題,在servlet2.4以后,已被標(biāo)記為deprecated(過(guò)時(shí))


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 友谊县| 新泰市| 兴国县| 宁明县| 齐河县| 赣榆县| 长宁区| 东台市| 漳浦县| 临清市| 泰顺县| 汶上县| 武安市| 阿图什市| 长葛市| 平乐县| 罗田县| 宜黄县| 林西县| 容城县| 鹤山市| 甘肃省| 新乡市| 施甸县| 友谊县| 莲花县| 平遥县| 繁峙县| 剑川县| 塔城市| 长泰县| 枞阳县| 杭州市| 灵台县| 尼玛县| 荣成市| 兴安县| 六枝特区| 沛县| 江西省| 合川市|