Servlet基础(一) Servlet基础和关键的API介绍
轉(zhuǎn)載:http://www.cnblogs.com/mengdd/p/3202550.html
Servlet基礎(chǔ)(一) Servlet簡(jiǎn)介 關(guān)鍵API介紹及結(jié)合源碼講解
Servlet基礎(chǔ)(一) Servlet基礎(chǔ)和關(guān)鍵的API介紹
?
Servlet簡(jiǎn)介
Java Servlet是和平臺(tái)無關(guān)的服務(wù)器端組件,它運(yùn)行在Servlet容器中。
Servlet容器負(fù)責(zé)Servlet和客戶的通信以及調(diào)用Servlet的方法,Servlet和客戶的通信采用“請(qǐng)求/響應(yīng)”的模式。
?
Servlet可完成如下功能:
創(chuàng)建并返回基于客戶請(qǐng)求的動(dòng)態(tài)HTML頁面。
創(chuàng)建可以嵌入到現(xiàn)有HTML頁面中的部分HTML頁面(HTML片段)。
與其他服務(wù)器資源(如數(shù)據(jù)庫或基于Java的應(yīng)用程序)進(jìn)行通信。
?
Servlet API
Servlet的框架是由兩個(gè)Java包組成:
1.javax.servlet包:定義了所有的Servlet類都必須實(shí)現(xiàn)或擴(kuò)展的通用接口和類。
2.javax.servlet.http包:定義了采用HTTP協(xié)議通信的HttpServlet類。
?
javax.servlet.Servlet
Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必須實(shí)現(xiàn)這一接口。
在Servlet接口中定義了五個(gè)方法,其中有三個(gè)方法代表了Servlet的生命周期:
init方法:負(fù)責(zé)初始化Servlet對(duì)象。
service方法:負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。
destroy方法:當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資源。
?
HttpServlet
每一個(gè)Servlet都必須要實(shí)現(xiàn)Servlet接口。
GenericServlet是個(gè)通用的、不特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。
HttpServlet繼承于GenericServlet,因此我們定義的Servlet只需要繼承HttpServlet即可。
?
Servlet接口中定義了一個(gè)service方法,HttpServlet對(duì)該方法進(jìn)行了實(shí)現(xiàn)。
HttpServlet對(duì)service方法的實(shí)現(xiàn)方式:
第一步,進(jìn)行一個(gè)分發(fā)。
將ServletRequest與ServletResponse轉(zhuǎn)換為HttpServletRequest與HttpServletResponse,
轉(zhuǎn)換完畢后,會(huì)調(diào)用HttpServlet中自己的service方法,源碼如下:
?
@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest) req;response = (HttpServletResponse) res;} catch (ClassCastException e) {throw new ServletException("non-HTTP request or response");}service(request, response);}?
第二步,從上個(gè)service方法中接收標(biāo)準(zhǔn)的HTTP請(qǐng)求,然后將它們繼續(xù)分發(fā)到相應(yīng)的doXXX方法中:
源碼:
?
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();if (method.equals(METHOD_GET)) {long lastModified = getLastModified(req);if (lastModified == -1) {// servlet doesn't support if-modified-since, no reason// to go through further expensive logicdoGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);} catch (IllegalArgumentException iae) {// Invalid date header - proceed as if none was setifModifiedSince = -1;}if (ifModifiedSince < (lastModified / 1000 * 1000)) {// If the servlet mod time is later, call doGet()// Round down to the nearest second for a proper compare// A ifModifiedSince of -1 will always be lessmaybeSetLastModified(resp, lastModified);doGet(req, resp);} else {resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}} else if (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);maybeSetLastModified(resp, lastModified);doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req,resp);} else {//// Note that this means NO servlet supports whatever// method was requested, anywhere on this server.//String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}}第二個(gè)service方法
?
?
在HttpServlet的第二個(gè)service方法中,首先從HttpServletRequest對(duì)象中獲取HTTP請(qǐng)求方式的信息,然后再根據(jù)請(qǐng)求的方法名調(diào)用相應(yīng)的方法doXXX方法。
比如,如果請(qǐng)求方式為GET,那么調(diào)用doGet方法;如果請(qǐng)求方式為POST,那么調(diào)用doPost方法。
如果你的Servlet類擴(kuò)展了HttpServlet類,你通常不必實(shí)現(xiàn)service方法。
需要注意的是在HttpServlet類中所提供的doGet、doPost等方法都是直接返回錯(cuò)誤信息,所以我們需要在自己定義的Servlet類中override這些方法。
?
ServletRequest接口
ServletRequest接口中封裝了客戶請(qǐng)求信息,如客戶請(qǐng)求方式、參數(shù)名和參數(shù)值、客戶端正在使用的協(xié)議,以及發(fā)出客戶請(qǐng)求的遠(yuǎn)程主機(jī)信息等。
ServletRequest接口還為Servlet提供了直接以二進(jìn)制方式讀取客戶請(qǐng)求數(shù)據(jù)流的ServletInputStream。
ServletRequest的子類可以為Servlet提供更多的和特定協(xié)議相關(guān)的數(shù)據(jù)。
例如,HttpServletRequest提供了讀取HTTP Head信息的方法。
?
ServletResponse接口
ServletResponse接口為Servlet提供了返回響應(yīng)結(jié)果的方法。
它允許Servlet設(shè)置返回?cái)?shù)據(jù)的長(zhǎng)度和MIME類型,并且提供輸出流ServletOutputStream。
ServletResponse子類可以提供更多和特定協(xié)議相關(guān)的方法。
例如,HttpServletResponse提供設(shè)定HTTP Head信息的方法。
?
?
?
創(chuàng)建自己的HttpServlet類的步驟
1.擴(kuò)展HttpServlet抽象類。
2.覆蓋HttpServlet的部分方法,如覆蓋doGet()或doPost()方法。
3.獲取HTTP請(qǐng)求信息,例如通過HttpServletRequest對(duì)象來檢索HTML表單所提交的數(shù)據(jù)或URL上的查詢字符串。
無論是表單數(shù)據(jù)還是URL上的查詢字符串,在HttpServletRequest對(duì)象中都以參數(shù)名/參數(shù)值的形式存放,你可以通過getParameter()方法檢索參數(shù)信息。
4.生成HTTP響應(yīng)結(jié)果。
通過HttpServletResponse對(duì)象可以生成響應(yīng)結(jié)果。
HttpServletResponse對(duì)象有一個(gè)getWritter()方法,該方法返回一個(gè)PrintWriter對(duì)象。
用PrintWritter的print()或println()方法可以向客戶端發(fā)送字符串?dāng)?shù)據(jù)流。
比如下面這個(gè)簡(jiǎn)單的Servlet:
?
public class HelloWorldServlet extends HttpServlet {@SuppressWarnings("deprecation")@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{resp.setContentType("text/html");PrintWriter out = resp.getWriter();out.println("<html><head><title>Hello World Sample</title></head>");out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>");out.flush();}}?
?
?
ServletContext和Web應(yīng)用關(guān)系
當(dāng)Servlet容器啟動(dòng)Web應(yīng)用時(shí),為每個(gè)Web應(yīng)用創(chuàng)建唯一的ServletContext對(duì)象。
你可以把ServletContext看成是一個(gè)Web應(yīng)用的服務(wù)器端組件的共享內(nèi)存。
在ServletContext中可以存放共享數(shù)據(jù),它提供了讀取或設(shè)置共享數(shù)據(jù)的方法:
setAttribute(java.lang.String name, java.lang.Object object)把一個(gè)對(duì)象和一個(gè)屬性名綁定,將這個(gè)對(duì)象存儲(chǔ)在ServletContext中。
getAttribute(java.lang.String name)根據(jù)給定的屬性名返回所綁定的對(duì)象。
?
參考資料
圣思園張龍老師Java Web視頻教程。
參考文檔:
1.javax.servlet包:定義了所有的Servlet類都必須實(shí)現(xiàn)或擴(kuò)展的通用接口和類。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/package-summary.html
?
2.javax.servlet.http包:定義了采用HTTP協(xié)議通信的HttpServlet類。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/package-summary.html
API的源碼可以去Tomcat官網(wǎng)下載:
http://tomcat.apache.org/download-70.cgi
轉(zhuǎn)載于:https://www.cnblogs.com/gwq369/p/5276045.html
總結(jié)
以上是生活随笔為你收集整理的Servlet基础(一) Servlet基础和关键的API介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小拉出行有什么独特的服务吗?
- 下一篇: 国六b对汽车有什么影响呢?