欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、Servlet概述

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

2.開發(fā)Servlet的兩個步驟

*實驗:Servlet的快速入門

(1)步驟一:寫一個java程序?qū)崿F(xiàn)Servlet接口(此處直接繼承了默認實現(xiàn)類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注冊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開發(fā)Servlet

二、Servlet的詳述

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

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

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

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

|

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

|

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

4.web.xml注冊Servlet的注意事項

4.1利用<servlet><servlet-mapping>標簽注冊一個Servlet

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

注意:此處要的是一個Servlet的完整類名,不是包含.java或.class擴展的文件路徑

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

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

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

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

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

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:如果一個servlet的對外訪問路徑被設(shè)置為/,則該servlet就是一個缺省servlet,其他servlet不處理的請求都由它來處理

~在conf/web.xml中配置了缺省servlet,對靜態(tài)資源的訪問和錯誤頁面的輸出就是由這個缺省servlet來處理的。如果我們自己寫一個缺省servlet把爸爸web.xml中的缺省servlet覆蓋的話,會導致靜態(tài)web資源無法訪問。所以不推薦配置。

4.6servlet的線程安全問題

4.6.1由于通常情況下,一個servlet在內(nèi)存只有一個實例處理請求,當多個請求發(fā)送過來的時候就會有多個線程操作該servlet對象,此時可能導致線程安全問題。

(1)serlvet的成員變量可能存在線程安全問題

*實驗:定義一個成員變量inti=0;在doXXX()方法中進行i++操作并輸出i值到客戶端,此時由于延遲可能導致線程安全問題

(2)serlvet操作資源文件時,多個線程操作同一文件引發(fā)線程安全問題

*實驗:請求帶著一個參數(shù)過來,servlet將請求參數(shù)寫入到一個文件,再讀取該文件,將讀取到的值打印到客戶端上,有可能有線程安全問題

4.6.2解決方法

(1)利用同步代碼塊解決問題。缺陷是,同一時間同步代碼塊只能處理一個請求,效率很低下,所以同步代碼塊中盡量只包含核心的導致線程安全問題的代碼。

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

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

三、ServletConfig

1.代表servlet配置的對象,可以在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對象,該對象提供了getInitParameter()和getInitParameterNames()方法,可以遍歷出配置中的配置項。

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

四、ServletContext

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

2.作為域?qū)ο笫褂?,在不同servlet之間傳遞數(shù)據(jù),作用范圍是整個web應(yīng)用

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

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

3.在web.xml可以配置整個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之間進行轉(zhuǎn)發(fā)

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

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

5.讀取資源文件

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

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

5.3當在非servlet下獲取資源文件時,就沒有ServletContext對象用了,此時只能用類加載器

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

classLoader.getResource("../1.properties").getPath(),直接返回資源的真實路徑,沒有更新延遲的問題。

總結(jié)

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

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

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

相關(guān)文章

  • IDEA下載并大學生edu郵箱認證免費使用教程(圖文)

    IDEA下載并大學生edu郵箱認證免費使用教程(圖文)

    這篇文章主要介紹了IDEA下載并大學生edu郵箱認證免費使用教程(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 將SpringBoot的Jar注冊成Windows服務(wù)的實現(xiàn)方法

    將SpringBoot的Jar注冊成Windows服務(wù)的實現(xiàn)方法

    當前項目有個地圖編輯器,后端用的是SpringBoot框架,外網(wǎng)剛好有一臺空閑的Windows服務(wù)器就直接拿來用了,將Java程序部署成Windows服務(wù)可以用WinSW (Windows Service Wrapper)來實現(xiàn),文中有詳細的操作步驟,需要的朋友可以參考下
    2023-11-11
  • MyBatis sql中test如何判斷Boolean

    MyBatis sql中test如何判斷Boolean

    這篇文章主要介紹了MyBatis sql中test如何判斷Boolean,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringCloudAlibaba分布式組件詳解

    SpringCloudAlibaba分布式組件詳解

    這篇文章主要介紹了簡單了解Spring Cloud Alibaba分布式組件相關(guān)知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • java_String和StringBuffer區(qū)別分析

    java_String和StringBuffer區(qū)別分析

    JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串。
    2013-04-04
  • MyBatis-Plus與PageHelper依賴的jsqlparser庫沖突

    MyBatis-Plus與PageHelper依賴的jsqlparser庫沖突

    在升級SpringBoot到3.x版本的同時,升級MyBatis-Plus后發(fā)現(xiàn)PageHelper無法使用,原因是MyBatis-Plus和PageHelper都依賴jsqlparser庫,且PageHelper要求特定版本的jsqlparser,解決方法是在項目中排除這兩個庫的jsqlparser依賴,直接引用jsqlparser4.7版本
    2024-10-10
  • Java實現(xiàn)MD5消息摘要算法

    Java實現(xiàn)MD5消息摘要算法

    本篇文章主要介紹了Java實現(xiàn)MD5消息摘要算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringBoot如何統(tǒng)一JSON信息返回

    SpringBoot如何統(tǒng)一JSON信息返回

    這篇文章主要介紹了SpringBoot如何統(tǒng)一JSON信息返回問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java必學必會之equals方法

    java必學必會之equals方法

    java必學必會之equals方法,equals方法是 java.lang.Object 類的方法,想要了解更多關(guān)于equals方法的朋友,可以參考下文
    2015-12-12
  • java中幾種http請求方式示例詳解

    java中幾種http請求方式示例詳解

    在日常工作和學習中有很多地方都需要發(fā)送HTTP請求,下面這篇文章主要給大家介紹了關(guān)于java中幾種http請求方式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11

最新評論