亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Servlet開發技術基礎

2024-07-13 10:14:49
字體:
來源:轉載
供稿:網友

一、Servlet概述

1.sun公司提供的動態web資源開發技術。本質是上一段java小程序,要求這個小程序必須實現Servlet接口,以便服務器能夠調用。

2.開發Servlet的兩個步驟

*實驗:Servlet的快速入門

(1)步驟一:寫一個java程序實現Servlet接口(此處直接繼承了默認實現類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應用的 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開發Servlet

二、Servlet的詳述

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

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

3.Servlet接口的繼承結構

Servlet接口:定義了一個servlet應該具有的方法,所有的Servlet都應該直接或間接實現此接口

|

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

|

|----HttpServlet:對HTTP協議進行了優化的Servlet,繼承自GenericServlet類,并且實現了其中的service抽象方法,默認的實現中判斷了請求的請求方式,并根據請求方式的不同分別調用不同的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>可以對應多個<servlet-mapping>

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

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

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

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

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

4.6servlet的線程安全問題

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

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

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

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

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

4.6.2解決方法

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

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

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

三、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中寫死的內容可以配置到此處。

四、ServletContext

1.代表當前web應用的對象。

2.作為域對象使用,在不同servlet之間傳遞數據,作用范圍是整個web應用

生命周期:當web應用被加載進容器時創建代表整個web應用的ServletContext對象。當服務器關閉或web應用被移除出容器時,ServletContext對象跟著銷毀。

~域:一個域就理解為一個框,這里面可以放置數據,一個域既然稱作域,他就有一個可以被看見的范圍,這個范圍內都可以對這個域中的數據進行操作,那這樣的對象就叫做域對象。

3.在web.xml可以配置整個web應用的初始化參數,利用ServletContext去獲得

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

4.在不同servlet之間進行轉發

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

方法執行結束,service就會返回到服務器,再有服務器去調用目標servlet,其中request會重新創建,并將之前的request的數據拷貝進去。

5.讀取資源文件

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

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

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

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

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

總結

以上就是本文關于淺談Servlet開發技術基礎的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级高清免费播放| 国产成人精品一区二区三区| 亚洲国产精品嫩草影院久久| 成人网在线观看| 97精品国产97久久久久久| 亚洲综合成人婷婷小说| 一区二区欧美日韩视频| 亚洲精品国产suv| 黄色一区二区在线| 亚洲一区二区三区在线视频| 亚洲日本欧美日韩高观看| 亚洲天堂色网站| 欧洲午夜精品久久久| 日韩成人高清在线| 91精品久久久久久综合乱菊| 国产97在线播放| 中文字幕9999| 亚洲精品美女久久久| 欧美日韩在线视频一区| 亚洲最大的成人网| 亚洲欧美日韩另类| 亚洲精品在线视频| 欧美精品手机在线| 热99精品里视频精品| 亚洲第一视频网| 欧洲亚洲女同hd| 亚洲国产小视频在线观看| 色偷偷综合社区| 国产欧美精品一区二区三区介绍| 97精品国产91久久久久久| 精品久久久久久中文字幕一区奶水| 久久亚洲电影天堂| 成人免费自拍视频| 在线亚洲午夜片av大片| 精品一区二区亚洲| 亚洲三级黄色在线观看| 中文字幕精品网| 色偷偷偷亚洲综合网另类| 久久久久久69| 国产精品都在这里| 中文字幕亚洲欧美一区二区三区| 中文字幕在线成人| 国产在线播放不卡| 91极品视频在线| 日韩精品中文字幕在线播放| 日本中文字幕成人| 国产精品大片wwwwww| 伊人久久精品视频| 成人av在线网址| 亚洲电影免费观看高清完整版在线观看| 亚洲丝袜av一区| 啪一啪鲁一鲁2019在线视频| 成人午夜小视频| 自拍偷拍亚洲欧美| 九九热这里只有精品免费看| 中文字幕欧美视频在线| 成人在线免费观看视视频| 国产精品久久久久久久美男| 国产精品ⅴa在线观看h| 日韩精品福利在线| 日本人成精品视频在线| 欧美三级xxx| 日韩av中文在线| 国产精品女主播| 欧美激情国产精品| 亚洲第一福利网| 欧美日韩在线第一页| 亚洲人成自拍网站| 日韩www在线| 精品久久久久久久久久久久久| 成人在线精品视频| 欧美麻豆久久久久久中文| 视频一区视频二区国产精品| 久久久国产精彩视频美女艺术照福利| 黑人与娇小精品av专区| 国产91热爆ts人妖在线| 亚洲一区二区久久久| 国产精品视频xxx| 国产日韩在线亚洲字幕中文| 欧美激情视频给我| 一区二区三区在线播放欧美| 亚洲成人av片在线观看| 国产+成+人+亚洲欧洲| 欧美大秀在线观看| 亚洲va男人天堂| 九九热精品视频在线播放| 亚洲精品女av网站| 美女999久久久精品视频| 久久久久久久久久久成人| 性色av一区二区三区红粉影视| 81精品国产乱码久久久久久| 国产福利精品视频| 久久久97精品| 久久手机免费视频| 久久精品亚洲热| 日韩网站在线观看| 精品在线小视频| 欧美老女人性生活| 欧美日韩亚洲视频一区| 国产一区二区三区视频| 国产美女91呻吟求| 亚洲福利视频二区| 国产精品久久久久久久久久东京| 亚洲天堂成人在线视频| 亚洲一区二区三区香蕉| 国产精品国产三级国产aⅴ9色| 国产欧美韩国高清| 欧美大片va欧美在线播放| zzjj国产精品一区二区| 91日本在线观看| 亚洲午夜色婷婷在线| 亚洲激情在线观看| 国产精品99久久久久久人| 日韩电影在线观看中文字幕| 97视频在线观看视频免费视频| 国产精品久久网| 国内精品久久久久影院 日本资源| 欧美体内谢she精2性欧美| 亚洲欧美日韩一区二区三区在线| 97精品一区二区视频在线观看| 欧美在线亚洲在线| 亚洲国产精品中文| 久久人人看视频| 色综合久久天天综线观看| 国产亚洲精品久久久久久777| 久久久精品国产网站| 国产精品网站入口| 久久精品视频中文字幕| 国产亚洲一区二区精品| 亚洲欧洲av一区二区| 日韩黄色在线免费观看| 亚洲高清久久网| 国产精品免费久久久久影院| 日韩一二三在线视频播| 国产精品美女久久久久久免费| 久久九九热免费视频| 亚洲精品国产精品国自产观看浪潮| 日韩精品视频中文在线观看| 亚洲摸下面视频| 亚洲精品av在线| 午夜精品一区二区三区在线视频| 欧美激情按摩在线| 69久久夜色精品国产69| 国产在线不卡精品| 日韩一区二区福利| 亚洲欧美资源在线| 久久久精品在线观看| 4438全国成人免费| 日韩中文有码在线视频| 国产在线a不卡| 亚洲精品一区中文字幕乱码| 亚洲人成电影网站| 久久99视频免费| 中文字幕亚洲欧美日韩2019| 亚洲欧美日韩一区二区在线| 国产精品中文字幕在线观看| 韩国精品美女www爽爽爽视频| 欧美疯狂xxxx大交乱88av| 日韩av三级在线观看| 国产亚洲欧洲黄色| 成人亚洲欧美一区二区三区| 久久精品视频免费播放| 色综合久久久久久中文网| 亚洲午夜av久久乱码|