1.1Servlet的開發(fā)
Servlet是個(gè)特殊的Java類番枚,這個(gè)Java類必須繼承HttpServlet忽肛。每個(gè)Servlet可以響應(yīng)客戶端的請(qǐng)求村砂。
Servlet響應(yīng)客戶端請(qǐng)求的方法:
- doGet:用于響應(yīng)客戶端的GET請(qǐng)求。
- doPost:用于響應(yīng)客戶端的Post請(qǐng)求屹逛。
- doPut:用于響應(yīng)客戶端的Put請(qǐng)求础废。
- doDelete:用于響應(yīng)客戶端的Delete請(qǐng)求汛骂。
大部分時(shí)候Servlet對(duì)于所有的請(qǐng)求響應(yīng)都完全一樣,可以通過重寫service()方法即可響應(yīng)客戶端的所有請(qǐng)求评腺。
HttpServlet包含兩個(gè)方法:
- init(ServletConfig config):創(chuàng)建Servlet實(shí)例帘瞭,調(diào)用該方法初始化Servlet資源。
- destroy():銷毀Servlet實(shí)例蒿讥,自動(dòng)調(diào)用該方法回收資源蝶念。
不用為Servlet類實(shí)例編寫構(gòu)造器,如果要對(duì)Servlet執(zhí)初始化操作诈悍,應(yīng)該將初始化操作放在init()方法中祸轮,如果重寫了init()方法,應(yīng)該在init()方法的第一行調(diào)用super.init(config)侥钳。
Servlet和JSP的區(qū)別:
- Servlet中沒有內(nèi)置對(duì)象适袜,原來的JSP中的內(nèi)置對(duì)象都須要由程序顯示創(chuàng)建。
- 對(duì)于靜態(tài)的HTML標(biāo)簽Servlet都須要通過輸出流來逐行輸出舷夺。
Servlet中的service()方法的作用類似JSP生成的Servlet類的_jspService()方法苦酱。因此原JSP頁面的JSP腳本、靜態(tài)HTML內(nèi)容给猾,在普通Servlet里都應(yīng)該轉(zhuǎn)換成service()方法的代碼或輸出語句疫萤;原JSP聲明中的內(nèi)容,對(duì)應(yīng)在Servlet中定義的成員變量或成員方法敢伸。
1.2Servlet的配置
Servlet源文件并不能響應(yīng)用戶的請(qǐng)求扯饶,還必須要將其編譯成class文件。將編譯后的源文件放在WEB-INF/classes路徑下池颈,如果Servlet有包尾序,應(yīng)該講Class文件放在對(duì)應(yīng)的包路徑下。
如果需要采用javac來編譯Servlet類躯砰,必須將Servlet AP接口和類添加到系統(tǒng)的CLASSPATH環(huán)境變量中每币。
從Servlet3.0開始,配置Servlet有兩種方式:
- 在Servlet類中使用@WebServlet注解進(jìn)行配置琢歇。
- 通過web.xml進(jìn)行配置兰怠。
使用注解配置Servlet:
- 不要在web.xml文件根元素中指定metatata-complete="true"。
- 不要在web.xml文件中配置該Servlet李茫。
web.xml中配置Servlet:
- 配置Servlet的名字:對(duì)應(yīng)web.xml中的<servlet/>元素揭保。
- 配置Servlet的URL:對(duì)應(yīng)web.xml中的<servlet-mapping/>元素。
web.xml
<!--配置Servlet的名字-->
<servlet>
<!--指定Servlet名字涌矢,相當(dāng)于@WebServlet的name屬性-->
<servlet-name>servlet</servlet-name>
<!--指定Servlet的實(shí)現(xiàn)類-->
<servlet-class>servlet</servlet-class>
</servlet>
<!--配置Servlet的URL-->
<servlet-mapping>
<!--指定Servlet的名字-->
<servlet-name>servlet</servlet-name>
<!--指定Servlet映射的URL地址掖举,相當(dāng)于@WebServlet中的urlPatterns屬性-->
<servlet-mapping>/aa</servlet-mapping>
</servlet-mapping>
1.3JSP/Servlet的生命周期
創(chuàng)建Servlet實(shí)例有兩個(gè)時(shí)機(jī):
- 客戶端第一次請(qǐng)求每個(gè)Servlet是,系統(tǒng)創(chuàng)建該Servlet實(shí)例。
- Web應(yīng)用啟動(dòng)時(shí)立即創(chuàng)建Servlet實(shí)例塔次,即load-on-startup Servlet方篮。
Servlet的生命周期:
- 創(chuàng)建Servlet實(shí)例。
- Web容器調(diào)用Servlet的init()方法励负,對(duì)Servlet進(jìn)行實(shí)例化藕溅。
- Servlet初始化后,將一直存在于容器中继榆,用于響應(yīng)客戶端的請(qǐng)求巾表。
- Web容器調(diào)用Servlet的destroy方法在關(guān)閉Servlet時(shí)銷毀Servlet。
1.4load-on-startup Servlet
應(yīng)用啟動(dòng)時(shí)就創(chuàng)建Servlet略吨,通常用于有些后臺(tái)的Servlet集币,或者需要攔截很多的請(qǐng)求的Servlet,這種Servlet通常作為應(yīng)用的基礎(chǔ)Servlet使用翠忠,提供重要的后臺(tái)服務(wù)鞠苟。
配置load-on-startup的Servlet有兩種方式:
- 在web.xml中通過<servlet.../>元素的<load-on-startup.../>子元素進(jìn)行配置。
- 通過@WebServlet注解的loadOnStartup屬性指定秽之。
<load-on-startup.../>元素只接收一個(gè)整形值当娱,值越小,Servlet就越先實(shí)例化考榨。
web.xml:
<servlet>
<!--指定Servlet名字跨细,相當(dāng)于@WebServlet的name屬性-->
<servlet-name>servlet</servlet-name>
<!--指定Servlet的實(shí)現(xiàn)類-->
<servlet-class>servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
1.5訪問Servlet的配置參數(shù)
為Servlet配置參數(shù)有兩種方式:
- 通過@WebServlet的initParams屬性來指定。
- 通過在web.xml文件的<servlet.../>元素中添加<init-param.../>子元素來指定河质。
訪問Servlet配置參數(shù)通過ServletConfig對(duì)象來完成冀惭,JSP的內(nèi)置對(duì)象config就是此處的ServletConfig,ServletConfig提供如下方法:
- String getInitParameter(String name):用于獲取初始化參數(shù)掀鹅。
ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣云头,只是ServletConfig是取得當(dāng)前Servlet的配置參數(shù),而ServletContext是獲取整個(gè)Web應(yīng)用的配置參數(shù)淫半。
1.6使用Servlet作為控制器
使用Servlet作為表現(xiàn)層的三大劣勢(shì):
- 開發(fā)效率低,所有的HTML標(biāo)簽都續(xù)使用頁面輸出流完成匣砖。
- 不利于團(tuán)隊(duì)開發(fā)科吭。
- 程序維護(hù)性差。
JSP作為表現(xiàn)層技術(shù)的作用:
- 負(fù)責(zé)收集用戶請(qǐng)求參數(shù)猴鲫。
- 將應(yīng)用的處理結(jié)果对人、狀態(tài)數(shù)據(jù)呈現(xiàn)給用戶。
Servlet的作用類似于調(diào)度員拂共,充當(dāng)控制器角色牺弄。
JavaBean充當(dāng)Model,所有的業(yè)務(wù)邏輯宜狐、數(shù)據(jù)邏輯都在