




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二篇
JavaWeb技術篇JavaWeb開發從入門到實踐JavaWebDevelopmentFromIntroductiontoPracticeServlet技術Chap04提綱Servlet技術介紹Servlet的基本概念、生命周期和如何通過Web容器進行部署與管理。高級應用部分探討了Servlet的請求和響應機制,如何處理客戶端請求并生成相應的響應。4.1Servlet開發入門4.2Servlet高級應用4.3請求和響應4.4本章小結4.1Servlet開發入門4.1.1Servlet簡介4.1.2Servlet的常用接口和類4.1.3Servlet的配置4.1.4Servlet的生命周期4.1.1Servlet簡介圖4-1Servlet應用程序的體系結構Servlet是Server與Applet的縮寫,即服務器端小程序,是Sun公司提供的一門用于開發動態Web資源的技術。4.1.2Servlet的常用接口和類在Servlet編程中,ServletAPI提供了標準的接口和類。這些對象對Servlet的操作非常重要,它們為HTTP請求和程序響應提供了豐富的方法。圖
4-2Servlet結構體系的UML示意圖4.1.2Servlet的常用接口和類表
4-1Servlet接口的抽象方法publicinterfaceServlet{
voidinit(ServletConfigvar1)throwsServletException;
ServletConfiggetServletConfig();
voidservice(ServletRequestvar1,ServletResponsevar2)throwsServletException,IOException;StringgetServletInfo();
voiddestroy();
}方法聲明功能描述voidinit(ServletConfigvar1)負責Servlet的初始化工作ServletConfiggetServletConfig()調用init(ServletConfigvar1)方法時傳遞給Servlet的ServletConfigvoidservice(ServletRequestvar1,ServletResponsevar2)負責響應用戶的請求,當容器接收到客戶端訪問Servlet對象的請求時,就會調用此方法。StringgetServletInfo()返回Servlet的信息,例如,作者、版本等信息voiddestroy()負責釋放Servlet對象占用的資源4.1.3Servlet的配置配置web.xml文件<servlet>
<servlet-name>Servlet的名稱</servlet-name>
<servlet-class>Servlet的全限定類名(包括包名與類名)</servlet-class>
<init-param>
<param-name>初始化參數名稱</param-name>
<param-value>初始化參數值</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet的名稱(與上述<servlet>的<servlet-name>一致)</servlet-name><url-pattern>匹配規則(映射URL地址)</url-pattern>
</servlet-mapping>Servlet的配置4.1.3Servlet的配置使用@WebServlet注解@WebServlet(name="HelloServlet",urlPatterns="/HelloServlet")publicclassHelloServletextendsGenericServlet{
...
}Servlet的配置屬性聲明功能描述StringnameServlet的name屬性,相當于<servlet-name>String[]value相當于urlPatterns屬性。value和urlPatterns不能同時使用String[]urlPatterns指定一組Servlet的URL匹配模式,相當于<url-pattern>標簽IntloadOnStartupServlet加載順序,相當于<load-on-startup>標簽WebInitParam[]指定一組Servlet初始化參數,相當于<init-param>標簽StringdescriptionServlet的描述信息表4-2@WebService注解的常用屬性4.1.3Servlet的配置引入servlet-api.jar包選擇“File→ProjectStructure→Modules”,選中右側Dependencies標簽,點擊“+→JARsorDirectories...”在彈出的窗口中選中tomcat-10.0.27目錄lib下的servlet-api.jar包第一個Servlet程序圖
4-3引入servlet-api.jar包圖
4-4選擇servlet-api.jar包4.1.3Servlet的配置通過繼承Servlet接口的實現類jakarta.servlet.GenericServlet來實現Servlet程序packagecom.swxy.servlet;importjakarta.servlet.*;importjava.io.*;publicclassHelloServletextendsGenericServlet{
@Override
publicvoidservice(ServletRequestservletRequest,ServletResponseservletResponse)throwsServletException,IOException{//返回一個PrintWriter對象,Servlet使用它來輸出字符串形式的正文數據
PrintWriterout=servletResponse.getWriter();
out.println("HelloWorld");//輸出流對象向客戶端發送字符數據
}
}4.1.3Servlet的配置Servlet的配置:在web.xml中配置Servlet<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.swxy.servlet.HelloServlet</servlet-class></servlet><servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern></servlet-mapping>4.1.3Servlet的配置訪問Servlet:localhost:8080/servletDemo01/HelloServlet圖
4-5
第一個Servlet程序運行效果4.1.4Servlet的生命周期圖
4-6Servlet生命周期示意圖初始化階段(init方法)運行階段(service方法銷毀階段(destroy方法)4.1.4Servlet的生命周期packagecom.swxy.servlet;
//導入相關的包@WebServlet(name="LifeCycleServlet",urlPatterns="/LifeCycleServlet")publicclassLifeCycleServletextendsGenericServlet{
@Override
publicvoidinit()throwsServletException{
System.out.println("初始化方法");
}
@Override
publicvoidservice(ServletRequestservletRequest,ServletResponseservletResponse)throwsServletException,IOException{
System.out.println("service方法");
}
@Override
publicvoiddestroy(){
System.out.println("銷毀方法");
}
}4.1.4Servlet的生命周期測試:“localhost:8080/servletDemo01/LifeCycleServlet”初始化方法service方法刷新頁面,也就是第二次訪問service方法關閉Web服務器銷毀方法4.1.4Servlet的生命周期Servlet的工作原理Web服務器接收到一個HTTP請求后,判斷請求內容,若是靜態頁面,服務器自行處理,若是動態數據,則交給Servlet容器,Servlet容器找到對應的Servlet對象進行處理,處理結果交給Web服務器,再轉交給客戶端。同一個Servlet多次被訪問,只有第一次訪問時創建一個Servlet對象,后面請求只需開啟一個新的線程來處理請求。4.2Servlet高級應用4.2.1HttpServlet類4.2.2Servlet虛擬路徑的映射
4.2.3ServletConfig接口與ServletContext接口4.2.1HttpServlet類publicabstractclassHttpServletextendsGenericServlet{
...
privatestaticfinalStringMETHOD_GET="GET";
privatestaticfinalStringMETHOD_OPTIONS="OPTIONS";
privatestaticfinalStringMETHOD_POST="POST";
...
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{...}
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{...}
...
protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
Stringmethod=req.getMethod(); }
publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{
...
this.service(request,response);
}
}HttpServlet類的源碼部分代碼4.2.1HttpServlet類HttpServlet類的應用創建表單<htmllang="en">
<head>
<metacharset="UTF-8">
<title>表單頁面</title>
</head>
<body>
<formaction="HttpServletTest"method="post">
用戶名:<inputtype="text"name="username"/>
<inputtype="submit"value="提交"/>
</form>
</body>
</html>4.2.1HttpServlet類創建HttpServletTest類繼承HttpServlet使用@WebServlet注解配置Servletpackagecom.swxy.servlet;
//導入包
@WebServlet(urlPatterns="/HttpServletTest")
publicclassHttpServletTestextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ //設置響應正文的MIME類型和響應的字符集格式
resp.setContentType("text/html;charset=utf-8");
Stringusername=req.getParameter("username");
PrintWriterout=resp.getWriter();
out.println(username);}}
4.2.2Servlet虛擬路徑的映射在web.xml文件中,一個<servlet-mapping>標簽用于映射一個Servlet的對外訪問路徑,該路徑稱為虛擬路徑。Servlet的多重映射<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.swxy.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet01</url-pattern>
<url-pattern>/HelloServlet02</url-pattern>
</servlet-mapping>使用@WebServlet注解設置多重映射@WebServlet(urlPatterns={"/HelloServlet01","/HelloServlet02"})4.2.2Servlet虛擬路徑的映射虛擬路徑通配符的使用<url-pattern>/admin/*</url-pattern>虛擬路徑通配符示例格式舉例描述精確匹配/admin/servlet01只能匹配admin/servlet01路徑目錄匹配/admin/*匹配admin目錄下的所有路徑拓展名匹配*.do匹配以.do結束的路徑任意匹配/*匹配任意訪問路徑表4-3
通配符示例4.2.3ServletConfig接口與ServletContext接口ServletConfig接口publicinterfaceServletConfig{
StringgetServletName();
//返回Servlet的名字,即<servlet-name>元素的值
ServletContextgetServletContext();
//返回一個代表當前Web應用的ServletContext對象
StringgetInitParameter(Stringvar1);
//根據初始化參數名返回初始化參數值
Enumeration<String>getInitParameterNames();
//返回所有的初始化參數名
}4.2.3ServletConfig接口與ServletContext接口創建Servlet:在com.swxy.servlet包中創建一個名稱為Servlet01的Servlet類<servlet> <servlet-name>Servlet01</servlet-name> <servlet-class>com.swxy.servlet.Servlet01</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param></servlet><servlet-mapping> <servlet-name>Servlet01</servlet-name> <url-pattern>/Servlet01</url-pattern></servlet-mapping>案例:使用ServletConfig接口的getInitParameter()方法獲取Servlet的初始化參數在web.xml文件中配置Servlet4.2.3ServletConfig接口與ServletContext接口packagecom.swxy.servlet;importjakarta.servlet.ServletConfig;importjakarta.servlet.ServletException;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjava.io.IOException;publicclassServlet01extendsHttpServlet{ @Override publicvoidinit(ServletConfigservletConfig)throwsServletException{ Stringencoding=servletConfig.getInitParameter("encoding"); System.out.println(encoding);//輸出UTF-8 }}在Servlet01類中實現init(ServletConfigservletConfig)方法4.2.3ServletConfig接口與ServletContext接口ServletContext接口Tomcat啟動時會為每個Web應用創建一個唯一的ServletContext對象,該對象代表當前的Web應用,該對象封裝了當前Web應用的所有信息。表4-4
ServletContext接口常用方法及其描述方法描述StringgetInitParameter(Stringname)根據參數名稱獲取參數值EnumerationgetInitParameterNames()獲取當前應用中所有的參數名,返回EnumerationInputStreamgetResourceAsStream(Stringpath)返回某個資源文件的InputStream輸入流對象,路徑一般為"/WEB-INF/classes/資源”ObjectgetAttribute(Stringname)
獲取域對象中指定域屬性的值voidsetAttribute(Stringname,Objectobject)設置域屬性voidremoveAttribute(Stringname)移除域對象中指定的域屬性StringgetRealPath(Stringpath)獲取Web應用中資源的絕對路徑,參數path是該Web應用的相對地址4.2.3ServletConfig接口與ServletContext接口在web.xml文件中配置Web應用程序初始化參數<context-param>
<param-name>username</param-name>
<param-value>蔣亞平</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>獲取Web應用程序的初始化信息4.2.3ServletConfig接口與ServletContext接口在項目的com.swxy.servlet包中創建一個名為Servlet02的類//設置響應MIME類型和字符集格式resp.setContentType("text/html;charset=UTF-8");PrintWriterout=resp.getWriter();//獲取ServletContext對象ServletContextcontext=this.getServletContext();//獲取初始化參數名,返回Enumeration對象Enumeration<String>parameterNames=context.getInitParameterNames();//遍歷參數名while(parameterNames.hasMoreElements()){Stringname=parameterNames.nextElement();//根據初始化參數名(<param-name>元素的值),獲取參數值(<param-value>元素的值)Stringvalue=context.getInitParameter(name);out.println(name+":"+value+"<br/>");}4.2.3ServletConfig接口與ServletContext接口啟動Tomcat服務器,在瀏覽器地址欄中輸入“http://localhost:8080/servletDemo01/Servlet02”圖
4-7運行效果4.2.3ServletConfig接口與ServletContext接口讀取資源文件在項目src目錄中創建一個名為perties文件username=蔣亞平password=123456讀取資源文件perties
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
resp.setContentType("text/html;charset=UTF-8");
PrintWriterout=resp.getWriter();
ServletContextcontext=this.getServletContext();//獲得perties資源文件的輸入流對象
InputStreamin=context.getResourceAsStream("/WEB-INF/classes/perties");
Propertiesprops=newProperties();
//加載“輸入流”到Properties集合對象中
props.load(in);
out.println("username="+props.getProperty("username")+"<br/>");
out.println("password="+props.getProperty("password")+"<br/>");
}
4.3請求和響應4.3.1HttpServletResponse接口及其應用4.3.2HttpServletRequest接口及其應用
4.3.3RequestDispatcher接口及其應用圖
4-9
瀏覽器訪問Servlet的交互過程4.3.1HttpServletResponse接口及其應用發送與狀態碼相關的方法setStatus(intstatus)方法@WebServlet("/Servlet01")
publicclassServlet01extendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
resp.setStatus(404);//發送狀態碼404
}
}測試:地址欄輸入“http://localhost:8080/jspDemo/Servlet01”圖
4-10
查看響應頭的狀態碼4.3.1HttpServletResponse接口及其應用案例:服務器發送存在異常的響應狀態碼sendError(intse)方法@WebServlet("/Servlet02")publicclassServlet02extendsHttpServlet{ @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.sendError(404,"自定義錯誤信息:頁面不存在"); }}4.3.1HttpServletResponse接口及其應用案例:服務器發送存在異常的響應狀態碼測試:地址欄輸入“http://localhost:8080/jspDemo/Servlet02”圖
4-11sendError()方法運行結果4.3.1HttpServletResponse接口及其應用
發送與響應消息頭相關的方法表4-5設置HTTP響應頭字段的方法方法描述voidsetHeader(Stringname,Stringvalue)設定HTTP的響應頭字段,參數name用于指定響應頭字段的名稱,參數value用于指定響應頭字段的值voidaddHeader(Stringname,Stringvalue)voidsetIntHeader(Stringname,intvalue)設定HTTP的響應頭字段,只適用于響應字段的值為int類型時的響應消息頭的設置voidaddIntHeader(Stringname,intvalue)voidsetContentType(Stringtype)設置發送到客戶端的響應的內容類型,例如,text/html;charset=UTF-8voidsetCharacterEncoding(Stringcharset)設置輸出內容使用的字符編碼,例如,UTF-8、GB2312等protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//等價于resp.setContentType(“text/html;charset=UTF-8”)
resp.setHeader("Content-Type","text/html;charset=UTF-8");
}
4.3.1HttpServletResponse接口及其應用
發送與響應消息體相關的方法案例:同時使用OutputStream字節流和PrintWriter字符流發送響應消息體。@WebServlet("/Servlet04")
publicclassServlet04extendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
Stringmsg="Whateverisworthdoingisworthdoingwell.";
//獲取OutputStream對象,OutputStream是ServletOutputStream的父類
OutputStreamout=resp.getOutputStream();
out.write(msg.getBytes());
PrintWriterout1=resp.getWriter();//獲取PrintWriter對象
out1.print("Whateverisworthdoingisworthdoingwell.");
}
}4.3.1HttpServletResponse接口及其應用圖
4-12
同時調用getOutputStream()和getWriter()方法的運行結果4.3.1HttpServletResponse接口及其應用請求重定向圖
4-13
請求重定向的工作原理4.3.1HttpServletResponse接口及其應用protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//使用HttpServletRequest對象的getParameter()方法獲取表單數據
Stringusername=req.getParameter("username");
Stringpassword=req.getParameter("password");
if(username.equals("admin")&&password.equals("123456")){
//用戶名和密碼正確,重定向到welcome.html頁面
resp.sendRedirect("welcome.html");
}else{
//用戶名或密碼錯誤,重定向到login.html
resp.sendRedirect("login.html");
}
}
4.3.2HttpServletRequest接口及其應用
獲取請求行信息的相關方法表4-6獲取請求行信息的常用方法方法聲明功能描述StringgetMethod()獲取HTTP請求消息中的請求方法,例如,GET、POST、DELETE等StringBuffergetRequestURL()獲取HTTP請求的完整的URL(不包含參數部分)例如,http://localhost:8080/jspDemo/Servlet06StringgetRequestURI()獲取客戶端發出請求時的URI,端口號和“?”之間的內容,例如,/jspDemo/Servlet06StringgetQueryString()獲取請求行中的參數部分,“?”后面的所有內容StringgetProtocol()獲取請求行中的協議名和版本,例如,HTTP/1.14.3.2HttpServletRequest接口及其應用
獲取請求消息頭的相關方法表4-7
獲取請求信息頭的常用方法方法描述StringgetHeader(Stringname)獲取一個指定頭字段的值Enumeration<String>getHeaders(Stringname)根據請求頭字段的名稱獲取對應的請求字段的所有值,返回一個Enumeration集合對象Enumeration<String>getHeaderNames()獲取一個包含所有請求頭字段的Enumeration對象intgetIntHeader(Stringname)獲取一個指定頭字段的值,并將其轉換為int類型StringgetContentType()獲取Content-Type頭字段的值StringgetCharacterEncoding()獲取請求消息的實體部分的字符集編碼,通常從Content-Type頭字段中進行提取4.3.2HttpServletRequest接口及其應用獲取請求消息體的相關方法案例:實現注冊功能,使用getInputStream()方法獲取請求消息體protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
resp.setContentType("text/html;charset=UTF-8");//定義一個長度為1024的字節數組
byte[]buffer=newbyte[1024];//獲取輸入流
ServletInputStreaminputStream=req.getInputStream();
StringBuildersb=newStringBuilder();
intlen;
//循環讀取
while((len=inputStream.read(buffer))!=-1){
sb.append(newString(buffer,0,len));
}
System.out.println(sb);
}4.3.2HttpServletRequest接口及其應用中文亂碼protectedvoiddoPost(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶市渝北區六校聯盟2024-2025學年九年級下學期期中歷史試題(含答案)
- 投資分紅合同格式
- 2025年人教版中考模擬生物學試題 二(無答案)
- 遼寧省大連2022-2023學年八年級上學期期末物理試題1【含答案】
- 成人普通感冒診斷和治療臨床實踐指南解讀
- 臨床大面積腦梗護理常規
- 8《我們受特殊保護 》公開課一等獎創新教學設計
- 2 在社會中成長 公開課一等獎創新教案 統編版道德與法治八年級上冊
- 幼兒音樂游戲《坐板凳》
- 講師兼職勞動合同
- 尿酸高的中醫治療
- 俄羅斯文化、飲食與習俗特色宣傳
- 租房合同范本下載(可直接打印)
- 人力資源專員招聘合同模板
- 【MOOC】工程倫理導論-浙江大學 中國大學慕課MOOC答案
- 貴州省遵義市鳳岡縣二中2025屆高三最后一卷英語試卷含解析
- 《宜家在華門店擴張戰略實施環境及實施途徑研究》9700字(論文)
- 2024年山東省煙臺市中考地理試題【附答案】
- 半結構化面試題100題
- 學校兩案九制
- 麻醉藥品、一類精神藥品采購、驗收、儲存管理制度
評論
0/150
提交評論