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

淺談Servlet開(kāi)發(fā)技術(shù)基礎(chǔ)

 更新時(shí)間:2017年12月18日 09:45:29   作者:escdelete  
這篇文章主要介紹了淺談Servlet開(kāi)發(fā)技術(shù)基礎(chǔ),具有一定借鑒價(jià)值,需要的朋友可以參考下。

一、Servlet概述

1.sun公司提供的動(dòng)態(tài)web資源開(kāi)發(fā)技術(shù)。本質(zhì)是上一段java小程序,要求這個(gè)小程序必須實(shí)現(xiàn)Servlet接口,以便服務(wù)器能夠調(diào)用。

2.開(kāi)發(fā)Servlet的兩個(gè)步驟

*實(shí)驗(yàn):Servlet的快速入門(mén)

(1)步驟一:寫(xiě)一個(gè)java程序?qū)崿F(xiàn)Servlet接口(此處直接繼承了默認(rèn)實(shí)現(xiàn)類(lèi)GenericServlet)

package cn.itheima;
import java.io.*;
import javax.servlet.*;
public class FirstServlet extends GenericServlet{
	public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
		res.getOutputStream().write("My FirstServlet!".getBytes());
	}
}

(2)將編譯好的帶包的.class放到WEB-INF/classes下以外,還要配置web應(yīng)用的 web.xml注冊(cè)Servlet

<servlet>
  <servlet-name>FirstServlet</servlet-name>
  <servlet-class>cn.itheima.FirstServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>FirstServlet</servlet-name>
  <url-pattern>/FirstServlet</url-pattern>
 </servlet-mapping>

3.利用MyEclipse開(kāi)發(fā)Servlet

二、Servlet的詳述

1.生命周期:一件事物什么時(shí)候生,什么時(shí)候死,在生存期間必然會(huì)做的事情,所有這些放在一起就是該事物的聲明周期。

2.Servlet的生命周期:通常情況下,servlet第一次被訪問(wèn)的時(shí)候在內(nèi)存中創(chuàng)建對(duì)象,在創(chuàng)建后立即調(diào)用init()方法進(jìn)行初始化。對(duì)于每一次請(qǐng)求都掉用service(req,resp)方法處理請(qǐng)求,此時(shí)會(huì)用Request對(duì)象封裝請(qǐng)求信息,并用Response對(duì)象(最初是空的)代表響應(yīng)消息,傳入到service方法里供使用。當(dāng)service方法處理完成后,返回服務(wù)器服務(wù)器根據(jù)Response中的信息組織稱(chēng)響應(yīng)消息返回給瀏覽器。響應(yīng)結(jié)束后servlet并不銷(xiāo)毀,一直駐留在內(nèi)存中等待下一次請(qǐng)求。直到服務(wù)器關(guān)閉或web應(yīng)用被移除出虛擬主機(jī),servlet對(duì)象銷(xiāo)毀并在銷(xiāo)毀前調(diào)用destroy()方法做一些善后的事情。

3.Servlet接口的繼承結(jié)構(gòu)

Servlet接口:定義了一個(gè)servlet應(yīng)該具有的方法,所有的Servlet都應(yīng)該直接或間接實(shí)現(xiàn)此接口

|

|----GenericServlet:對(duì)Servlet接口的默認(rèn)實(shí)現(xiàn),通用Servlet,這是一個(gè)抽象類(lèi),其中的大部分方法都做了默認(rèn)實(shí)現(xiàn),只有service方法是一個(gè)抽象方法需要繼承者自己實(shí)現(xiàn)

|

|----HttpServlet:對(duì)HTTP協(xié)議進(jìn)行了優(yōu)化的Servlet,繼承自GenericServlet類(lèi),并且實(shí)現(xiàn)了其中的service抽象方法,默認(rèn)的實(shí)現(xiàn)中判斷了請(qǐng)求的請(qǐng)求方式,并根據(jù)請(qǐng)求方式的不同分別調(diào)用不同的doXXX()方法。通常我們直接繼承HttpServlet即可

4.web.xml注冊(cè)Servlet的注意事項(xiàng)

4.1利用<servlet><servlet-mapping>標(biāo)簽注冊(cè)一個(gè)Servlet

<servlet>
  <servlet-name>FirstServlet</servlet-name>
  <servlet-class>cn.itheima.FirstServlet</servlet-class>

注意:此處要的是一個(gè)Servlet的完整類(lèi)名,不是包含.java或.class擴(kuò)展的文件路徑

</servlet>
 <servlet-mapping>
  <servlet-name>FirstServlet</servlet-name>
  <url-pattern>/FirstServlet</url-pattern>
 </servlet-mapping>

4.2一個(gè)<servlet>可以對(duì)應(yīng)多個(gè)<servlet-mapping>

4.3可以用*匹配符配置<serlvet-mapping>,但是要注意,必須是*.do或者/開(kāi)頭的以/*結(jié)束的路徑。

~由于匹配符的引入有可能一個(gè)虛擬路徑會(huì)對(duì)應(yīng)多個(gè)servlet-mapping,此時(shí)哪個(gè)最像找哪個(gè)servlet,并且*.do級(jí)別最低。

4.4可以為<servlet>配置<load-on-startup>子標(biāo)簽,指定servlet隨著服務(wù)器的啟動(dòng)而加載,其中配置的數(shù)值指定啟動(dòng)的順序

servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

4.5缺省servlet:如果一個(gè)servlet的對(duì)外訪問(wèn)路徑被設(shè)置為/,則該servlet就是一個(gè)缺省servlet,其他servlet不處理的請(qǐng)求都由它來(lái)處理

~在conf/web.xml中配置了缺省servlet,對(duì)靜態(tài)資源的訪問(wèn)和錯(cuò)誤頁(yè)面的輸出就是由這個(gè)缺省servlet來(lái)處理的。如果我們自己寫(xiě)一個(gè)缺省servlet把爸爸web.xml中的缺省servlet覆蓋的話(huà),會(huì)導(dǎo)致靜態(tài)web資源無(wú)法訪問(wèn)。所以不推薦配置。

4.6servlet的線(xiàn)程安全問(wèn)題

4.6.1由于通常情況下,一個(gè)servlet在內(nèi)存只有一個(gè)實(shí)例處理請(qǐng)求,當(dāng)多個(gè)請(qǐng)求發(fā)送過(guò)來(lái)的時(shí)候就會(huì)有多個(gè)線(xiàn)程操作該servlet對(duì)象,此時(shí)可能導(dǎo)致線(xiàn)程安全問(wèn)題。

(1)serlvet的成員變量可能存在線(xiàn)程安全問(wèn)題

*實(shí)驗(yàn):定義一個(gè)成員變量inti=0;在doXXX()方法中進(jìn)行i++操作并輸出i值到客戶(hù)端,此時(shí)由于延遲可能導(dǎo)致線(xiàn)程安全問(wèn)題

(2)serlvet操作資源文件時(shí),多個(gè)線(xiàn)程操作同一文件引發(fā)線(xiàn)程安全問(wèn)題

*實(shí)驗(yàn):請(qǐng)求帶著一個(gè)參數(shù)過(guò)來(lái),servlet將請(qǐng)求參數(shù)寫(xiě)入到一個(gè)文件,再讀取該文件,將讀取到的值打印到客戶(hù)端上,有可能有線(xiàn)程安全問(wèn)題

4.6.2解決方法

(1)利用同步代碼塊解決問(wèn)題。缺陷是,同一時(shí)間同步代碼塊只能處理一個(gè)請(qǐng)求,效率很低下,所以同步代碼塊中盡量只包含核心的導(dǎo)致線(xiàn)程安全問(wèn)題的代碼。

(2)為該servlet實(shí)現(xiàn)SingleThreadModel接口,此為一個(gè)標(biāo)記接口,被標(biāo)記的servlet將會(huì)在內(nèi)存中保存一個(gè)servlet池,如果一個(gè)線(xiàn)程來(lái)了而池中沒(méi)有servlet對(duì)象處理,則創(chuàng)建一個(gè)新的。如果池中有空閑的servlet則直接使用。這并不能真的解決線(xiàn)程安全問(wèn)題。此接口已經(jīng)被廢棄。

(3)兩種解決方案都不夠完美,所以盡量不要在servlet中出現(xiàn)成員變量。

三、ServletConfig

1.代表servlet配置的對(duì)象,可以在web.xml中<servlet>中配置

<servlet>
 <servlet-name>Demo5Servlet</servlet-name>
 <servlet-class>cn.itheima.Demo5Servlet</servlet-class>
 <init-param>
 <param-name>data1</param-name>
 <param-value>value1</param-value>
 </init-param>
 </servlet>

然后在servlet中利用this.getServletConfig()獲取ServletConfig對(duì)象,該對(duì)象提供了getInitParameter()和getInitParameterNames()方法,可以遍歷出配置中的配置項(xiàng)。

不想在servlet中寫(xiě)死的內(nèi)容可以配置到此處。

四、ServletContext

1.代表當(dāng)前web應(yīng)用的對(duì)象。

2.作為域?qū)ο笫褂茫诓煌瑂ervlet之間傳遞數(shù)據(jù),作用范圍是整個(gè)web應(yīng)用

生命周期:當(dāng)web應(yīng)用被加載進(jìn)容器時(shí)創(chuàng)建代表整個(gè)web應(yīng)用的ServletContext對(duì)象。當(dāng)服務(wù)器關(guān)閉或web應(yīng)用被移除出容器時(shí),ServletContext對(duì)象跟著銷(xiāo)毀。

~域:一個(gè)域就理解為一個(gè)框,這里面可以放置數(shù)據(jù),一個(gè)域既然稱(chēng)作域,他就有一個(gè)可以被看見(jiàn)的范圍,這個(gè)范圍內(nèi)都可以對(duì)這個(gè)域中的數(shù)據(jù)進(jìn)行操作,那這樣的對(duì)象就叫做域?qū)ο蟆?/p>

3.在web.xml可以配置整個(gè)web應(yīng)用的初始化參數(shù),利用ServletContext去獲得

<context-param>
<param-name>param1</param-name>
<param-value>pvalue1</param-value>
</context-param>
this.getServletContext().getInitParameter("param1")
this.getServletContext().getInitParameterNames()

4.在不同servlet之間進(jìn)行轉(zhuǎn)發(fā)

this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request, response);

方法執(zhí)行結(jié)束,service就會(huì)返回到服務(wù)器,再有服務(wù)器去調(diào)用目標(biāo)servlet,其中request會(huì)重新創(chuàng)建,并將之前的request的數(shù)據(jù)拷貝進(jìn)去。

5.讀取資源文件

5.1由于相對(duì)路徑默認(rèn)相對(duì)的是java虛擬機(jī)啟動(dòng)的目錄,所以我們直接寫(xiě)相對(duì)路徑將會(huì)是相對(duì)于tomcat/bin目錄,所以是拿不到資源的。如果寫(xiě)成絕對(duì)路徑,當(dāng)項(xiàng)目發(fā)布到其他環(huán)境時(shí),絕對(duì)路徑就錯(cuò)了。

5.2為了解決這個(gè)問(wèn)題ServletContext提供了this.getServletContext().getRealPath("/1.properties"),給進(jìn)一個(gè)資源的虛擬路徑,將會(huì)返回該資源在當(dāng)前環(huán)境下的真實(shí)路徑。this.getServletContext().getResourceAsStream("/1.properties"),給一個(gè)資源的虛擬路徑返回到該資源真實(shí)路徑的流。

5.3當(dāng)在非servlet下獲取資源文件時(shí),就沒(méi)有ServletContext對(duì)象用了,此時(shí)只能用類(lèi)加載器

classLoader.getResourceAsStream("../../1.properties"),此方法利用類(lèi)加載器直接將資源加載到內(nèi)存中,有更新延遲的問(wèn)題,以及如果文件太大,占用內(nèi)存過(guò)大。

classLoader.getResource("../1.properties").getPath(),直接返回資源的真實(shí)路徑,沒(méi)有更新延遲的問(wèn)題。

總結(jié)

以上就是本文關(guān)于淺談Servlet開(kāi)發(fā)技術(shù)基礎(chǔ)的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Servlet會(huì)話(huà)技術(shù)基礎(chǔ)解析

以及本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 基于SpringBoot + Redis實(shí)現(xiàn)密碼暴力破解防護(hù)

    基于SpringBoot + Redis實(shí)現(xiàn)密碼暴力破解防護(hù)

    在現(xiàn)代應(yīng)用程序中,保護(hù)用戶(hù)密碼的安全性是至關(guān)重要的,密碼暴力破解是指通過(guò)嘗試多個(gè)密碼組合來(lái)非法獲取用戶(hù)賬戶(hù)的密碼,為了保護(hù)用戶(hù)密碼不被暴力破解,我們可以使用Spring Boot和Redis來(lái)實(shí)現(xiàn)一些防護(hù)措施,本文將介紹如何利用這些技術(shù)來(lái)防止密碼暴力破解攻擊
    2023-06-06
  • IDEA中Maven爆紅以及依賴(lài)下載失敗的最全解決方案

    IDEA中Maven爆紅以及依賴(lài)下載失敗的最全解決方案

    這篇文章主要介紹了IDEA中Maven爆紅,依賴(lài)下載失敗的最全解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Spring中ApplicationContextAware的使用方法詳解

    Spring中ApplicationContextAware的使用方法詳解

    ApplicationContextAware?通過(guò)它Spring容器會(huì)自動(dòng)把上下文環(huán)境對(duì)象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,這篇文章主要介紹了Spring中ApplicationContextAware的作用,需要的朋友可以參考下
    2023-03-03
  • Springboot獲取文件內(nèi)容如何將MultipartFile轉(zhuǎn)File

    Springboot獲取文件內(nèi)容如何將MultipartFile轉(zhuǎn)File

    本文給大家介紹Springboot獲取文件內(nèi)容,將MultipartFile轉(zhuǎn)File方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-01-01
  • Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題詳解

    Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • SpringBoot應(yīng)用部署到Tomcat中無(wú)法啟動(dòng)的解決方法

    SpringBoot應(yīng)用部署到Tomcat中無(wú)法啟動(dòng)的解決方法

    這篇文章主要介紹了SpringBoot應(yīng)用部署到Tomcat中無(wú)法啟動(dòng)的解決方法,需要的朋友可以參考下
    2017-09-09
  • Spring Security 安全認(rèn)證的示例代碼

    Spring Security 安全認(rèn)證的示例代碼

    這篇文章主要介紹了Spring Security 安全認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 淺談java的byte數(shù)組的不同寫(xiě)法

    淺談java的byte數(shù)組的不同寫(xiě)法

    下面小編就為大家?guī)?lái)一篇淺談java的byte數(shù)組的不同寫(xiě)法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • Mybatis-Plus將字段設(shè)置為null解決方法

    Mybatis-Plus將字段設(shè)置為null解決方法

    MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 詳解Java包裝類(lèi)及自動(dòng)裝箱拆箱

    詳解Java包裝類(lèi)及自動(dòng)裝箱拆箱

    這篇文章主要介紹了Java包裝類(lèi)及自動(dòng)裝箱拆箱,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

安仁县| 望谟县| 庆安县| 和政县| 和硕县| 安多县| 宁武县| 甘肃省| 英吉沙县| 神池县| 沙湾县| 哈尔滨市| 海伦市| 左权县| 广西| 平泉县| 凤阳县| 图木舒克市| 定结县| 剑阁县| 新干县| 闻喜县| 卫辉市| 镇雄县| 鸡西市| 巢湖市| 临武县| 商城县| 中山市| 大石桥市| 柳江县| 泰州市| 三原县| 佛教| 精河县| 洪雅县| 迭部县| 普格县| 开江县| 来宾市| 孟村|