初学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(),返回資源的真實路徑。
總結
- 上一篇: 广西壮族自治区计算机证书查询,职业资格证
- 下一篇: 阈值法进行边缘检测matlab