日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初学servlet

發布時間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初学servlet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、servlet概述

servlet是sun公司提供的動態web資源開發技術。其本質是Java程序,不同的是實現了Servlet接口,以便服務器能夠調用。

2、寫Servlet的兩個步驟

? ?2.1 寫一個Java類實現Servlet接口(繼承Servlet的實現類GenericServlet)

public class FirstServlet extends GenericServlet{ public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{ res.getOutputStream().write("My FirstServlet!".getBytes()); } }

2.2 將編譯好的Class文件放到WEB-INF/Classes下面

? ?2.3 配置web.xml文件,注冊Servlet

<servlet><servlet-name>FirstServlet</servlet-name><servlet-class>me.test.FirstServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>FirstServlet</servlet-name><url-pattern>FirstServlet</url-pattern> </servlet-mapping>

3、Servlet介紹

? ? 3.1 Servlet生命周期

? ? ? ? ? ? 通常情況下,Servlet在第一次被訪問的時候在內存中創建對象,調用init()方法初始化。對于每一次請求都調用service(req,resp)方法處理請求,

? ? ? ?此時會用Request對象封裝請求信息,并用Response對象(初始為空)代表相應消息,并作為參數傳入到service方法中以供調用。

? ? ? ?當service方法處理完成后,服務器根據Response中的信息返回給瀏覽器。

? ? ? ?響應結束后servlet并不銷毀,一直駐留在內存中等待下一次請求,直到服務器關閉或web應用被移除出虛擬主機,servlet對象銷毀。

? ? ? 并在銷毀前調用destroy()方法做一些善后的事情。

? ?3.2 Servlet 接口的繼承結構

? ? ? ? ?Servlet接口:定義方法,所有Servlet都應實現接口中的方法

? ? ? ? ? ? ? GenericServlet實現類:對Servlet接口的默認實現,是一個抽象類,Servlet接口service方法需要繼承者實現

? ? ? ? ? ? ? HttpServlet實現類:對Http協議優化的Servlet,繼承于GenericServlet類,并且實現了其中的service抽象方法,默認的實現中歐判斷請求方式(post或get),

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 分別調用不同的doPost()或doGet()方法,通常只需繼承HttpServlet即可。

4、在web.xml中注冊Servlet

? ?4.1 可以在Servlet-Mapping中通過*匹配符來匹配URL,以*.do相關性最低。

? ?4.2 配置load-on-startup,值為正整數,數字越小,啟動級別越高

<servlet><servlet-name>invoker</servlet-name><servlet-class>org.apache.catalina.servlets.InvokerServlet </servlet-class><load-on-startup>2</load-on-startup> </servlet>

? ?4.3 缺省Servlet

? ? ? ? ? ? 如果一個Servlet的對外訪問路徑被設置為“/”,則該Servlet就是一個缺省Servlet,其他Servlet不處理的請求都由它來處理。

? ??在conf/web.xml中配置了缺省servlet,用來處理對靜態資源的訪問和錯誤頁面的處理。

? ??如果我們自己寫一個缺省servlet把web.xml中的缺省servlet覆蓋的話,會導致靜態web資源無法訪問,所以不推薦配置。

? ?4.4 Servlet的線程安全問題

? ? ? ? ? ?4.4.1 通常情況下,一個servlet在內存只有一個實例處理請求,當多個請求發送過來就會有多個線程操作該servlet對象,此時可能導致線程安全問題。
(1)
?serlvet的成員變量可能存在線程安全問題
*實驗:定義一個成員變量 int i = 0;在doXXX()方法中進行i++操作并輸出i值到客戶端,此時由于延遲可能導致線程安全問題
(2)
?serlvet操作資源文件時,多個線程操作同一文件引發線程安全問題
*實驗:請求帶著一個參數過來,servlet將請求參數寫入到一個文件,再讀取該文件,將讀取到的值打印到客戶端上,有可能有線程安全問題

? ? ? ? ? ?4.4.2 解決方法

? ? ? ? ? ? ? ? ?(1)利用同步代碼塊解決

? ? ? ? ? ? ? ? ? ? ? ? ? ? 同一時間同步代碼塊只能處理一個請求,效率低下,所以同步代碼塊中盡量只包含核心的會導致線程問題的代碼。

? ? ? ? ? ? ? ? ?(2)為該Servlet實現SingleThreadModel接口,這是一個標記接口,被標記的Servlet將會在內存中保存一個Servlet池,如果有請求而Servlet池中沒有

? ? ? ? ? ? ? ? ? ? ? ? ? ?Servlet對象來處理,則創建一個新的Servlet對象。如果池中有空閑的Servlet則直接使用。由于不能真的解決線程問題,已被廢棄。

5、ServletConfig

? ? ? ?5.1 代表Servlet配置的對象,可以在web.xml中的<servlet>配置

<servlet><servlet-name>Servlet1</servlet-name><servlet-class>me.test.servlet</servlet-class><init-param><param-name>data</param-name> <param-value>value</param-value><init-param> </servlet>

? ? ? ? ?在Servlet中歐用this.getServletConfig()獲取ServletConfig對象,該對象提供了getInitParameter()和getInitParameterNames()方法,可以遍歷得到配置中的數據

6、ServletContext

? ? ? ? 6.1 ServletContext代表當前的web應用對象。

? ? ? ? 6.2 作為域對象使用,在不同的Servlet之間傳遞數據,作用范圍是整個web應用。

? ? ? ? ? ? ? ? 生命周期:當web應用被加載進容器時創建代表整個web應用的ServletContext對象。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 當服務器關閉或web應用被移出容器的時候,ServletContext銷毀。?

? ? ? ? ? ? ? ? 域對象:一個域就是一個作用范圍。

? ? ? ? 6.3 在web.xml中可以配置整個web應用的初始化參數,利用ServletContext獲得。

<context-param><param-name>param1</param-name><param-value>value1</param-value> </context-param>

? ? ? ? ? ? ? ?通過this.getServletContext().getInitParameter("param1");

? ? ? ? ? ? ? ? ? ? ? this.getServletContext().getInitParameterNames();獲得數據。

? ? ? ?6.4 在不同的Servlet之間進行轉發

? ? ? ? ? ? ? ? ?this.getServletContext().getRequestDispatcher("/servlet/servlet2").forward(request,response);

? ? ? ? ? ? ? ?方法執行結束,service會返回到服務器,再有服務器調用時,Request會重新創建,并將之前Request的數據拷貝進去。

? ? ? ?6.5 讀取資源文件

? ? ? ? ? ? ? 6.5.1 相對路徑默認Java虛擬機的啟動目錄,所以寫相對路徑時是相對于Tomcat/bin目錄,找不到資源。

? ? ? ? ? ? ? ? ? ? ? ?如果是絕對路徑,一旦項目發布到其他環境時,絕對路徑就錯了

? ? ? ? ? ? ? 6.5.2 ServletContext提供了this.getServletContext().getRealPath("/1.properties"),傳進資源文件的虛擬路徑,次方法會返回資源在當前環境的真實路徑。

? ? ? ? ? ? ? 6.5.3 在非Servlet環境下,只能用類加載器獲得ClassLoader.getResource("../1.properties").getPath(),返回資源的真實路徑。

總結

以上是生活随笔為你收集整理的初学servlet的全部內容,希望文章能夠幫你解決所遇到的問題。

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