本文內(nèi)容
什么是Servlet與Servlet是如何執(zhí)行的
了解Servlet實(shí)現(xiàn)關(guān)系
手動(dòng)和自動(dòng)開(kāi)發(fā)Servlet
servlet生命周期(面試)
servlet的配置(訪問(wèn)路徑/啟動(dòng)時(shí)加載)
ServletConfig對(duì)象API的使用
ServletContext對(duì)象API的使用
Response響應(yīng)對(duì)象的使用
Request請(qǐng)求對(duì)象的使用
簡(jiǎn)單說(shuō):
Servlet
response
request
目標(biāo):
1.Servlet(創(chuàng)建,配置,訪問(wèn),手動(dòng)和自動(dòng)創(chuàng)建和配置Servlet)
2.掌握Servlet的生命周期方法以及調(diào)用時(shí)機(jī)当辐;
掌握Servlet的訪問(wèn)路徑以及優(yōu)先級(jí)關(guān)系
3.掌握ServletContext對(duì)象
獲取web工程名(getContextPath())
獲取web項(xiàng)目下的文件資源;
InputStremm getResourseAsStream(“”)
String getRealPath(“”);
Class類(lèi)
getResourseAsStream(“”)
存值花颗、取值、移除值操作。
掌握HttpServletResponse對(duì)象重定向、響應(yīng)亂碼問(wèn)題的解決方法
掌握HttpServletRequest對(duì)象如何接受表單請(qǐng)求參數(shù);
掌握Request域?qū)ο蟠嬷档锞汀⑷≈怠⒁?除值的操作闷串;
掌握post請(qǐng)求瓮钥、get請(qǐng)求亂碼原因以及解決辦法
導(dǎo)入項(xiàng)目有嘆號(hào)(解決)
5.1 Servlet的概述
.理解什么是Servlet?
.如何創(chuàng)建一個(gè)Servlet烹吵?(了解)
1碉熄、Servlet:是運(yùn)行在 Web 服務(wù)器中的一個(gè)Java類(lèi)。通過(guò) HTTP協(xié)議接受客戶(hù)端的請(qǐng)求肋拔,同時(shí)也會(huì)給客戶(hù)端一個(gè)響應(yīng)锈津。
2.創(chuàng)建一個(gè)Servlet的思路:
a)創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)Servlet接口,實(shí)現(xiàn)接口里面的方法
b)配置我們定義的Servlet
5.2 Servlet的入門(mén)
創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)Servlet接口凉蜂,重寫(xiě)接口里面的方法
在web.xml中配置我們的Servlet
注意:
1.Servlet接口找不到
2.輸出中文是...
3.web.xml中 servlet-name要對(duì)應(yīng)上
4.<url-pattern>/hello</url-pattern>要以/開(kāi)頭
5.3 Servlet的執(zhí)行流程
理解Servlet的執(zhí)行流程琼梆,從而讀懂配置文件中的內(nèi)容。
打開(kāi)瀏覽器訪問(wèn),說(shuō)明
http://localhost:8080/web_test1/hello
6.1 Servlet的實(shí)現(xiàn)關(guān)系
SUN設(shè)計(jì)之初跃惫,是有野心叮叹,以后的互聯(lián)網(wǎng)不僅僅只使用http協(xié)議,可以通過(guò)GenericServlet實(shí)現(xiàn)爆存。HttpServlet是一個(gè)與協(xié)議相關(guān)的Servlet是專(zhuān)門(mén)用來(lái)處理HTTP協(xié)議的請(qǐng)求。通常編寫(xiě)一個(gè)Servlet一般都會(huì)讓這個(gè)Servlet繼承HttpServlet重寫(xiě)service方法蝗砾。
在service方法內(nèi)部根據(jù)請(qǐng)求方式不同執(zhí)行不同的doXXX的方法(get請(qǐng)求執(zhí)行doGet方法先较,如果是post請(qǐng)求就會(huì)執(zhí)行doPost方法)。
所以往往繼承了HttpServlet之后不需要重寫(xiě)service方法悼粮,只需要重寫(xiě)doGet和doPost方法即可闲勺。往往請(qǐng)求要處理的內(nèi)容的代碼都是一致的,所以需要讓doGet和doPost相互調(diào)
用可以簡(jiǎn)化編程扣猫。
6.2 Eclipse中使用Servlet模板
新建Servlet
完成Servlet的配置
查看web.xml文件,會(huì)自動(dòng)生成如下內(nèi)容:
1.1 Servlet的生命周期
.Servlet的生命周期方法有哪些菜循?
.Servlet的生命周期方法分別什么時(shí)候被調(diào)用?
Servlet生命周期總結(jié):
1.第一次訪問(wèn)servlet,servlet會(huì)被創(chuàng)建申尤,并將servlet對(duì)象常駐內(nèi)存癌幕,調(diào)用init方法進(jìn)行初始化操作,init方法只執(zhí)行一次昧穿。
2.開(kāi)啟一個(gè)線程勺远,調(diào)用service方法,用于處理來(lái)自瀏覽器端的請(qǐng)求时鸵,以后都是開(kāi)啟一個(gè)線程來(lái)處理瀏覽器端請(qǐng)求胶逢。(執(zhí)行多次)
3.當(dāng)tomcat服務(wù)器正常關(guān)閉時(shí),會(huì)調(diào)用destroy方法將servlet銷(xiāo)毀。
代碼參見(jiàn):web01\src\com\itheima\servlet\demo1\ServletDemo1.java
瀏覽器訪問(wèn):http://localhost:8080/web01/ServletDemo1
1.2 Servlet啟動(dòng)時(shí)加載的配置
.什么情況下需要設(shè)置啟動(dòng)服務(wù)器時(shí)加載Servlet初坠?
.如何設(shè)置Servlet的啟動(dòng)時(shí)加載和簸?
1、當(dāng)初始化一個(gè)Servlet的時(shí)間比較長(zhǎng)的時(shí)候碟刺,第一個(gè)訪問(wèn)的用戶(hù)需要等上一段時(shí)間比搭,這樣一來(lái)用戶(hù)體驗(yàn)會(huì)非常差。所以我們可以在啟動(dòng)服務(wù)器的時(shí)候初始化Servlet南誊,服務(wù)器啟動(dòng)完了身诺,Servlet也就初始化完成了。
2抄囚、在web.xml中配置:
1.3 Servlet的訪問(wèn)路徑的配置
.訪問(wèn)路徑分為哪幾種霉赡?
.對(duì)于同一個(gè)Servlet,訪問(wèn)路徑的優(yōu)先級(jí)是怎樣的幔托?
1穴亏、訪問(wèn)路徑分為:全路徑匹配、目錄匹配重挑、擴(kuò)展名匹配嗓化,實(shí)際上目錄匹配也屬于全路徑匹配。
全路徑匹配:以/開(kāi)頭谬哀,例如:/ServletLife刺覆、/abc/ ServletLife; /a/b/c.do
目錄匹配:以/開(kāi)頭,結(jié)尾史煎;例如:/谦屑、/aaa/(代表任意字符);
擴(kuò)展名匹配:以開(kāi)頭篇梭,.xxx結(jié)尾氢橙,例如:.do、.abc恬偷;(x是任意字符)
像aaa.do是不合法的
注意:不能同時(shí)使用/開(kāi)頭悍手,.xxx結(jié)尾的路徑;例如: /.do 像:/aaa.do屬于全路徑匹配
2.全路徑匹配>目錄匹配>擴(kuò)展名匹配袍患,越精確優(yōu)先級(jí)越高坦康;
例如:
訪問(wèn)路徑:/website/aaa/demo1.do
完全:/aaa/demo1.do
目錄:/aaa/
擴(kuò)展名:.do
總結(jié):
完全路徑: /aaa/bbb, /hello
目錄匹配: /, /ccc/*
擴(kuò)展名匹配: *.do, .abc,.action
hello ,錯(cuò)誤
2.1 ServletConfig對(duì)象
.ServletConfig對(duì)象的作用是什么?
ServletConfig對(duì)象是用來(lái)獲取Servlet的一些配置信息的协怒,例如獲取Servlet的名稱(chēng)涝焙,Servlet的初始化參數(shù)…
注意:Servlet的配置信息都是在web.xml的Servlet標(biāo)簽里面配置的。
總結(jié):
ServletConfig對(duì)象(了解):保存了Servlet在web.XML中的配置信息
this.getServletConfig(); //獲取
Iterator
2.2 ServletContext對(duì)象之獲取web項(xiàng)目信息
.什么是ServletContext孕暇?
.ServletContext對(duì)象有什么作用仑撞?
1赤兴、ServletContext對(duì)象又稱(chēng)為Servlet的上下文對(duì)象,保存了整個(gè)web項(xiàng)目的信息隧哮,通過(guò)這個(gè)上下文對(duì)象可以保存或者獲取web項(xiàng)目的信息桶良。
一個(gè)web項(xiàng)目只有一個(gè)ServletContext對(duì)象,服務(wù)器會(huì)為每個(gè)項(xiàng)目創(chuàng)建一個(gè)ServletContext對(duì)象沮翔。
2陨帆、可以獲取文件的MIME類(lèi)型、全局參數(shù)采蚀、web項(xiàng)目工程名疲牵。
.獲取文件的MIME類(lèi)型(文件下載時(shí)要用):
conf/web.xml
.獲取web項(xiàng)目請(qǐng)求工程名:
.獲取全局初始化參數(shù):
要點(diǎn):
ServletContext:一個(gè)web應(yīng)用只有一個(gè),它保存的是本web應(yīng)用的配置信息
1.獲取mimeType,(文件下載時(shí)要用)
2.獲取web工程名
3.獲取全局初始化參數(shù)
3.1 ServletContext對(duì)象之讀取web項(xiàng)目下文件
之前使用IO流就可以讀取文件(java項(xiàng)目中)。現(xiàn)在是一個(gè)web項(xiàng)目榆鼠,web項(xiàng)目需要發(fā)布到tomcat下才能訪問(wèn)的纲爸。獲取web項(xiàng)目下的文件如果使用傳統(tǒng)的IO就會(huì)出現(xiàn)問(wèn)題(原因:路徑中使用的是相對(duì)路徑,相對(duì)的是JRE環(huán)境)妆够。
讀取文件的代碼實(shí)現(xiàn)
public interface ServletContext
path的值:
D:\apache-tomcat-7.0.53\webapps\web01\WEB-INF\classes\db.properties
補(bǔ)充:
web工程中,普通java類(lèi)如何讀取文件..
web項(xiàng)目讀取文件的方式三:
Class類(lèi):
InputStream getResourceAsStream(String name)
3.2 ServletContext對(duì)象之作為域?qū)ο蟠嫒?shù)據(jù)
.什么是域?qū)ο?
.ServletContext如何進(jìn)行存值识啦、取值和移除值?
1神妹、如果把一個(gè)數(shù)據(jù)存到某個(gè)對(duì)象身上颓哮,在多個(gè)地方又能通過(guò)這個(gè)對(duì)象取出來(lái),那么這個(gè)對(duì)象存的值就有了一定的作用范圍鸵荠,這個(gè)對(duì)象也就稱(chēng)為域?qū)ο竺崦ervletContext作為一個(gè)域?qū)ο螅淖饔梅秶钦麄€(gè)web項(xiàng)目腰鬼,因?yàn)榉?wù)器會(huì)為每個(gè)web項(xiàng)目創(chuàng)建一個(gè)ServletContext對(duì)象嵌赠,只要這個(gè)web項(xiàng)目在服務(wù)器上沒(méi)被移除或者服務(wù)器沒(méi)有關(guān)閉,那么ServletContext域?qū)ο缶痛嬖谙ㄉ模砩系臄?shù)據(jù)也就在。
2齿税、存值彼硫、取值和移除值的方法:
域?qū)ο?
1.作用域,作用范圍
i.web服務(wù)器啟動(dòng),ServletContext就會(huì)創(chuàng)建.
ii.web服務(wù)器停止或項(xiàng)目從服務(wù)器卸載,ServletContext就會(huì)銷(xiāo)毀
2.setAttribute(String,Object)
getAttribute(Stirng)
Servlet總結(jié):
1.手動(dòng)自動(dòng)配置Servlet
2.Servlet生命周期
3.配置servlet啟動(dòng)時(shí)加載
4.Servlet訪問(wèn)路徑的配置
5.獲取ServletConfig
6.獲取ServletContext
1.getMimeType()
2.全局參數(shù)
3.getRealPath(“/”)
4.getResourceAsStream(“/”)
5.作為域?qū)ο笫褂?setAttribute,getAttribute)
4.1 Response對(duì)象的概述
.什么是Response?
當(dāng)用戶(hù)通過(guò)瀏覽器去訪問(wèn)服務(wù)器之后凌箕,服務(wù)器會(huì)對(duì)瀏覽器做出一個(gè)回答(響應(yīng))拧篮,這個(gè)響應(yīng)里面包含了很多信息,這些信息會(huì)封裝成到Response對(duì)象身上牵舱,這個(gè)對(duì)象也成為響應(yīng)對(duì)象串绩。
4.2 Response對(duì)象的API講解
掌握幾個(gè)常用的方法:
1、setHeader()方法是設(shè)置一個(gè)key對(duì)應(yīng)一個(gè)value的響應(yīng)頭信息芜壁,設(shè)置的頭信息會(huì)替換原來(lái)的頭信息礁凡;addHeader()方法是設(shè)置一個(gè)key對(duì)應(yīng)多個(gè)value的響應(yīng)頭信息高氮,添加的頭信息會(huì)追加到原來(lái)的頭信息后面
2、HttpServletResponse對(duì)象常用的方法
4.3 Response對(duì)象的API的代碼演示
.讓頁(yè)面重定向有幾種方式顷牌?
重定向的2中方式:
解決頁(yè)面輸出中文亂碼和定時(shí)刷新頁(yè)面:
1.重定向
2.定時(shí)刷新
3.向?yàn)g覽器輸出中文
4.4 頁(yè)面定時(shí)跳轉(zhuǎn)的案例擴(kuò)展
.如何實(shí)現(xiàn)倒計(jì)時(shí)的功能剪芍?
主要是使用javascript里面的循環(huán)定時(shí)器來(lái)倒計(jì)時(shí)。
代碼參見(jiàn):web01\WebContent\response\demo1.html
訪問(wèn):http://localhost:8080/web01/response/demo1.html
5.1 Response對(duì)象響應(yīng)的中文亂碼處理
字符流是有緩沖區(qū)的窟蓝, response設(shè)計(jì)默認(rèn)的緩沖區(qū)編碼是ISO-8859-1罪裹,這個(gè)字符集不支持中文的。所以一定會(huì)出現(xiàn)亂碼問(wèn)題运挫,一旦出現(xiàn)亂碼問(wèn)題状共,我們只需要設(shè)置response字符流緩沖區(qū)的編碼和設(shè)置瀏覽器默認(rèn)打開(kāi)時(shí)候采用的字符集一致即可
總結(jié):
reponse響應(yīng)中文亂碼(記住下面的總結(jié)即可):
//1.向頁(yè)面輸出中文字符串
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你好!");
//2.向頁(yè)面輸出二進(jìn)制,文件
response.getOutputStream().write(byte[]);
- 注意:先設(shè)置編碼,后向頁(yè)面輸出
response.getWriter().print("你好!");
response.setContentType("text/html;charset=UTF-8");//放前面
5.2 Request對(duì)象的概述及API的介紹
.掌握獲取請(qǐng)求參數(shù)的方法
.掌握Request作為域?qū)ο蟠嬷怠⑷≈岛鸵瞥档姆椒?br> 1谁帕、獲取請(qǐng)求參數(shù)的方法:
Map<String,String[]>
2峡继、Request域存值、取值雇卷、移除值的方法:
5.3 Request對(duì)象的API的代碼演示
訪問(wèn):
結(jié)果:
6.1 Request對(duì)象接收表單請(qǐng)求參數(shù)
表單頁(yè)面:
接收請(qǐng)求參數(shù)
結(jié)果:
6.2 Request對(duì)象接收表單請(qǐng)求參數(shù)時(shí)中文亂碼處理
.post請(qǐng)求提交參數(shù)亂碼鬓椭,如何解決?
.get請(qǐng)求提交參數(shù)亂碼, 如何解決
1关划、post請(qǐng)求提交的參數(shù)是在請(qǐng)求體中傳遞的小染,數(shù)據(jù)會(huì)存放在request字符緩沖區(qū)里面,而緩沖區(qū)默認(rèn)編碼是iso-8859-1編碼贮折,所以我們只需要設(shè)置緩沖區(qū)編碼為utf-8即可裤翩。
2、get請(qǐng)求提交的參數(shù)是在地址欄中傳遞的額调榄,瀏覽器會(huì)對(duì)數(shù)據(jù)進(jìn)行一次編碼踊赠,數(shù)據(jù)發(fā)送到服務(wù)器之后,服務(wù)器默認(rèn)使用iso-8859-1進(jìn)行解碼每庆,這樣亂碼就產(chǎn)生了筐带。要知道我們程序是不應(yīng)該改瀏覽器和服務(wù)器的字符集,所以缤灵,我們只能倒著編碼和解碼一次就可獲得原來(lái)的字符伦籍。如下圖所示:
代碼演示:
request請(qǐng)求參數(shù)亂碼的解決:
//解決post亂碼
request.setCharacterEncoding("utf-8");
request.getParameter("name");
//解決get方式亂碼
String name = request.getParameter("name");
name = new String(name.getBytes("iso-8859-1"),"utf-8");
總結(jié):
Servlet
1.手動(dòng)和自動(dòng)創(chuàng)建Servlet,并配置,可以通過(guò)瀏覽器訪問(wèn)到
2.Servlet生命周期方法有哪些.何時(shí)執(zhí)行.
3.配置Servlet啟動(dòng)時(shí)加載
4.掌握Servlet 的URL的3種配置方式
5.獲取ServletConfig(了解)
6.獲取ServletContext
a.getMimeType()文件下載時(shí)使用
b.String getRealPath(“/”)
c.InputStream getResourceAsStream(“/”)
2)作為域?qū)ο笫褂?1.有3個(gè)方法setAttribute(String,Object),getAttribute(String),removeAttribute(String) 2.范圍多大)
Response
setStatus()
setHeader(“key”,”value”)
getWriter()
getOutputStream() ; //下載時(shí)用
sendRedirect(“path”);
setContentType(“text/html;charset=utf-8”);
Request
String getMethod();
getRemoteAddr();
getHeader(“User-Agent”);
String getParameter(String);
String[] getParameterValues(String)
Map<String,String[]> getParameterMap()
目標(biāo):
1.掌握Servlet的生命周期方法以及調(diào)用時(shí)機(jī);
掌握Servlet的訪問(wèn)路徑以及優(yōu)先級(jí)關(guān)系
2掌握ServletContext對(duì)象
獲取web工程名
獲取web項(xiàng)目下的文件資源腮出;
存值帖鸦、取值、移除值操作胚嘲。
3.掌握HttpServletResponse對(duì)象,重定向作儿、
響應(yīng)亂碼問(wèn)題的解決方法
4.掌握HttpServletRequest對(duì)象如何接受表單請(qǐng)求參數(shù);
掌握Request域?qū)ο蟠嬷挡雠⑷≈倒ッ獭⒁? 除值的操作晾嘶;
掌握post請(qǐng)求、get請(qǐng)求亂碼原因以及解決辦法
post
request.setCharactorEncoding(“utf-8”);
get:
new String(getParameter(“name”).getBytes(“iso-8859-1”),”utf-8”)
中文亂碼.
1.請(qǐng)求亂碼
①get
a.String name = request.getParameter(“username”);
b.name = new String(name.getBytes(“iso-8859-1”),”utf-8”);
②post
a.request.setCharacterEncoding(“utf-8”);
2.響應(yīng)中文亂碼
(1)response.setContentType(“text/html;charset=utf-8”);