




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
為什么需要Servlet使用JSP技術如何編寫服務器動態(tài)網(wǎng)頁?請求響應JSP
頁面
運行執(zhí)行Java代碼
HTML代碼生成JSP使用Java
生成動態(tài)內(nèi)容為什么需要Servlet在JSP技術出現(xiàn)之前如何編寫服務器動態(tài)網(wǎng)頁?請求響應Java代碼
HTML代碼生成運行Servlet程序4.1Servlet概述Servlet是一個Java程序,是在服務器上運行以處理客戶端請求并做出響應的程序請求
響應Servlet
運行于服務器端Servlet和其他的Java程序一樣編寫、編譯,它的特點在于,Servlet必須繼承Servlet類或它的子類,通常是繼承HttpServlet這個類。4.2Servlet編程基礎第一個簡單的Servlet程序初識Servletimportjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;public
classHelloServletTestextendsHttpServlet{
public
voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{ response.setContentType("text/html;charset=GBK");
PrintWriterout=response.getWriter(); out.println("<html>"); out.println("<head><title>AServlet</title></head>"); out.println("<body>"); out.println("你好,歡迎來到Servlet世界");out.println(newjava.util.Date()); //輸出當前日期 out.println("</body>"); out.println("</html>"); out.close();}}繼承HttpServlet類Servlet輸出HTML標簽和內(nèi)容導入所需的包處理請求的方法將數(shù)據(jù)發(fā)送給客戶端演示示例:第一個簡單的Servlet程序配置Servlet在web.xml文件中配置Servlet<web-app><servlet><servlet-name>HelloWorld</servlet-name><servlet-class>com.csmy.servlet.HelloWorld</servlet-class></servlet><servlet-mapping><servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern></servlet-mapping></web-app>兩個名稱必須相同為了方便使用Servlet,取個別名完整的包名+類名訪問Servlet的URLHttpServlet中的方法HttpServlet繼承于GenericServlet處理HTTP協(xié)議的請求和響應HttpServlet的方法方法名稱
功能描述voiddoGet(HttpServletRequestrequest,HttpServletRresponseresponse)以Get請求服務時調(diào)用voiddoPost(HttpServletRequestrequest,HttpServletRresponseresponse)以Post請求服務時調(diào)用HttpServlet中的方法使用doXxx()接收用戶請求doGet():用戶使用get方式提交請求時調(diào)用doPost():用戶使用post方式提交請求是調(diào)用importjava.io.IOException;importjavax.servlet.*;importjavax.servlet.http.*;public
classHelloServletextendsHttpServlet{
public
voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //doGet方法體內(nèi)容}
public
voiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //doPost方法體內(nèi)容}}使用Get方法提交,觸發(fā)doGet()方法使用Post方法提交,觸發(fā)doPost()方法由service()方法根據(jù)表單提交方法自動調(diào)用doXxx()方法Servlet的生命周期Servlet的生命周期HTTP請求容器12解析請求345響應6創(chuàng)建Servlet實例調(diào)用init()方法Servlet調(diào)用service()方法調(diào)用destroy()方法輸出響應信息78Servlet的生命周期生命周期的各個階段實例化Servlet容器創(chuàng)建Servlet的實例初始化該容器調(diào)用init()方法請求處理如果請求Servlet,則容器調(diào)用service()方法銷毀實例之前調(diào)用destroy()方法服務終止生命周期相關方法public
classHelloServletimplementsServlet{
prvateServletConfigconfig;Publicvoiddestory();
publicServletConfiggetServletConfig(){returnconfig;}publicvoidinit(ServletConfigconfig)throwsServletException{this.config=config; System.out.println("初始化!"); }Publicvoidservice(ServletRequestreq,ServletResponseres) throwsServletException,IOException{ PrintWriterout=res.getWrite(); out.println("Helloworld"); out.close();}public
voiddestroy(){ super.destroy(); System.out.println("釋放資源!"); }}演示示例:Servlet生命周期客戶端傳遞數(shù)據(jù)的方式使用表單將數(shù)據(jù)附在URL后面4.3利用Servlet讀取HTML表單數(shù)據(jù)
publicvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException { ……. StringuserName=request.getParameter(“userName"); Stringpassword=request.getParameter(“password"); ……….. String[]favor=request.getParameterValues("Favor");
…… }讀取html表單中姓名和密碼框的值讀取html表單中興趣數(shù)組4.3利用Servlet讀取HTML表單數(shù)據(jù)使用Servlet處理GET/POST請求處理登錄表單數(shù)據(jù)publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{
request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); Stringpass=request.getParameter("password"); Stringuser=request.getParameter("loginName"); RequestDispatcherdispatcher=null; if(user.equals(“csmzxy")&&pass.equals(“rjxy")){
request.setAttribute("loginname",user); dispatcher=request.getRequestDispatcher("ok.jsp"); dispatcher.forward(request,response); }else{
response.sendRedirect("login.jsp"); }}將輸入轉換為中文設置輸出為中文如果符合要求,則轉發(fā)到ok.jsp頁面,并在ok.jsp頁面中顯示用戶名如果不符合要求,則重定向到登錄頁面使用Servlet處理GET/POST請求HttpServletRequest類常用方法HttpServletResponse類常用方法方法名稱
功能描述StringgetParameter(Stringparam)獲取客戶端請求數(shù)據(jù)voidsetCharacterEncoding(Stringencoding)設置輸入字符集方法名稱
功能描述voidsetContentType(StringcontType)設置輸出字符集voidsendRedirect(Stringurl)讓瀏覽器重定向到指定的資源HTTP建立在請求(Request)和響應(Response)的基礎之上。當客戶端的瀏覽器向服務器發(fā)送請求的時候,除了用戶輸入的表單數(shù)據(jù)或者查詢數(shù)據(jù)之外,通常瀏覽器還會自己在Get/Post請求行后面加上一些附加的信息,而在服務器向客戶端的請求做出響應的時候,也會自動向客戶端發(fā)送一些附加的信息。通常將這些信息稱為HTTP報頭,將附加在請求信息后面的稱為HTTP請求報頭,而將附加在響應信息后面的信息稱為HTTP響應報頭。在Servlet,可以獲得請求報頭信息,或者設置響應報頭的信息。4.4處理HTTP報頭在Servlet中取得HTTP請求報頭不同于表單數(shù)據(jù)請求頭直接由瀏覽器設置,在初始的Get/Post請求行之后立即發(fā)送可以獲得客戶端/服務器端的一些配置信息獲取請求頭很簡單,直接通過HttpServletRequest的getHeader方法。頭的名稱不區(qū)分大小寫常用的頭信息:請求報頭名稱說明Accept瀏覽器可接受的MIME類型Accept-Charset瀏覽器可接受的字符集Accept-Encoding瀏覽器能夠進行解碼的數(shù)據(jù)編碼方式Accept-Language瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到這個請求頭信息,特別是在有國際化要求的應用中,需要通過這個信息以確定應該向客戶端顯示何種語言的界面讀取CGI變量CGI變量:1.基于HTTP請求的行和頭;2.來自于套結字3.來自于服務器的安裝參數(shù)通過HttpServletRequest的相關方法來訪問這些變量常用的CGI變量CONTENT_TYPE—getContentType()PATH_INFO---getPathInfo()REMOTE_ADDR---getRemoteAddr()QUERY_STRING---getQueryString()SERVER_NAME---getServerName()SERVER_PORT---getServerPort()在Servlet中設置HTTP響應頭在Servlet中,可以通過HttpServletResponse的setHeader()方法來設置HTTP響應報頭,它接收兩個參數(shù),用于指定響應報頭的名稱和對應的值:
setHeader(StringheaderName,StringheaderValue);
這是通用的方法,對于含有整數(shù)和日期的報頭,提供了專門的方法:
setDateHeader(Stringheader,longmilliseconds)
setIntHeader(Stringheader,int
headerValue)setContentType(Stringmime):這個方法用于設置Content-Type報頭。通常使用這個方法來設置Servlet的MIME類型,甚至字符編碼(Encoding),特別是在需要將Servlet的輸出設置為非HTML格式的時候。setContentLength(intlength):設置Content-Length報頭。addCookie(Cookiec):設置Cookie報頭。sendRedirect(Stringurl):設置Location報頭,讓Servlet跳轉到指定的url。在Servlet中設置HTTP響應頭
HTTP響應頭響應頭
說明
Content-Encoding用于標明頁面在傳輸過程中的編碼方式Content-Type用于設置Servlet輸出的MIME(MultipurposeInternetMailExtension)類型。在Tomcat安裝目錄下的conf目錄下,有一個web.xml文件,里面列出了幾乎所有的MIME類型和對應的文件擴展名。正式注冊的MIME類型格式為maintype/subtype,如text/html、text/javascript等;而未正式注冊的類型格式為maintype/x-subtype,如audio/x-mpegContent-Language用于標明頁面所使用的語言,例如en、en-usExpires用于標明頁面的過期時間,可以使用這個來設置在指定的時間內(nèi)取消頁面緩存(cache)Refresh這個報頭表明瀏覽器自動重新調(diào)用最新的頁面Date當前的GMT時間。你可以用setDateHeader來設置這個頭以避免轉換時間格式的麻煩Refresh表示瀏覽器應該在多少時間之后刷新文檔,以秒計。除了刷新當前文檔之外,你還可以通過setHeader("Refresh","5;URL=http://host/path")讓瀏覽器讀取指定的頁面。注意Refresh的意義是“N秒之后刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面”在Servlet中跳轉到其他的頁面RequestDispatcher類作用:實現(xiàn)請求轉發(fā)使用步驟獲取RequestDispatcher類實現(xiàn)轉發(fā)RequestDispatcherdispatcher =request.getRequestDispatcher(url);//參數(shù)url是欲轉發(fā)的頁面或者Servlet的URL地址dispatcher.forward(request,response);4.5SERVLET的中文問題在Servlet中,可以通過修改“Content-Type”這個報頭完成,也就是在獲得輸出流之前,利用HttpServletResponse
類的setContentType()這個方法去設置“Content-Type”報頭,在使用HttpServletResponse的getWriter()方法獲得輸出流之前加上如下語句:
response.setContentType("text/html;charset=GBK");
通過上面這條語句,就可以將輸出的編碼方式設置成“GBK”編碼。Servlet在讀取表單數(shù)據(jù)的時候,也是采用的“ISO-8859-1”的編碼方式,需要將Servlet讀取表單數(shù)據(jù)的編碼方式設置成“GBK”或“GB2312”或“UTF-8”,
request.setCharacterEncoding("gb2312")語句就是用于設置接收數(shù)據(jù)的中文編碼通過修改Tomcat安裝目錄下conf目錄中的server.xml來解決這個問題,方法是在<Connector>元素中,加入如下一個屬性:
URIEncoding="GBK"4.6處理CookieCookie是一小段的文本,通過CGI/ASP/JSP/Servlet等程序,可以將Cookie保存到瀏覽器所在的客戶端的內(nèi)存或磁盤上,而通過這些應用程序,也可以從客戶端讀出這些Cookie,這樣,通過Cookie,客戶端和服務器端就建立起了一種松散的聯(lián)系。也就是說,Cookie是一種可以讓服務器端的應用程序在客戶端保存和獲取信息的機制,通過這種機制,可以大大擴展基于Web的應用的功能。4.6處理CookieCookie中文問題
因為Cookie不支持中文。解決方法:保存Cookie時,先用.URLEncoder.encode(Stringstr,“utf-8”)方法對要保存的數(shù)據(jù)進行utf-8編碼。讀取Cookie時,利用.URLDecoder.decode(Stringstr,”utf-8”)進行解碼
一次會話是從客戶端發(fā)送請求開始的,在server端,servlet引擎用javax.servlet.http.HttpSession的一個實例(session)來記錄一次會話。會話的維持由servlet容器與客戶端瀏覽器協(xié)調(diào)進行:通過cookie保存在客戶端URL重寫將會話ID添加到URL結尾,以標識該會話如hello.jsp?jsessionid=12344.7會話跟蹤HttpServletRequest中的會話管理方法getRequestedSessionId():返回隨客戶端請求到來的會話ID??赡芘c當前的會話ID相同,也可能不同。getSession(booleanisNew):如果會話已經(jīng)存在,則返回一個HttpSession會話不存在:getSession(true)新建一個HttpSession,getSession(false)返回null
isRequestedSessionIdFromCookie():當前的SessionID如果是從Cookie獲得,為true
isRequestedSessionIdFromURL():當前SessionID如果是由URL獲得,為trueisRequestedSessionIdValid():如果客戶端的會話ID代表的是有效會話,則返回true。否則(比如,會話過期或根本不存在),返回falseServeltConText接口獲取Servlet上下文ServeltConText接口的常用方法方法名稱
功能描述ServletContextgetContext(Stringpath)返回服務器上與指定URL相對應的ServletContext對象voidsetAttribute(Stringname,Objectobj)設置Servlet中的共享屬性ObjectgetAttribute(Stringname)獲取Servlet中設置的共享屬性4.8ServletContext接口Servlet相關接口ServeltConfig接口在Servlet初始化過程中獲取配置信息一個Servlet只有一個ServletConfig對象ServeltConfig接口的常用方法方法名稱
功能描述StringgetInitParameter(Stringname)獲取web.xml中設置的以name命名的初始化參數(shù)值ServletContextgetServletContext()返回Servlet的上下文對象引用Servlet相關接口GenericServlet抽象類提供了Servlet與ServletConfig接口的默認實現(xiàn)方法GenericServlet的常用方法方法名稱
功能描述StringgetInitParameter(Stringname)返回服務器上與指定URL相對應的ServletContext對象,實際上是調(diào)用ServletConfig接口的同名方法ServletContextgetServletContext()返回Servlet的上下文對象引用,實際上是調(diào)用ServletConfig接口的同名方法voidinit()初始化Servlet4.9編寫線程安全的Servlet在Servlet規(guī)范中,明確說明了Servlet是非線程安全的。在前面的內(nèi)容中也已經(jīng)知道了,在多個客戶端訪問同一個Servlet的時候,一般不會對每個客戶端都新建一個Servlet實例,而是利用多線程機制,使用同一個Servlet實例,這也是Servlet的優(yōu)勢所在。對于每一個客戶端請求,都會調(diào)用同一個Servlet的service()方法,然后決定調(diào)用doGet()或者doPost()方法來處理請求。因為這些處理線程調(diào)用的都是同一個Servlet實例,那么,對Servlet的全局變量的訪問就可能會帶來線程安全問題。那么,如何確保Servlet是線程安全的呢?其實,如果讀者有J2SE編程方面的經(jīng)驗,很容易就可以解決這個問題,比如,使用同步(synchronized)機制,或者干脆避免使用全局變量。Servlet2.4中被廢棄的SingleThreadModel接口Servlet的編譯使用命令行方式編譯Servlet的步驟打開命令行窗口進入到servlet類文件所在目錄使用javac命令執(zhí)行編譯將編譯生成的.class文件拷貝到class目錄下演示示例:編譯ServletServlet的部署在Tomcat中如何部署tomcatwebappsstoreWEB-INFindex.htmltest.jsplibclasses*.jarHelloServlet.classweb.xml顯示頁面第三方jar文件.java編譯后的.class文件程序配置文件必須的tomcat主目錄文檔根目錄演示示例:部署Servlet運行Servlet啟動Tomcat服務器在瀏覽器中輸入演示示例:運行Servlethttp://localhost:8080/store/HttpServletTest獲取Servlet初始化參數(shù)Servlet初始化參數(shù)配置<web-app><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>org.jbit.servlet.HelloServlet</servlet-class><init-param><param-name>initParam</param-name><param-value>HelloServlet</param-value></init-param></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/HelloServlet</url-pattern></servlet-mapping></web-app>獲取Servlet初始化參數(shù)獲取初始化參數(shù)publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{System.out.println("處理請求時,doGet()方法被調(diào)用。");
StringinitParam=getInitParameter("initParam");System.out.println(initParam);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟件評測師考試中的新知識與新技能試題及答案
- 系統(tǒng)集成考試備考試題及答案
- 數(shù)據(jù)管理安全管理制度
- 腦部協(xié)調(diào)力測試題及答案
- 大多數(shù)電焊測試題及答案
- 物業(yè)夜班人員管理制度
- 元朝邊疆管理制度
- 醫(yī)院預決算管理制度
- 結構分析軟件評測師試題及答案
- 體系會議管理制度
- 中建承插型盤扣式懸挑腳手架安全專項施工方案
- 濕巾采購合同模板
- 《臨床技術操作規(guī)范-放射醫(yī)學檢查技術分冊》
- 小升初語文易錯知識點專項集訓A卷-成語運用(試題)部編版語文六年級下冊
- DB41T 2402-2023 醫(yī)療機構醫(yī)用分子篩制氧設備使用管理規(guī)范
- 建設土地買賣合同模板
- 《死亡詩社》電影賞析
- 七年級信息技術教案下冊(合集6篇)
- 2025年成人高考成考(高起專)英語試題與參考答案
- 非遺文化走進數(shù)字展廳+大數(shù)據(jù)與互聯(lián)網(wǎng)系創(chuàng)業(yè)計劃書
- 【電商平臺“二選一”行為的反壟斷法律規(guī)制探究20000字(論文)】
評論
0/150
提交評論