Java Web 開發(fā)從入門到實踐課件 第4章 - Servlet技術_第1頁
Java Web 開發(fā)從入門到實踐課件 第4章 - Servlet技術_第2頁
Java Web 開發(fā)從入門到實踐課件 第4章 - Servlet技術_第3頁
Java Web 開發(fā)從入門到實踐課件 第4章 - Servlet技術_第4頁
Java Web 開發(fā)從入門到實踐課件 第4章 - Servlet技術_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第二篇

JavaWeb技術篇JavaWeb開發(fā)從入門到實踐JavaWebDevelopmentFromIntroductiontoPracticeServlet技術Chap04提綱Servlet技術介紹Servlet的基本概念、生命周期和如何通過Web容器進行部署與管理。高級應用部分探討了Servlet的請求和響應機制,如何處理客戶端請求并生成相應的響應。4.1Servlet開發(fā)入門4.2Servlet高級應用4.3請求和響應4.4本章小結4.1Servlet開發(fā)入門4.1.1Servlet簡介4.1.2Servlet的常用接口和類4.1.3Servlet的配置4.1.4Servlet的生命周期4.1.1Servlet簡介圖4-1Servlet應用程序的體系結構Servlet是Server與Applet的縮寫,即服務器端小程序,是Sun公司提供的一門用于開發(fā)動態(tài)Web資源的技術。4.1.2Servlet的常用接口和類在Servlet編程中,ServletAPI提供了標準的接口和類。這些對象對Servlet的操作非常重要,它們?yōu)镠TTP請求和程序響應提供了豐富的方法。圖

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>初始化參數(shù)名稱</param-name>

<param-value>初始化參數(shù)值</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>Servlet的名稱(與上述<servlet>的<servlet-name>一致)</servlet-name><url-pattern>匹配規(guī)則(映射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初始化參數(shù),相當于<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接口的實現(xiàn)類jakarta.servlet.GenericServlet來實現(xiàn)Servlet程序packagecom.swxy.servlet;importjakarta.servlet.*;importjava.io.*;publicclassHelloServletextendsGenericServlet{

@Override

publicvoidservice(ServletRequestservletRequest,ServletResponseservletResponse)throwsServletException,IOException{//返回一個PrintWriter對象,Servlet使用它來輸出字符串形式的正文數(shù)據(jù)

PrintWriterout=servletResponse.getWriter();

out.println("HelloWorld");//輸出流對象向客戶端發(fā)送字符數(shù)據(jù)

}

}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的生命周期測試:“l(fā)ocalhost:8080/servletDemo01/LifeCycleServlet”初始化方法service方法刷新頁面,也就是第二次訪問service方法關閉Web服務器銷毀方法4.1.4Servlet的生命周期Servlet的工作原理Web服務器接收到一個HTTP請求后,判斷請求內容,若是靜態(tài)頁面,服務器自行處理,若是動態(tài)數(shù)據(jù),則交給Servlet容器,Servlet容器找到對應的Servlet對象進行處理,處理結果交給Web服務器,再轉交給客戶端。同一個Servlet多次被訪問,只有第一次訪問時創(chuàng)建一個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類的應用創(chuàng)建表單<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類創(chuàng)建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);

//根據(jù)初始化參數(shù)名返回初始化參數(shù)值

Enumeration<String>getInitParameterNames();

//返回所有的初始化參數(shù)名

}4.2.3ServletConfig接口與ServletContext接口創(chuàng)建Servlet:在com.swxy.servlet包中創(chuàng)建一個名稱為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的初始化參數(shù)在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類中實現(xiàn)init(ServletConfigservletConfig)方法4.2.3ServletConfig接口與ServletContext接口ServletContext接口Tomcat啟動時會為每個Web應用創(chuàng)建一個唯一的ServletContext對象,該對象代表當前的Web應用,該對象封裝了當前Web應用的所有信息。表4-4

ServletContext接口常用方法及其描述方法描述StringgetInitParameter(Stringname)根據(jù)參數(shù)名稱獲取參數(shù)值EnumerationgetInitParameterNames()獲取當前應用中所有的參數(shù)名,返回EnumerationInputStreamgetResourceAsStream(Stringpath)返回某個資源文件的InputStream輸入流對象,路徑一般為"/WEB-INF/classes/資源”O(jiān)bjectgetAttribute(Stringname)

獲取域對象中指定域屬性的值voidsetAttribute(Stringname,Objectobject)設置域屬性voidremoveAttribute(Stringname)移除域對象中指定的域屬性StringgetRealPath(Stringpath)獲取Web應用中資源的絕對路徑,參數(shù)path是該Web應用的相對地址4.2.3ServletConfig接口與ServletContext接口在web.xml文件中配置Web應用程序初始化參數(shù)<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包中創(chuàng)建一個名為Servlet02的類//設置響應MIME類型和字符集格式resp.setContentType("text/html;charset=UTF-8");PrintWriterout=resp.getWriter();//獲取ServletContext對象ServletContextcontext=this.getServletContext();//獲取初始化參數(shù)名,返回Enumeration對象Enumeration<String>parameterNames=context.getInitParameterNames();//遍歷參數(shù)名while(parameterNames.hasMoreElements()){Stringname=parameterNames.nextElement();//根據(jù)初始化參數(shù)名(<param-name>元素的值),獲取參數(shù)值(<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目錄中創(chuàng)建一個名為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接口及其應用發(fā)送與狀態(tài)碼相關的方法setStatus(intstatus)方法@WebServlet("/Servlet01")

publicclassServlet01extendsHttpServlet{

@Override

protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)

throwsServletException,IOException{

resp.setStatus(404);//發(fā)送狀態(tài)碼404

}

}測試:地址欄輸入“http://localhost:8080/jspDemo/Servlet01”圖

4-10

查看響應頭的狀態(tài)碼4.3.1HttpServletResponse接口及其應用案例:服務器發(fā)送存在異常的響應狀態(tài)碼sendError(intse)方法@WebServlet("/Servlet02")publicclassServlet02extendsHttpServlet{ @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.sendError(404,"自定義錯誤信息:頁面不存在"); }}4.3.1HttpServletResponse接口及其應用案例:服務器發(fā)送存在異常的響應狀態(tài)碼測試:地址欄輸入“http://localhost:8080/jspDemo/Servlet02”圖

4-11sendError()方法運行結果4.3.1HttpServletResponse接口及其應用

發(fā)送與響應消息頭相關的方法表4-5設置HTTP響應頭字段的方法方法描述voidsetHeader(Stringname,Stringvalue)設定HTTP的響應頭字段,參數(shù)name用于指定響應頭字段的名稱,參數(shù)value用于指定響應頭字段的值voidaddHeader(Stringname,Stringvalue)voidsetIntHeader(Stringname,intvalue)設定HTTP的響應頭字段,只適用于響應字段的值為int類型時的響應消息頭的設置voidaddIntHeader(Stringname,intvalue)voidsetContentType(Stringtype)設置發(fā)送到客戶端的響應的內容類型,例如,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接口及其應用

發(fā)送與響應消息體相關的方法案例:同時使用OutputStream字節(jié)流和PrintWriter字符流發(fā)送響應消息體。@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()方法獲取表單數(shù)據(jù)

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(不包含參數(shù)部分)例如,http://localhost:8080/jspDemo/Servlet06StringgetRequestURI()獲取客戶端發(fā)出請求時的URI,端口號和“?”之間的內容,例如,/jspDemo/Servlet06StringgetQueryString()獲取請求行中的參數(shù)部分,“?”后面的所有內容StringgetProtocol()獲取請求行中的協(xié)議名和版本,例如,HTTP/1.14.3.2HttpServletRequest接口及其應用

獲取請求消息頭的相關方法表4-7

獲取請求信息頭的常用方法方法描述StringgetHeader(Stringname)獲取一個指定頭字段的值Enumeration<String>getHeaders(Stringname)根據(jù)請求頭字段的名稱獲取對應的請求字段的所有值,返回一個Enumeration集合對象Enumeration<String>getHeaderNames()獲取一個包含所有請求頭字段的Enumeration對象intgetIntHeader(Stringname)獲取一個指定頭字段的值,并將其轉換為int類型StringgetContentType()獲取Content-Type頭字段的值StringgetCharacterEncoding()獲取請求消息的實體部分的字符集編碼,通常從Content-Type頭字段中進行提取4.3.2HttpServletRequest接口及其應用獲取請求消息體的相關方法案例:實現(xiàn)注冊功能,使用getInputStream()方法獲取請求消息體protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{

resp.setContentType("text/html;charset=UTF-8");//定義一個長度為1024的字節(jié)數(shù)組

byte[]buffer=newbyte[1024];//獲取輸入流

ServletInputStreaminputStream=req.getInputStream();

StringBuildersb=newStringBuilder();

intlen;

//循環(huán)讀取

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論