最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javaweb動(dòng)態(tài)開(kāi)發(fā)最重要的Servlet詳解

 更新時(shí)間:2022年08月04日 08:57:40   作者:懶羊羊.java  
動(dòng)態(tài)web的核心是Servlet,由tomcat解析并執(zhí)行,本質(zhì)是Java中的一個(gè)類(lèi)(面向?qū)ο螅┻@個(gè)類(lèi)的功能十分強(qiáng)大幾乎可以完成全部功能,在Java規(guī)范中只有Servlet實(shí)現(xiàn)類(lèi)實(shí)例化的對(duì)象才能被瀏覽器訪問(wèn),所以掌握Servlet具有重要意義

一.導(dǎo)入方式

由于jdk中沒(méi)有servlet對(duì)應(yīng)的jar包,所以需要咱們手動(dòng)引入,有兩種方式:

1.可以采取向lib目錄導(dǎo)入servlet-api的jar包的方式

2.在maven項(xiàng)目中設(shè)置如下坐標(biāo),并添加相關(guān)依賴(lài)到依賴(lài)庫(kù)中即可(推薦使用這種,在maven里選擇webapp的骨架建立項(xiàng)目會(huì)自動(dòng)給你配置好web.xml文件)

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>

版本號(hào)可以自己定,依賴(lài)范圍要配置成provided,否則會(huì)和其他jar包沖突

二.Servlet生命周期

原生的Servlet項(xiàng)目都是實(shí)現(xiàn)Servlet接口,功能都是通過(guò)實(shí)現(xiàn)這個(gè)接口或者繼承HttpServlet來(lái)完成的,其實(shí)在IDEA里重寫(xiě)方法的過(guò)程中所對(duì)應(yīng)的順序就是他的生命周期,以下面為例:

按照每一個(gè)方法翻譯而來(lái)的字面意思,流程是:

初始化——得到服務(wù)配置——服務(wù)——獲取服務(wù)信息——銷(xiāo)毀,簡(jiǎn)言之,就是一個(gè)從初始化到服務(wù)再到消亡的過(guò)程。

初始化階段:

public void init(ServletConfig servletConfig)

當(dāng)服務(wù)器啟動(dòng),讀取web.xml文件的過(guò)程中,Tomcat加載 Servlet,加載完成后,Servlet 容器會(huì)創(chuàng)建一個(gè) Servlet 實(shí)例 并調(diào)用 init()方法,init()方法只會(huì)調(diào)用一次,這個(gè)沒(méi)什么好解析的,就是面向?qū)ο笾蓄?lèi)特性的體現(xiàn)

服務(wù)階段:

public void service(ServletRequest servletRequest, ServletResponse servletResponse)

這個(gè)方法的形參里有兩個(gè)ServletRequest和ServletResponse類(lèi)型的接口,翻譯過(guò)來(lái)就是服務(wù)請(qǐng)求、服務(wù)響應(yīng),Tomcat啟動(dòng)時(shí)自動(dòng)裝載某些 servlet,并在 Servlet 容器啟動(dòng)后,瀏覽器首次向 Servlet 發(fā)送請(qǐng)求,發(fā)送的請(qǐng)求和響應(yīng)作為參數(shù)就傳到了service方法對(duì)應(yīng)的形參里進(jìn)行處理。看了一下jdk的源碼,發(fā)現(xiàn)兩個(gè)接口下面都有很多的抽象方法,至于請(qǐng)求和響應(yīng)在底層是怎樣執(zhí)行的源碼里啥都沒(méi)寫(xiě),目前還不知道(推測(cè)是個(gè)底層驅(qū)動(dòng))

消亡階段:

public void destroy()

從圖中規(guī)定的順序不難看出,執(zhí)行到最后的方法也就預(yù)示著Servlet的生命即將結(jié)束

在JDK的源碼中,Servlet接口下的destory()沒(méi)有方法體,應(yīng)該也是和啟動(dòng)線程的start0()方法類(lèi)似被開(kāi)發(fā)者封裝簡(jiǎn)化了

完整流程演示:

@WebServlet("/demo1")
public class SevDemo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {System.out.println("我在初始化~~~");}
    @Override
    public ServletConfig getServletConfig() {return null;}
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("hello world!!!!");}
    @Override
    public String getServletInfo() {return null;}
    @Override
    public void destroy() {System.out.println("我走了,拜拜~~~");}
}

控制臺(tái)打印的信息很好地反映了執(zhí)行情況:

至于public ServletConfig getServletConfig()public String getServletInfo()在實(shí)現(xiàn)接口后重寫(xiě)的方法中默認(rèn)返回的是null,應(yīng)該是兩個(gè)起補(bǔ)充作用的方法

三.繼承HttpServlet

在實(shí)際開(kāi)發(fā)中采用繼承HttpServlet類(lèi)的方式開(kāi)發(fā)Servlet程序更加方便,因?yàn)閷?shí)現(xiàn)接口重寫(xiě)那麼多方法是真的麻煩,而通過(guò)繼承的方式就可以根據(jù)需要選擇性的重寫(xiě)doGe()或doPost()方法就簡(jiǎn)單很多,比如

public class HttpDemo extends HttpServlet { 
 @Override 
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
      System.out.println("執(zhí)行 doGet()...");
   }
 @Override 
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
      System.out.println("執(zhí)行 doPost()...");
    } 
}

至于方法體里寫(xiě)什么內(nèi)容就要看對(duì)應(yīng)的業(yè)務(wù)場(chǎng)景了

氣氛烘托到這里了就不得不說(shuō)一下GET和POST的區(qū)別了

GET&POST

以前老師是教我這樣理解的——我把一封信放在信封里郵寄出去,我可以選擇密封或者不密封,而這就會(huì)導(dǎo)致信的內(nèi)容會(huì)不會(huì)被別人看到,若是前者則對(duì)應(yīng)POST,后者就對(duì)應(yīng)GET

當(dāng)然,這只是抽象層面,而從具體方面來(lái)看:

1.從功能上來(lái)講,get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)

2.從報(bào)文上來(lái)講,在不帶參數(shù)時(shí)區(qū)別就單純是第一行方法名不同,而在帶參數(shù)時(shí)GET方法的參數(shù)放在請(qǐng)求頭URL中,POST方法的參數(shù)放在請(qǐng)求體BODY中 注:GET方法的參數(shù)寫(xiě)在?后,用&分割

3.從安全性來(lái)講,其實(shí)他們都不安全,因?yàn)閔ttp是明文傳輸(在網(wǎng)頁(yè)按F12進(jìn)入開(kāi)發(fā)者模式發(fā)現(xiàn)兩種方式都能看到數(shù)據(jù)信息)。但是這張圖應(yīng)該很生動(dòng)形象也能反映一些問(wèn)題,相比較之下POST還是比GET安全,因?yàn)閿?shù)據(jù)在地址欄不可見(jiàn),哈哈哈

四.Servlet相關(guān)性質(zhì)(八股文)

1.Servlet 是一個(gè)供其他 Java 程序(Servlet 引擎)調(diào)用的 Java 類(lèi),不能獨(dú)立運(yùn)行

2.對(duì)于每次訪問(wèn)請(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 方法

3.針對(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 容器退出/或者 redeploy 該 web 應(yīng)用,servlet 實(shí)例對(duì)象才會(huì)銷(xiāo)毀

4.如果在<servlet>元素中配置了一個(gè)<load-on-startup>元素,那么 WEB 應(yīng)用程序在啟動(dòng)時(shí), 就會(huì)裝載并創(chuàng)建 Servlet 的實(shí)例對(duì)象、以及調(diào)用 Servlet 實(shí)例對(duì)象的 init()方法

5.在 Servlet 的整個(gè)生命周期內(nèi),init 方法只被調(diào)用一次。而對(duì)每次請(qǐng)求都導(dǎo)致 Servlet 引 擎調(diào)用一次 servlet 的 service 方法

——ps:刷dy整理出來(lái)的

五.Request&Response

對(duì)于這些內(nèi)部方法來(lái)說(shuō)我覺(jué)得會(huì)用API就行

1.HttpServletRequest

HttpServletRequest 表示請(qǐng)求過(guò)來(lái)的信息:

公共接口類(lèi)HttpServletRequest繼承自ServletRequest??蛻?hù)端瀏覽器發(fā)出的請(qǐng)求被封裝成為一個(gè)HttpServletRequest對(duì)象。對(duì)象包含了客戶(hù)端請(qǐng)求信息包括請(qǐng)求的地址,請(qǐng)求的參數(shù),提交的數(shù)據(jù),上傳的文件客戶(hù)端的ip甚至客戶(hù)端操作系統(tǒng)都包含在其內(nèi)。

還是面向?qū)ο竽且惶?,封裝成類(lèi)后調(diào)用里面的方法,部分常用方法如下:

public String getAuthType()返回這個(gè)請(qǐng)求的身份驗(yàn)證模式
public Cookie[ ] getCookies()返回一個(gè)數(shù)組,該數(shù)組包含這個(gè)請(qǐng)求中當(dāng)前的所有cookie
public long getDateHeader(String name)返回指定的請(qǐng)求頭域的值,這個(gè)值被轉(zhuǎn)換成一個(gè)精確到毫秒的長(zhǎng)整數(shù)
public String getHeader(String name)返回一個(gè)請(qǐng)求頭域的值。(譯者注:與上一個(gè)方法不同的是,該方法返回一個(gè)字符串)

2.HttpServletResponse

HttpServletResponse 表示所有響應(yīng)的信息,需要設(shè)置返回給客戶(hù)端的信息,通過(guò) HttpServletResponse 對(duì)象來(lái)進(jìn)行設(shè)置即可,會(huì)用幾個(gè)核心API就夠了

addHeader(String name,String value)將指定的名字和值加入到響應(yīng)的頭信息中
encodeURL(String url)編碼指定的URL
setStatus(int sc)給當(dāng)前響應(yīng)設(shè)置狀態(tài)碼
setHeader(String name,String value)將給出的名字和值設(shè)置響應(yīng)的頭部

六.請(qǐng)求轉(zhuǎn)發(fā)模型

先前在網(wǎng)頁(yè)中輸出hello java!只是一次請(qǐng)求對(duì)應(yīng)一個(gè)Servlet,瀏覽器——Tomcat——Servlet沒(méi)有實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā),而在真實(shí)環(huán)境中網(wǎng)站不可能只進(jìn)行一次交互,往往需要在一次請(qǐng)求中使用到多個(gè)servlet完成

1.一個(gè) web 資源收到客戶(hù)端請(qǐng)求后,通知服務(wù)器去調(diào)用另外 一個(gè) web 資源進(jìn)行處理

2. HttpServletRequest 對(duì)象(也叫 Request 對(duì)象)提供了一個(gè) getRequestDispatcher 方法,該 方法返回一個(gè) RequestDispatcher 對(duì)象,調(diào)用這個(gè)對(duì)象的 forward 方法可以實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)

3. request 對(duì)象同時(shí)也是一個(gè)域?qū)ο?,開(kāi)發(fā)人員通過(guò) request 對(duì)象在實(shí)現(xiàn)轉(zhuǎn)發(fā)時(shí),把數(shù)據(jù) 通過(guò) request 對(duì)象帶給其它 web 資源處理

在實(shí)際場(chǎng)景中,用戶(hù)輸入信息提交后得到反饋這一過(guò)程就是典型的請(qǐng)求轉(zhuǎn)發(fā),就像這樣:

第一個(gè)Servlet里的情況

@WebServlet("/demo2")
public class Sevdemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("這里是demo2~~");
        //存儲(chǔ)數(shù)據(jù)
        req.setAttribute("懶羊羊","你好!");
        //請(qǐng)求轉(zhuǎn)發(fā)
        req.getRequestDispatcher("/demo3").forward(req,resp);
    }
}

第二個(gè)Servlet里的情況

@WebServlet("/demo3")
public class Sevdemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("這里是demo3~~");
        Object msg= req.getAttribute("懶羊羊");
        System.out.println(msg);
    }
}

當(dāng)我啟動(dòng)Tomcat來(lái)訪問(wèn)demo2時(shí):

實(shí)現(xiàn)了請(qǐng)求的轉(zhuǎn)發(fā)!

既然是一個(gè)Servlet轉(zhuǎn)發(fā)給另一個(gè)Servlet,且是部署在同一個(gè)Tomcat中,那就說(shuō)明不能訪問(wèn)當(dāng)前web工程外的資源、同一次 HTTP 請(qǐng)求中,進(jìn)行多次轉(zhuǎn)發(fā),仍然是一次 HTTP 請(qǐng)求

七.請(qǐng)求重定向

和請(qǐng)求轉(zhuǎn)發(fā)比較類(lèi)似,請(qǐng)求重定向指:一個(gè) web 資源收到客戶(hù)端請(qǐng)求后,通知客戶(hù)端去訪問(wèn)另外一個(gè) web 資源,這稱(chēng)之為請(qǐng)求重定向,還是通過(guò)API調(diào)方法來(lái)實(shí)現(xiàn),基本流程如下:

首先通過(guò)setStatus()設(shè)置響應(yīng)狀態(tài)碼,然后setHeader(“location”,“http://www.taobao.com”)設(shè)置新地址

就實(shí)現(xiàn)了請(qǐng)求重定向

@WebServlet("/demo2")
public class Sevdemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("這里是demo2~~");
        //設(shè)置響應(yīng)狀態(tài)碼
        resp.setStatus(302);
        //設(shè)置新地址
        resp.setHeader("location","http://www.taobao.com")
    }
}

還有第二種方法,其實(shí)和這也大同小異

到這里動(dòng)態(tài)web的核心Servlet就介紹完了

內(nèi)容以及配圖都是作者原創(chuàng),若是覺(jué)得不錯(cuò)的話可以三連一下,懶羊羊蟹蟹你~

到此這篇關(guān)于Javaweb動(dòng)態(tài)開(kāi)發(fā)最重要的Servlet詳解的文章就介紹到這了,更多相關(guān)Javaweb Servlet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

醴陵市| 沁阳市| 合水县| 扎兰屯市| 旌德县| 鹤岗市| 苍梧县| 郓城县| 仁化县| 文登市| 阿坝县| 无锡市| 沂南县| 桂林市| 清镇市| 巴南区| 漯河市| 宁波市| 新泰市| 永平县| 池州市| 诸暨市| 上高县| 巩留县| 黎平县| 石嘴山市| 乐山市| 衡东县| 高阳县| 万年县| 邢台市| 吉木萨尔县| 通江县| 时尚| 衡东县| 宜兴市| 惠州市| 呈贡县| 碌曲县| 金秀| 宁陕县|