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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

方立勋_30天掌握JavaWeb_Servlet

發(fā)布時(shí)間:2023/12/20 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方立勋_30天掌握JavaWeb_Servlet 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Servlet簡(jiǎn)介

  • Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。
  • Sun公司在其API中提供了一個(gè)servlet接口,用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個(gè)步驟:
    • 編寫一個(gè)Java類,實(shí)現(xiàn)servlet接口。
    • 把開發(fā)好的Java類部署到web服務(wù)器中。
  • 快速入門,用servlet向?yàn)g覽器輸出“hello servlet”。
    • 閱讀Servlet API,解決兩個(gè)問題:
    • 輸出hello servlet的java代碼應(yīng)該寫在servlet的哪個(gè)方法內(nèi)?
    • 如何向IE瀏覽器輸出數(shù)據(jù)?

1、在webapps目錄下新建一個(gè)day05的web應(yīng)用,在day05下新建一個(gè)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、進(jìn)入到classes目錄,編譯FirstServlet
javac -d . FirstServlet.java
set classpath=%classpath%;………….

3、在day05\web-inf目錄,新建一個(gè)web.xml文件,對(duì)servlet進(jìn)行配置

<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、啟動(dòng)服務(wù)器,在ie輸入http://localhost:8080/day05/xxx

servlet 調(diào)用圖

Servlet在web應(yīng)用中的位置

提示:按照一種約定俗成的稱呼習(xí)慣,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servlet。

Servlet的運(yùn)行過程
Servlet程序是由WEB服務(wù)器調(diào)用,web服務(wù)器收到客戶端的Servlet訪問請(qǐng)求后:

  • Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對(duì)象。如果是,則直接執(zhí)行第④步,否則,執(zhí)行第②步。
  • 裝載并創(chuàng)建該Servlet的一個(gè)實(shí)例對(duì)象。
  • 調(diào)用Servlet實(shí)例對(duì)象的init()方法。
  • 創(chuàng)建一個(gè)用于封裝HTTP請(qǐng)求消息的HttpServletRequest對(duì)象和一個(gè)代表HTTP響應(yīng)消息的HttpServletResponse對(duì)象,然后調(diào)用Servlet的service()方法并將請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞進(jìn)去。
  • WEB應(yīng)用程序被停止或重新啟動(dòng)之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法。
  • 在Eclipse中開發(fā)Servlet

    使用Myeclipse編寫servlet程序報(bào)的錯(cuò)誤:
    使用Myeclipse編寫一個(gè)servlet程序,然后部署發(fā)布,若如果報(bào)**一個(gè)錯(cuò)誤,則可能是,eg:Myeclipse中設(shè)置的運(yùn)行環(huán)境JRE為默認(rèn)的版本如1.5,但是Tomcat下webapps中剛才已經(jīng)手寫了一個(gè)web程序,當(dāng)時(shí)使用的編譯版本即JDK版本為1.6的,這樣Myeclipse在部署運(yùn)行的時(shí)候就會(huì)加載全部webapps的應(yīng)用,加載其中編譯生成的class文件,這樣就會(huì)出現(xiàn)這個(gè)錯(cuò)誤。

    Servlet接口實(shí)現(xiàn)類

    • Servlet接口SUN公司定義了兩個(gè)默認(rèn)實(shí)現(xiàn)類,分別為:GenericServlet、HttpServlet。

    • HttpServlet指能夠處理HTTP請(qǐng)求的servlet,它在原有Servlet接口上添加了一些與HTTP協(xié)議處理方法,它比Servlet接口的功能更為強(qiáng)大。因此開發(fā)人員在編寫Servlet時(shí),通常應(yīng)繼承這個(gè)類,而避免直接去實(shí)現(xiàn)Servlet接口。

    • HttpServlet在實(shí)現(xiàn)Servlet接口時(shí),覆寫了service方法,該方法體內(nèi)的代碼會(huì)自動(dòng)判斷用戶的請(qǐng)求方式,如為GET請(qǐng)求,則調(diào)用HttpServlet的doGet方法,如為Post請(qǐng)求,則調(diào)用doPost方法。因此,開發(fā)人員在編寫Servlet時(shí),通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

    servlet的一些細(xì)節(jié)(1)

    • 由于客戶端是通過URL地址訪問web服務(wù)器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個(gè)URL地址上,這個(gè)工作在web.xml文件中使用元素和元素完成。
    • <servlet>元素用于注冊(cè)Servlet,它包含有兩個(gè)主要的子元素:<servlet-name>和<servlet-class>,分別用于設(shè)置Servlet的注冊(cè)名稱和Servlet的完整類名。
    • 一個(gè)<servlet-mapping>元素用于映射一個(gè)已注冊(cè)的Servlet的一個(gè)對(duì)外訪問路徑,它包含有兩個(gè)子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊(cè)名稱和Servlet的對(duì)外訪問路徑。例如:

    servlet的一些細(xì)節(jié)(2)

    • 同一個(gè)Servlet可以被映射到多個(gè)URL上,即多個(gè)元素的子元素的設(shè)置值可以是同一個(gè)Servlet的注冊(cè)名。
    • 在Servlet映射到的URL中也可以使用通配符,但是只能有兩種固定的格式:一種格式是“.擴(kuò)展名”,另一種格式是以正斜杠(/)開頭并以“/*”結(jié)尾。

    servlet的一些細(xì)節(jié)(3)

    • 對(duì)于如下的一些映射關(guān)系:
      Servlet1 映射到 /abc/*
      Servlet2 映射到 /*
      Servlet3 映射到 /abc
      Servlet4 映射到 *.do

    • 問題:

      當(dāng)請(qǐng)求URL為“/abc/a.html”,“/abc/”和“/”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet1。
      當(dāng)請(qǐng)求URL為“/abc”時(shí),“/abc/*”和“/abc”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet3。
      當(dāng)請(qǐng)求URL為“/abc/a.do”時(shí),“/abc/”和“.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet1。
      當(dāng)請(qǐng)求URL為“/a.do”時(shí),“/”和“.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet2。
      當(dāng)請(qǐng)求URL為“/xxx/yyy/a.do”時(shí),“/”和“.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet2。

    servlet的一些細(xì)節(jié)(4)

    • Servlet是一個(gè)供其他Java程序(Servlet引擎)調(diào)用的Java類,它不能獨(dú)立運(yùn)行,它的運(yùn)行完全由Servlet引擎來(lái)控制和調(diào)度。

    • 針對(duì)客戶端的多次Servlet請(qǐng)求,通常情況下,服務(wù)器只會(huì)創(chuàng)建一個(gè)Servlet實(shí)例對(duì)象,也就是說(shuō)Servlet實(shí)例對(duì)象一旦創(chuàng)建,它就會(huì)駐留在內(nèi)存中,為后續(xù)的其它請(qǐng)求服務(wù),直至web容器退出,servlet實(shí)例對(duì)象才會(huì)銷毀。

    • 在Servlet的整個(gè)生命周期內(nèi),Servlet的init方法只被調(diào)用一次。而對(duì)一個(gè)Servlet的每次訪問請(qǐng)求都導(dǎo)致Servlet引擎調(diào)用一次servlet的service方法。對(duì)于每次訪問請(qǐng)求,Servlet引擎都會(huì)創(chuàng)建一個(gè)新的HttpServletRequest請(qǐng)求對(duì)象和一個(gè)新的HttpServletResponse響應(yīng)對(duì)象,然后將這兩個(gè)對(duì)象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法,service方法再根據(jù)請(qǐng)求方式分別調(diào)用doXXX方法。

    servlet的一些細(xì)節(jié)(5)

    • 如果在元素中配置了一個(gè)元素,那么WEB應(yīng)用程序在啟動(dòng)時(shí),就會(huì)裝載并創(chuàng)建Servlet的實(shí)例對(duì)象、以及調(diào)用Servlet實(shí)例對(duì)象的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應(yīng)用寫一個(gè)InitServlet,這個(gè)servlet配置為啟動(dòng)時(shí)裝載,為整個(gè)web應(yīng)用創(chuàng)建必要的數(shù)據(jù)庫(kù)表和數(shù)據(jù)。

    servlet的一些細(xì)節(jié)(6)

    • 如果某個(gè)Servlet的映射路徑僅僅為一個(gè)正斜杠(/),那么這個(gè)Servlet就成為當(dāng)前Web應(yīng)用程序的缺省Servlet。
    • 凡是在web.xml文件中找不到匹配的元素的URL,它們的訪問請(qǐng)求都將交給缺省Servlet處理,也就是說(shuō),缺省Servlet用于處理所有其他Servlet都不處理的訪問請(qǐng)求。
    • 在<tomcat的安裝目錄>\conf\web.xml文件中,注冊(cè)了一個(gè)名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個(gè)Servlet設(shè)置為了缺省Servlet。
    • 當(dāng)訪問Tomcat服務(wù)器中的某個(gè)靜態(tài)HTML文件和圖片時(shí),實(shí)際上是在訪問這個(gè)缺省Servlet。

    PS:若寫了一個(gè)默認(rèn)的缺省Servlet,則靜態(tài)HTML文件和圖片映射將出現(xiàn)問題。

    servlet的一些細(xì)節(jié)(7)

    • 當(dāng)多個(gè)客戶端并發(fā)訪問同一個(gè)Servlet時(shí),web服務(wù)器會(huì)為每一個(gè)客戶端的訪問請(qǐng)求創(chuàng)建一個(gè)線程,并在這個(gè)線程上調(diào)用Servlet的service方法,因此service方法內(nèi)如果訪問了同一個(gè)資源的話,就有可能引發(fā)線程安全問題。
    • 如果某個(gè)Servlet實(shí)現(xiàn)了SingleThreadModel接口,那么Servlet引擎將以單線程模式來(lái)調(diào)用其service方法。
    • SingleThreadModel接口中沒有定義任何方法,只要在Servlet類的定義中增加實(shí)現(xiàn)SingleThreadModel接口的聲明即可。
    • 對(duì)于實(shí)現(xiàn)了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對(duì)該Servlet的多線程并發(fā)訪問,其采用的方式是產(chǎn)生多個(gè)Servlet實(shí)例對(duì)象,并發(fā)的每個(gè)線程分別調(diào)用一個(gè)獨(dú)立的Servlet實(shí)例對(duì)象。
    • 實(shí)現(xiàn)SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因?yàn)镾ervlet引擎會(huì)創(chuàng)建多個(gè)Servlet實(shí)例對(duì)象,而真正意義上解決多線程安全問題是指一個(gè)Servlet實(shí)例對(duì)象被多個(gè)線程同時(shí)調(diào)用的問題。事實(shí)上,在Servlet API 2.4中,已經(jīng)將SingleThreadModel標(biāo)記為Deprecated(過時(shí)的)。

    解決方式一

    //線程安全(網(wǎng)頁(yè)) public class ServletDemo4 extends HttpServlet { //子類不能拋比父類更多的異常int i = 1;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {synchronized (this) { //鎖旗標(biāo) 鎖 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);} }

    這樣的解決方式是不行的。因?yàn)槿绻衝個(gè)請(qǐng)求訪問,則后面的請(qǐng)求訪問得等待前面的請(qǐng)求訪問結(jié)束。

    ServletConfig對(duì)象

    • 在Servlet的配置文件中,可以使用一個(gè)或多個(gè)<init-param>標(biāo)簽為servlet配置一些初始化參數(shù)。

    • 當(dāng)servlet配置了初始化參數(shù)后,web容器在創(chuàng)建servlet實(shí)例對(duì)象時(shí),會(huì)自動(dòng)將這些初始化參數(shù)封裝到ServletConfig對(duì)象中,并在調(diào)用servlet的init方法時(shí),將ServletConfig對(duì)象傳遞給servlet。進(jìn)而,程序員通過ServletConfig對(duì)象就可以得到當(dāng)前servlet的初始化參數(shù)信息。

    • 閱讀ServletConfig API,并舉例說(shuō)明該對(duì)象的作用:

      • 獲得字符集編碼
      • 獲得數(shù)據(jù)庫(kù)連接信息
      • 獲得配置文件,查看struts案例的web.xml文件
        <init-param>
        <
        </init-param>

    ServletContext對(duì)象

    • WEB容器在啟動(dòng)時(shí),它會(huì)為每個(gè)WEB應(yīng)用程序都創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象,它代表當(dāng)前web應(yīng)用。

    • ServletConfig對(duì)象中維護(hù)了ServletContext對(duì)象的引用,開發(fā)人員在編寫servlet時(shí),可以通過ServletConfig.getServletContext方法獲得ServletContext對(duì)象。

    • 由于一個(gè)WEB應(yīng)用中的所有Servlet共享同一個(gè)ServletContext對(duì)象,因此Servlet對(duì)象之間可以通過ServletContext對(duì)象來(lái)實(shí)現(xiàn)通訊。ServletContext對(duì)象通常也被稱之為 context域 對(duì)象。(之后還要學(xué)習(xí)request域、session域、page域)

    • 查看ServletContext API文檔,了解ServletContext對(duì)象的功能。

    ServletContext的應(yīng)用:
    - 多個(gè)Servlet通過ServletContext對(duì)象實(shí)現(xiàn)數(shù)據(jù)共享。

    • 獲取WEB應(yīng)用的初始化參數(shù)。

    • 實(shí)現(xiàn)Servlet的轉(zhuǎn)發(fā)。
      注:重定向 和 轉(zhuǎn)發(fā)區(qū)別
      重定向:A向B借錢(第一次請(qǐng)求),B說(shuō)你找C去借(第二次請(qǐng)求)。(共兩次次請(qǐng)求)
      轉(zhuǎn)發(fā):A向B借錢,B幫忙去找C。(一次請(qǐng)求)
      在實(shí)際開發(fā)中,轉(zhuǎn)發(fā)用的超級(jí)多。

    public class ServletDemo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String data = "aaaaaa";// 把數(shù)據(jù)帶給1.jsp (其實(shí)不能這么做:不能通過context域,要通過request域)this.getServletContext().setAttribute("data", data);RequestDispatcher rd = this.getServletContext().getRequestDispatcher("1.jsp");rd.forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }
    • 利用ServletContext對(duì)象讀取資源文件。
      • 得到文件路徑
      • 讀取資源文件的三種方式
      • .properties文件(屬性文件)
        注:軟件開發(fā)中,如果配置文件中數(shù)據(jù)有關(guān)系,用xml文件;如果數(shù)據(jù)沒關(guān)系,用.properties文件。
    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_Servlet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。