4.Servlet(动态web资源)
Servlet (動態web資源)
開發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據) 需完成以下兩個步驟
1.編寫一個Java類,實現servelet接口
2.把開發好的Java類部署到web服務器中
servlet入門(用servlet 在一個網頁中顯示 helloworld)(動態)(不使用IDE的情況下)
1.在tomcat中新建一個web應用,然后在web應用中新建一個 web-inf/classes目錄
2.在classes目錄中新建一個FirstServlet
1 public class FirstServlet extends GenericServlet {
2 public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException {
3 OutputStream out = res.getOutputStream(); //字節流
4 out.write("hello world!!".getBytes()); //"hello world!!" 是字符 需變成字節
5 }
6 }
3.set classpath=%classpath% .............servlet.jar 編譯servlet
(因為servlet屬于j2ee,不是j2se,所以,需要配置一下classpath)(在dos命令行中)
4.在web-inf目錄中新建一個web.xml文件,配置servlet對外訪問路徑
5.啟動tomcat 訪問
Servlet調用過程:
1.連上web服務器
2.發送http請求
3.解析出想訪問的主機名
4.解析出想訪問的web應用
5.解析出想訪問的web資源
6.第一次創建servlet實例對象
7.調用servlet對象的init方法完成初始化
8.創建代表請求的request和代表響應的response調用servlet的service方法響應客戶端請求
9.service方法執行,向代表客戶端響應的response對象寫入了向客戶機輸出的數據
10.service方法返回
11.從response中取出數據,構建出HTTP響應,回寫給客戶機
12.回寫HTTP響應
13.瀏覽器解析HTTP響應 顯示數據
注:HttpServlet在實現了Servlet接口時,覆寫了service方法,當繼承了HttpServlet后 就不需要再寫service方法,只需要寫doGet 或者 doPost方法里面處理
Servlet的小細節:
1.同一個Servlet可以被映射到多個URL上,即可以寫多個<servlet-mapping>,也可以使用*通配符,但是只能有兩種固定格式:
一種格式是: " *.擴展名 ", 另外一種格式是(/*)
2.web.xml文件的更改,不需要重新發布工程,會自動更新
3.使用 * 通配符可能出現地址沖突的問題,都匹配某個請求的情況:遵循: 1.選長得最像的響應 2.通配符在前優先級最低
4.Servlet不能獨立運行,它的運行完全由Servlet引擎(web服務器用來調Servlet的java程序)來控制和調度
5./*針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,
也就是說Servlet實例對象一旦創建,它就會駐留在內存中,為后續的其他請求服務,直至web容器退出(Tomcat關閉),servlet實例對象才會銷毀*/
6.在servlet的整個生命周期內,這個servlet的init方法只被調用一次,而對一個servlet的每次訪問請求都導致servlet引擎調用一次service方法,
對于每次訪問請求,servlet請求都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,
然后將這兩個對象作為參數傳遞給它調用的servlet的service()方法,service方法再根據請求方式分別調用doXXX()方法
7.如果在<servlet>元素中配置了一個<load-on-startup>(里面可以寫正整數,數字越小,優先級越高)元素,
那么WEB應用程序在啟動時,就會裝載并創建servlet的實例對象,以及調用servlet實例對象的init()方法 用途:在特定時刻,為web應用創建必要的數據庫表和數據
8.如果某個servlet的映射路徑僅僅為一個 (/),那么這個servlet就成為當前web應用程序的缺省servlet 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,
它們的訪問請求都交給缺省servlet處理,也就是說,缺省servlet用于處理所有其他servlet都不處理的訪問請求
在<tomcat的安裝目錄>confweb.xml文件中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個servlet設置為可缺省servlet
由上: /*當訪問tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet*/
9.servlet的線程安全問題:service方法如果操作共享資源,則有可能出現線程安全問題
如果某個servlet實現了SingleThreadModel接口(標記接口,無方法),那么servlet引擎將以單線程模式來調用其service方法
(如果多個線程同時訪問某個資源,則產生對應的多個servlet實例對象,并發的每個線程分別調用一個獨立的servlet實例對象)
實現SingleThreadModel接口并不能真正解決servlet的線程安全問題,因為servlet引擎會創建多個servlet實例對象,
而 /*真正意義上解決多線程安全問題是指一個servlet實例對象被多個線程同時調用的問題*/ 故 SingleThreadModel接口(過時的)
web服務器在調用servlet的時候,會傳遞給servlet很多對象:前面講到了ServletRequest , ServletSponse 還有一些其他的對象:如ServletConfig ServletContext session cookie 等
1./*ServletConfig對象(用于封裝servlet的配置信息)*/
在Servlet的配置文件中,可以使用一個或者多個<init-param>標簽為servlet配置一些初始化參數
在servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,
將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息
該對象的作用: 1.獲得字符集編碼 2.獲得數據庫連接信息 3.獲得配置文件,查看struts案例的web.xml文件
2./*ServletContext對象 (代表當前web應用)*/
WEB容器在啟動時,它會為每個web應用程序都創建出一個對應的ServletContext對象
ServletConfig對象中維護了ServletContext對象的引用(即可以通過ServletConfig.getServletContext方法獲得 (因為繼承了HttpServlet也可以直接this.getServletContext ))
ServletContext方法的應用
1.多個Servlet通過ServletContext對象實現數據共享 ServletContext對象通常被稱之為context/*域*/對象 (ServletContext域這個容器的作用范圍:應用程序范圍)
2.獲取web應用的初始化參數 <context-param>標簽定義的參數為web應用的初始化參數 (會自動封裝到ServletContext中)
(ServletContext出生:web服務器啟動(為每個web應用配一個ServletContext),死亡:web服務器關閉,或者web應用被刪除)
3.實現Servlet的轉發(與重定向有所區別:Servlet的轉發:別人找我借錢,我幫他向別人借 重定向:別人找我借錢,我讓他找別人借)
Servlet不適合用作數據的輸出(網頁要弄美觀很麻煩),所以需要轉給JSP(JSP可以看作一種特殊的Html,里面可以寫java代碼的Html)(用來專門顯示數據)
4.ServletContext讀取web應用中的資源文件
5.web應用中的普通Java程序如何讀取資源文件 (servlet文件通過ServletContext,非servlet文件通過類裝載器)
總結
以上是生活随笔為你收集整理的4.Servlet(动态web资源)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样创建XML文档
- 下一篇: Java实现各种排序算法