生活随笔
收集整理的這篇文章主要介紹了
动态资源Servlet接口
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.Servlet接口的作用
Servlet是運(yùn)行在Web服務(wù)器上的應(yīng)用程序。Servlet本身是一個(gè)Java接口,它定義了瀏覽器訪問(wèn)服務(wù)器程序的規(guī)則,我們寫服務(wù)器程序只需要按照需求復(fù)寫Servlet方法即可
2.Servlet的體系結(jié)構(gòu)
<1>直接繼承實(shí)現(xiàn)類結(jié)構(gòu)
<2>其他相關(guān)類視圖
<1>實(shí)現(xiàn)Servlet接口
重寫Servlet生命周期的所有方法
public class ServletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig
) throws ServletException {System.out
.println("init初始化執(zhí)行1次");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest
, ServletResponse servletResponse
) throws ServletException, IOException {System.out
.println("servlet實(shí)現(xiàn)響應(yīng)");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out
.println("銷毀servlet執(zhí)行1次");}
}
<2>繼承GenericServlet抽象類
每次寫一個(gè)Servlet都要復(fù)寫生命周期的所有方法,比較麻煩。 Servlet提供了一個(gè)實(shí)現(xiàn)類GenericServlet,它把其他方法已經(jīng)復(fù)寫了,我們繼承GenericServlet只需要復(fù)寫service就可以了
public class ServletDemo2 extends GenericServlet {
@Overridepublic void service(ServletRequest servletRequest
, ServletResponse servletResponse
) throws ServletException, IOException {System.out
.println("GenericServlet實(shí)現(xiàn)響應(yīng)");}
}
<3>繼承GenericServlet抽象類【最簡(jiǎn)便也最常用】
如果每次都是繼承GenericServlet類,在servlce方法中,不能區(qū)分直接是Get請(qǐng)求還是Post請(qǐng)求。需要我們自己求請(qǐng)求方法進(jìn)行處理,也比較麻煩,所以又提供了一個(gè)子類HttpServlet類。
HttpServlet類中會(huì)根據(jù)不同的請(qǐng)求方式,提供不同的方法,我們只需要復(fù)寫對(duì)應(yīng)的方法即可
public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException, IOException {System.out
.println("HttpServlet實(shí)現(xiàn)響應(yīng)");}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException, IOException {doGet(req
,resp
);}
}
3.Servlet的映射配置
<1>針對(duì)上面三種Servlet具體類進(jìn)行配置
注意:每一個(gè)Servlet都需要有一個(gè)下面的配置,否則會(huì)找不到資源
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>/html/index.html
</welcome-file></welcome-file-list><servlet><servlet-name>ServletDemo1
</servlet-name><servlet-class>com.itheima.servlet.ServletDemo1
</servlet-class></servlet><servlet><servlet-name>ServletDemo2
</servlet-name><servlet-class>com.itheima.servlet.ServletDemo2
</servlet-class></servlet><servlet><servlet-name>ServletDemo3
</servlet-name><servlet-class>com.itheima.servlet.ServletDemo3
</servlet-class></servlet><servlet-mapping><servlet-name>ServletDemo1
</servlet-name><url-pattern>/Servlet
</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo2
</servlet-name><url-pattern>/GenericServlet
</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo3
</servlet-name><url-pattern>/HttpServlet
</url-pattern></servlet-mapping>
</web-app>
<2>同一個(gè)Servlet多映射處理
針對(duì)用戶種類對(duì)進(jìn)行多種映射配置
<servlet-mapping><servlet-name>ServletDemo5
</servlet-name><url-pattern>/ServletDemo5
</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo5
</servlet-name><url-pattern>/ServletDemo5/*
</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo5
</servlet-name><url-pattern>*.do
</url-pattern></servlet-mapping>
【注:優(yōu)先級(jí)問(wèn)題。越是具體的優(yōu)先級(jí)越高,越是模糊通用的優(yōu)先級(jí)越低。第一種->第二種->第三種–>】
<3>從瀏覽器地址欄,到訪問(wèn)Servlet的過(guò)程
Servlet是Web項(xiàng)目中的動(dòng)態(tài)資源(Servlet字節(jié)碼),訪問(wèn)過(guò)程如下
第一步:通過(guò)瀏覽器的ip地址找服務(wù)端主機(jī)
第二步:通過(guò)8080端口號(hào)找到tomcat服務(wù)器軟件
第三步:通過(guò)虛擬機(jī)路徑找到tomcat服務(wù)器上發(fā)布的web項(xiàng)目包
第四步:通過(guò)web.xml中 <url-pattern>找到Servlet對(duì)應(yīng)的字節(jié)碼
第五步:Tomcat會(huì)根據(jù)Servlet的字節(jié)碼,自動(dòng)的執(zhí)行servcie方法
4.Servlet的加載時(shí)機(jī)
<servlet><servlet-name>ServletDemo1
</servlet-name><servlet-class>com.itheima.servlet.ServletDemo1
</servlet-class><load-on-startup>1
</load-on-startup> </servlet>
<1>第一次訪問(wèn)的時(shí)候被創(chuàng)建
優(yōu)勢(shì):減少對(duì)服務(wù)器內(nèi)存的浪費(fèi)。提高了服務(wù)器啟動(dòng)的效率。
弊端︰如果有一些要在應(yīng)用加載時(shí)就做的初始化操作,無(wú)法完成。
<2>服務(wù)器加載時(shí)創(chuàng)建
優(yōu)勢(shì)∶提前創(chuàng)建好對(duì)象,提高了首次執(zhí)行的效率。可 以完成一些應(yīng)用加載時(shí)要做的初始化操作
弊端∶對(duì)服務(wù)器內(nèi)存占用較多,影響了服務(wù)器啟動(dòng)的效率
5.Servlet的線程安全問(wèn)題
<1>問(wèn)題出現(xiàn):一個(gè)瀏覽器代表一個(gè)線程,多個(gè)瀏覽器代表多個(gè)線程。按理說(shuō)我們期望的應(yīng)該是每個(gè)瀏覽器查看的都應(yīng)該是自己的用戶名。而現(xiàn)在的結(jié)果是瀏覽器中數(shù)據(jù)混亂。因此,我們可以認(rèn)為Servlet是線程不安全的!
<2>分析:多線程使用同一個(gè)共享數(shù)據(jù)
<3>解決:定義類成員要謹(jǐn)慎。如果是共用的,并且只會(huì)在初始化時(shí)賦值,其他時(shí)間都是獲取的話,那么是沒(méi)問(wèn)題的。如果不是共用的,或者每次使用都有可能對(duì)其賦值,那就要考慮線程安全問(wèn)題了,可以將其定義到doGet 或 doPost方法內(nèi)或者使用同步功能即可。
a.同步代碼塊
b…將可能需要重新賦值的值定義在自己的方法體內(nèi)[推薦]
<4>代碼實(shí)現(xiàn)
public class ServletDemo4 extends HttpServlet {private String username
;@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException, IOException {synchronized (this){username
= req
.getParameter("username");try {Thread.sleep(3000);} catch (Exception e
) {e
.printStackTrace();}PrintWriter pw
= resp
.getWriter();pw
.println("welcome:" + username
);pw
.close();}}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException, IOException {doGet(req
, resp
);}
}
6.默認(rèn)Servlet
<1>含義;默認(rèn)Servlet是由服務(wù)器提供的一個(gè)Servlet。它配置在Tomcat的conf目錄中的web.xml中;
它的映射路徑是/,我們?cè)诎l(fā)送請(qǐng)求時(shí),首先會(huì)在我們項(xiàng)目中的web.xml中查找映射配置,找到則執(zhí)行。但是當(dāng)找不到對(duì)應(yīng)的Servlet路徑時(shí),就去找默認(rèn)的Servlet,由默認(rèn)Servlet處理。所以,一切都是Servlet。
<servlet><servlet-name>default
</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet
</servlet-class><init-param><param-name>debug
</param-name><param-value>0
</param-value></init-param><init-param><param-name>listings
</param-name><param-value>false
</param-value></init-param><load-on-startup>1
</load-on-startup></servlet><servlet-mapping><servlet-name>default
</servlet-name><url-pattern>/
</url-pattern></servlet-mapping>
<3>如一些報(bào)錯(cuò)信息,如404都是默認(rèn)Servlet給我們的提示。
總結(jié)
以上是生活随笔為你收集整理的动态资源Servlet接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。