日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Servlet应用之细节

發布時間:2025/3/19 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet应用之细节 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?由于客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

<servlet>元素用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name><servlet-class>,分別用于設置Servlet的注冊名稱和Servlet的完整類名。

一個<servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name><url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。例如:

<web-app>

<servlet>

<servlet-name>AnyName</servlet-name>

<servlet-class>HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>AnyName</servlet-name>

<url-pattern>/demo/hello.html</url-pattern>

</servlet-mapping>

</web-app>

同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的注冊名。

Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:一種格式是“*.擴展名,另一種格式是以正斜杠(/)開頭并以“/*”結尾。

<servlet-mapping>

<servlet-name>

AnyName

</servlet-name>

<url-pattern>

*.do

</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>

AnyName

</servlet-name>

<url-pattern>

/action/*

</url-pattern>

</servlet-mapping>

?

對于如下的一些映射關系:

Servlet1 映射到 /abc/*

Servlet2 映射到 /*

Servlet3 映射到 /abc

Servlet4 映射到 *.do

問題:

當請求URL“/abc/a.html”“/abc/*”“/*”都匹配,哪個servlet響應

Servlet引擎將調用Servlet1。

當請求URL“/abc”時,“/abc/*”“/abc”都匹配,哪個servlet響應

Servlet引擎將調用Servlet3

當請求URL“/abc/a.do”時,“/abc/*”“*.do”都匹配,哪個servlet響應

Servlet引擎將調用Servlet1。

當請求URL“/a.do”時,“/*”“*.do”都匹配,哪個servlet響應

Servlet引擎將調用Servlet2。

當請求URL“/xxx/yyy/a.do”時,“/*”“*.do”都匹配,哪個servlet響應

Servlet引擎將調用Servlet2。

?

Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調度。

?

針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,也就是說Servlet實例對象一旦創建,它就會駐留在內存中,為后續的其它請求服務,直至web容器退出,servlet實例對象才會銷毀。

?

Servlet的整個生命周期內,Servletinit方法只被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servletservice方法。對于每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然后將這兩個對象作為參數傳遞給它調用的Servletservice()方法,service方法再根據請求方式分別調用doXXX方法。

?

如果在<servlet>元素中配置了一個<load-on-startup>元素,那么WEB應用程序在啟動時,就會裝載并創建Servlet的實例對象、以及調用Servlet實例對象的init()方法。

舉例:

<servlet>

<servlet-name>invoker</servlet-name>

<servlet-class>

org.apache.catalina.servlets.InvokerServlet

</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

?

用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用創建必要的數據庫表和數據。

?

如果某個Servlet的映射路徑僅僅為一個正斜杠(/),那么這個Servlet就成為當前Web應用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用于處理所有其他Servlet都不處理的訪問請求。

<tomcat的安裝目錄>\conf\web.xml文件中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServletServlet,并將這個Servlet設置為了缺省Servlet

當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet

?

線程安全

當多個客戶端并發訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,并在這個線程上調用Servletservice方法,因此service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題。

如果某個Servlet實現了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調用其service方法。

SingleThreadModel接口中沒有定義任何方法,只要在Servlet類的定義中增加實現SingleThreadModel接口的聲明即可。

對于實現了SingleThreadModel接口的ServletServlet引擎仍然支持對該Servlet的多線程并發訪問,其采用的方式是產生多個Servlet實例對象,并發的每個線程分別調用一個獨立的Servlet實例對象。

實現SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因為Servlet引擎會創建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)

?

ServletConfig對象

Servlet的配置文件中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數。

?

servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servletinit方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息。

?

閱讀ServletConfig API,并舉例說明該對象的作用:

獲得字符集編碼

獲得數據庫連接信息

獲得配置文件

?

ServletContext

WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。

ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。

也可以使用 this.getServletContext方法

由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。多個Servlet通過ServletContext對象實現數據共享。

ServletContext對象通常也被稱之為context域對象。(requestsessionpage

setAttribute(),getAttribute();

?

ServletContext應用

獲取WEB應用的初始化參數。

<context-param>

<param-name> data</param-name>

<param-value> xxxx</param-value>

</context-param>

?

實現Servlet的轉發。

RequestDispatcher rd = getServletContext().getRequestDispatcher(“/1.jsp”);

rd.forward(request,response);

如何把數據傳到 1.jsp ?(可以通過request域,不能用context域)

?

ServletConfigServletContext的區別

整個Web應用只有一個ServletContext,在部署Web應用的時候,容器會建立這一個ServletContext對象,這個上下文對Web應用中的每個ServletJSP都可用。

Web應用中的各個Servlet都有自己的ServletConfig,它只對當前Servlet有效。

?

在客戶端緩存Servlet的輸出

對于不經常變化的數據,在servlet中可以為其設置合理的緩存時間值,以避免瀏覽器頻繁向服務器發送請求,提升服務器的性能。

?

?

?

?

?

?

轉載于:https://blog.51cto.com/fighter2013/1147895

總結

以上是生活随笔為你收集整理的Servlet应用之细节的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。