Java web—Servlet的请求与响应
前言:
????????在家上網(wǎng)課快上瘋了╰(‵□′)╯,上課連課本都沒(méi)有,太難受了嗚嗚嗚~, 只能在blog里記錄一下這段時(shí)間的學(xué)習(xí)的內(nèi)容,太難了…
一、servlet概述:
- 運(yùn)行在WEB服務(wù)器端的一個(gè)JAVA小程序,也就是一個(gè)Java類(lèi)。
- 一個(gè)用來(lái)被用戶(hù)訪問(wèn)的動(dòng)態(tài)資源。
- 通常把實(shí)現(xiàn)了Servlet接口的java類(lèi)統(tǒng)稱(chēng)為Servlet。
- 編寫(xiě)好的Servlet需要在web.xml文件中做配置才能供外界訪問(wèn)。
二、servlet的作用:
- 用于處理客戶(hù)端傳來(lái)的HTTP請(qǐng)求,并返回一個(gè)響應(yīng)
- 它能夠處理的請(qǐng)求有doGet()和doPost()等方法。
三、servlet體系結(jié)構(gòu):
- Servlet由Servlet容器提供
- Servlet容器是指提供了Servlet 功能的服務(wù)器(這里指Tomcat)
- Servlet容器將Servlet動(dòng)態(tài)的加載到服務(wù)器上。
- Servlet的請(qǐng)求首先會(huì)被HTTP服務(wù)器接收,HTTP服務(wù)器只負(fù)責(zé)靜態(tài)HTML頁(yè)面的解析。
- Servlet的請(qǐng)求轉(zhuǎn)交給Servlet容器,Servlet容器會(huì)根據(jù)web.xml文件中的映射關(guān)系,調(diào)用相應(yīng)的Servlet。
- Servlet將處理的結(jié)果返回給Servlet容器,并通過(guò)HTTP服務(wù)器將響應(yīng)傳輸給客戶(hù)端。
四、創(chuàng)建servlet的三種方式:
- 直接實(shí)現(xiàn)Servlet接口
- 繼承GenericServlet類(lèi)
- 繼承HttpServlet類(lèi)(常用)
其中關(guān)系如下:
五、servlet生命周期的三個(gè)方法:
- init():首次訪問(wèn)這個(gè)Servlet,Servlet對(duì)象會(huì)被創(chuàng)建,執(zhí)行初始化方法。只執(zhí)行一次。
- service() :響應(yīng)客戶(hù)端請(qǐng)求。每次訪問(wèn)Servlet,都會(huì)被執(zhí)行
- destroy() :服務(wù)器正常關(guān)閉后,會(huì)執(zhí)行該方法 ,只執(zhí)行一次。
六、配置web.xml文件:
編寫(xiě)好的Servlet需要在web.xml文件中做配置才能供外界訪問(wèn),Servlet容器會(huì)根據(jù)web.xml文件中的映射關(guān)系,調(diào)用相應(yīng)的Servlet
例:
<web-app> <servlet><servlet-name> FirstServlet </servlet-name> //為了方便使用Servlet,取的別名<servlet-class> pdsu.edu.cn.hm.HelloWorld </servlet-class> //完整的包名+類(lèi)名 </servlet><!-- 配置如何訪問(wèn)這個(gè)servlet --> <servlet-mapping><servlet-name> FirstServlet </servlet-name> //和上面那個(gè)起的別名必須相同!<url-pattern> /HelloServlet </url-pattern> //訪問(wèn)Servlet的URL </servlet-mapping> </web-app>根據(jù)上面配置的web.xml那么項(xiàng)目的訪問(wèn)路徑為:
七、繼承類(lèi)創(chuàng)建servlet:
定義HelloWorld類(lèi)繼承HttpServlet類(lèi):
1、實(shí)現(xiàn)doGet或doPost方法(或兩者都實(shí)現(xiàn))。
2、這兩個(gè)方法的方法參數(shù)均為:
- HttpServletRequest: 用于獲取Form表單的數(shù)據(jù)、HTTP請(qǐng)求頭部信息等等。
- HttpServletResponse: 用于設(shè)置HTTP狀態(tài)代碼、HTTP響應(yīng)頭部信息、獲取用于向客戶(hù)端發(fā)送數(shù)據(jù)的輸出流對(duì)象。
3、多數(shù)情況下在doPost方法中調(diào)用 doGet, 或相反。
八、servlet請(qǐng)求與響應(yīng):
1、Get與Post提交的區(qū)別:
2、何時(shí)使用GET/POST方法:
3、響應(yīng)狀態(tài)頭:
setHeader() 設(shè)置響應(yīng)頭,String類(lèi)型的值 addHeader() 加響應(yīng)頭 setIntHeader()設(shè)置響應(yīng)頭,int類(lèi)型的值 setDateHeader()設(shè)置響應(yīng)頭,date類(lèi)型的值 containsHeader()是否包含指定的響應(yīng)頭 addCookie()向set-cookie報(bào)頭插入一個(gè)cookie4、設(shè)置處理亂碼的方法:
setContentType() 設(shè)置響應(yīng)的類(lèi)型和編碼方式,比如response.setContentType("text/html;charset=utf-8"); setCharacterEncoding() 設(shè)置響應(yīng)字符編碼,比如response.setCharacterEncoding("utf-8");5、響應(yīng)消息體:
getWriter( ) 方法用于得到一個(gè)文本輸出流
PrintWriter out = response.getWriter(); 調(diào)用print()、println()或write()方法getOutputStream( ) 方法用于得到一個(gè)二進(jìn)制輸出流
ServletOutputStream out = response.getOutputStream(); OutputStream比使用PrinterWriter發(fā)送文本效率更高,可以動(dòng)態(tài)地創(chuàng)建任何形式的數(shù)字內(nèi)容例:
public void doGet( HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();....}public void doPost( HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}6、HttpServletRequest對(duì)象方法:
獲取請(qǐng)求行:
getMethod():獲取HTTP的請(qǐng)求方法,GET、POST等 getRequestURI():獲取請(qǐng)求的URI,如 /項(xiàng)目名/servlet路徑 getRequestURL():獲取請(qǐng)求的URL,包含協(xié)議名、服務(wù)器名或IP、端口號(hào)和請(qǐng)求資源但不包括查詢(xún)字符串參數(shù),如http://127.0.0.1:8080/lovo/index.html getQueryString():獲取請(qǐng)求URL后面的查詢(xún)字符串,如name=zhangsan getProtocol():獲取請(qǐng)求的協(xié)議名和版本號(hào),如HTTP/1.1 getContextPath():獲取項(xiàng)目名稱(chēng) getServletPath():獲取Servlet的映射路徑,如Analyz獲取請(qǐng)求頭:
getHeader(name):返回指定的請(qǐng)求頭的值 getHeaders(name):返回一個(gè)Enumeration(枚舉)包含請(qǐng)求頭中的所有值 getHeaderNames():特定請(qǐng)求中接收到的所有請(qǐng)求頭的名稱(chēng) getIntHeader(name):獲取特定請(qǐng)求頭的值,并將其轉(zhuǎn)化為int類(lèi)型 getDateHeader(name):獲取特定請(qǐng)求頭的值,并將其轉(zhuǎn)化為Date類(lèi)型7、獲取表單數(shù)據(jù):
- getParameter(parameterName):獲取表單參數(shù)的值,參數(shù)名區(qū)分大小寫(xiě),與HTML表單中出現(xiàn)的參數(shù)名一致,GET請(qǐng)求還是POST請(qǐng)求都可以采用相同的方式
- getParameterValues(parameterName):獲取同一個(gè)參數(shù)名的多個(gè)參數(shù)值,返回字符串?dāng)?shù)組對(duì)象
- getParameterNames():以Enumeration (枚舉)的方式返回請(qǐng)求中所有的表單參數(shù)名列表
例:
String name=request.getParameter("username"); String sex=request.getParameter("sex"); String email=request.getParameter("email");8、請(qǐng)求重定向:
- 當(dāng)Web服務(wù)器接受到客戶(hù)端的請(qǐng)求后,由于某些條件限制,不能訪問(wèn)當(dāng)前請(qǐng)求URL所指向的Web資源,可以指定了一個(gè)新的資源路徑,讓客戶(hù)端重新發(fā)送請(qǐng)求,這就是請(qǐng)求重定向。
實(shí)現(xiàn)重定向的兩種方式:
1、狀態(tài)碼302+location配合使用:
response.setStatus(302); response.setHeader(“l(fā)ocation”,“/項(xiàng)目名/頁(yè)面名或servlet名”)2、直接指定URI跳轉(zhuǎn):
response.sendRedirect("/lovobook/bar.html");9、設(shè)置頁(yè)面自動(dòng)刷新:
1、定時(shí)跳轉(zhuǎn):從一個(gè)頁(yè)面定時(shí)跳到另一個(gè)頁(yè)面,比如注冊(cè)頁(yè)面跳轉(zhuǎn)到登錄頁(yè)面
response.setHeader("Refresh", "5;URL=http://www.baidu.com");2、定時(shí)刷新:頁(yè)面地址不變,頁(yè)面數(shù)據(jù)變化,比如網(wǎng)絡(luò)購(gòu)票
response.setHeader("Refresh", "3"); response.getWriter().println(new java.util.Date());10、響應(yīng)狀態(tài)頭:
例:
輸出Excel表
結(jié)果會(huì)產(chǎn)生一個(gè)Excel文件
九、ServletContext對(duì)象:
作用:在ServletContext中可以存放能夠被所有用戶(hù)訪問(wèn)的共享數(shù)據(jù)。
特點(diǎn):
獲取對(duì)象:getServletContext()
- 同一Web應(yīng)用中不同Servlet調(diào)用getServletContext 方法獲得的是同一個(gè)ServletContext對(duì)象實(shí)例
可以對(duì)其進(jìn)行鎖定,用以防止web應(yīng)用程序?qū)﹃P(guān)鍵部分的訪問(wèn)。
ServletContext的常用方法:
訪問(wèn)初始參數(shù)的方法:
getInitParameter(String name), getInitParameterNames()讀取web應(yīng)用屬性的方法:
getAttribute(String name), getAttributeNames( )操縱web應(yīng)用屬性的方法:
setAttribute(String, Object), removeAttribute(String)獲取資源轉(zhuǎn)發(fā)器:
RequestDispatcher getRequestDispatcher(String path)十、RequestDispatcher對(duì)象:
作用:將客戶(hù)發(fā)送的請(qǐng)求發(fā)送給服務(wù)器的其他資源。
資源類(lèi)型可以是靜態(tài)資源(如HTML文件)也可以動(dòng)態(tài)資源(如 Servlet 或JSP 文件) 。
例:
要將請(qǐng)求發(fā)送給資源x
RequestDispatcher的方法:
將請(qǐng)求從當(dāng)前的Servlet轉(zhuǎn)發(fā)到其他資源 :
void forward(ServletRequest request,ServletResponse response)在響應(yīng)對(duì)象中包含資源的內(nèi)容:
void include(ServletRequest request,ServletResponse response)例:轉(zhuǎn)發(fā)到index.html
getServletContext().getRequestDispatcher("/index.html").forward(request, response);ok,這次就先到這里吧,后面會(huì)話的Cookie和Session單獨(dú)再記錄一篇。
總結(jié)
以上是生活随笔為你收集整理的Java web—Servlet的请求与响应的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux下tar命令简介
- 下一篇: Java web—Cookie与Sess