方立勋_30天掌握JavaWeb_Servlet
Servlet簡介
- Servlet是sun公司提供的一門用于開發動態web資源的技術。
- Sun公司在其API中提供了一個servlet接口,用戶若想用發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據),需要完成以下2個步驟:
- 編寫一個Java類,實現servlet接口。
- 把開發好的Java類部署到web服務器中。
- 快速入門,用servlet向瀏覽器輸出“hello servlet”。
- 閱讀Servlet API,解決兩個問題:
- 輸出hello servlet的java代碼應該寫在servlet的哪個方法內?
- 如何向IE瀏覽器輸出數據?
1、在webapps目錄下新建一個day05的web應用,在day05下新建一個WEB-INF\classes,在classes新建servlet
package cn.itcast; import java.io.*; import javax.servlet.*; public class FirstServlet extends GenericServlet{ public void service(ServletRequest req,ServletResponse res)throws ServletException,java.io.IOException{String data = "hello servlet!!";OutputStream out = res.getOutputStream();out.write(data.getBytes()); } }2、進入到classes目錄,編譯FirstServlet
javac -d . FirstServlet.java
set classpath=%classpath%;………….
3、在day05\web-inf目錄,新建一個web.xml文件,對servlet進行配置
<web-app 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_2_5.xsd"version="2.5"><servlet><servlet-name>FirstServlet</servlet-name><servlet-class>cn.itcast.FirstServlet</servlet-class></servlet><servlet-mapping><servlet-name>FirstServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping></web-app>4、啟動服務器,在ie輸入http://localhost:8080/day05/xxx
servlet 調用圖
Servlet在web應用中的位置
提示:按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet。
Servlet的運行過程
Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求后:
在Eclipse中開發Servlet
使用Myeclipse編寫servlet程序報的錯誤:
使用Myeclipse編寫一個servlet程序,然后部署發布,若如果報**一個錯誤,則可能是,eg:Myeclipse中設置的運行環境JRE為默認的版本如1.5,但是Tomcat下webapps中剛才已經手寫了一個web程序,當時使用的編譯版本即JDK版本為1.6的,這樣Myeclipse在部署運行的時候就會加載全部webapps的應用,加載其中編譯生成的class文件,這樣就會出現這個錯誤。
Servlet接口實現類
Servlet接口SUN公司定義了兩個默認實現類,分別為:GenericServlet、HttpServlet。
HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet接口上添加了一些與HTTP協議處理方法,它比Servlet接口的功能更為強大。因此開發人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現Servlet接口。
HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如為GET請求,則調用HttpServlet的doGet方法,如為Post請求,則調用doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。
servlet的一些細節(1)
- 由于客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用元素和元素完成。
- <servlet>元素用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用于設置Servlet的注冊名稱和Servlet的完整類名。
- 一個<servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。例如:
servlet的一些細節(2)
- 同一個Servlet可以被映射到多個URL上,即多個元素的子元素的設置值可以是同一個Servlet的注冊名。
- 在Servlet映射到的URL中也可以使用通配符,但是只能有兩種固定的格式:一種格式是“.擴展名”,另一種格式是以正斜杠(/)開頭并以“/*”結尾。
servlet的一些細節(3)
對于如下的一些映射關系:
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的一些細節(4)
Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調度。
針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,也就是說Servlet實例對象一旦創建,它就會駐留在內存中,為后續的其它請求服務,直至web容器退出,servlet實例對象才會銷毀。
在Servlet的整個生命周期內,Servlet的init方法只被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servlet的service方法。對于每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然后將這兩個對象作為參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。
servlet的一些細節(5)
如果在元素中配置了一個元素,那么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的一些細節(6)
- 如果某個Servlet的映射路徑僅僅為一個正斜杠(/),那么這個Servlet就成為當前Web應用程序的缺省Servlet。
- 凡是在web.xml文件中找不到匹配的元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用于處理所有其他Servlet都不處理的訪問請求。
- 在<tomcat的安裝目錄>\conf\web.xml文件中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個Servlet設置為了缺省Servlet。
- 當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet。
PS:若寫了一個默認的缺省Servlet,則靜態HTML文件和圖片映射將出現問題。
servlet的一些細節(7)
- 當多個客戶端并發訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,并在這個線程上調用Servlet的service方法,因此service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題。
- 如果某個Servlet實現了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調用其service方法。
- SingleThreadModel接口中沒有定義任何方法,只要在Servlet類的定義中增加實現SingleThreadModel接口的聲明即可。
- 對于實現了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程并發訪問,其采用的方式是產生多個Servlet實例對象,并發的每個線程分別調用一個獨立的Servlet實例對象。
- 實現SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因為Servlet引擎會創建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)。
解決方式一
//線程安全(網頁) public class ServletDemo4 extends HttpServlet { //子類不能拋比父類更多的異常int i = 1;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {synchronized (this) { //鎖旗標 鎖 i++; try {Thread.sleep(1000*4);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}response.getWriter().write(i+"");} }public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);} }這樣的解決方式是不行的。因為如果有n個請求訪問,則后面的請求訪問得等待前面的請求訪問結束。
ServletConfig對象
在Servlet的配置文件中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數。
當servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息。
閱讀ServletConfig API,并舉例說明該對象的作用:
- 獲得字符集編碼
- 獲得數據庫連接信息
- 獲得配置文件,查看struts案例的web.xml文件
<init-param>
<
</init-param>
ServletContext對象
WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為 context域 對象。(之后還要學習request域、session域、page域)
查看ServletContext API文檔,了解ServletContext對象的功能。
ServletContext的應用:
- 多個Servlet通過ServletContext對象實現數據共享。
獲取WEB應用的初始化參數。
實現Servlet的轉發。
注:重定向 和 轉發區別
重定向:A向B借錢(第一次請求),B說你找C去借(第二次請求)。(共兩次次請求)
轉發:A向B借錢,B幫忙去找C。(一次請求)
在實際開發中,轉發用的超級多。
- 利用ServletContext對象讀取資源文件。
- 得到文件路徑
- 讀取資源文件的三種方式
- .properties文件(屬性文件)
注:軟件開發中,如果配置文件中數據有關系,用xml文件;如果數據沒關系,用.properties文件。
總結
以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_Servlet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何删除eclipse多余的工作空间
- 下一篇: 方立勋_30天掌握JavaWeb_res