Servlet基础(一) Servlet基础和关键的API介绍
轉載:http://www.cnblogs.com/mengdd/p/3202550.html
Servlet基礎(一) Servlet簡介 關鍵API介紹及結合源碼講解
Servlet基礎(一) Servlet基礎和關鍵的API介紹
?
Servlet簡介
Java Servlet是和平臺無關的服務器端組件,它運行在Servlet容器中。
Servlet容器負責Servlet和客戶的通信以及調用Servlet的方法,Servlet和客戶的通信采用“請求/響應”的模式。
?
Servlet可完成如下功能:
創建并返回基于客戶請求的動態HTML頁面。
創建可以嵌入到現有HTML頁面中的部分HTML頁面(HTML片段)。
與其他服務器資源(如數據庫或基于Java的應用程序)進行通信。
?
Servlet API
Servlet的框架是由兩個Java包組成:
1.javax.servlet包:定義了所有的Servlet類都必須實現或擴展的通用接口和類。
2.javax.servlet.http包:定義了采用HTTP協議通信的HttpServlet類。
?
javax.servlet.Servlet
Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必須實現這一接口。
在Servlet接口中定義了五個方法,其中有三個方法代表了Servlet的生命周期:
init方法:負責初始化Servlet對象。
service方法:負責響應客戶的請求。
destroy方法:當Servlet對象退出生命周期時,負責釋放占用的資源。
?
HttpServlet
每一個Servlet都必須要實現Servlet接口。
GenericServlet是個通用的、不特定于任何協議的Servlet,它實現了Servlet接口。
HttpServlet繼承于GenericServlet,因此我們定義的Servlet只需要繼承HttpServlet即可。
?
Servlet接口中定義了一個service方法,HttpServlet對該方法進行了實現。
HttpServlet對service方法的實現方式:
第一步,進行一個分發。
將ServletRequest與ServletResponse轉換為HttpServletRequest與HttpServletResponse,
轉換完畢后,會調用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);}?
第二步,從上個service方法中接收標準的HTTP請求,然后將它們繼續分發到相應的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);}}第二個service方法
?
?
在HttpServlet的第二個service方法中,首先從HttpServletRequest對象中獲取HTTP請求方式的信息,然后再根據請求的方法名調用相應的方法doXXX方法。
比如,如果請求方式為GET,那么調用doGet方法;如果請求方式為POST,那么調用doPost方法。
如果你的Servlet類擴展了HttpServlet類,你通常不必實現service方法。
需要注意的是在HttpServlet類中所提供的doGet、doPost等方法都是直接返回錯誤信息,所以我們需要在自己定義的Servlet類中override這些方法。
?
ServletRequest接口
ServletRequest接口中封裝了客戶請求信息,如客戶請求方式、參數名和參數值、客戶端正在使用的協議,以及發出客戶請求的遠程主機信息等。
ServletRequest接口還為Servlet提供了直接以二進制方式讀取客戶請求數據流的ServletInputStream。
ServletRequest的子類可以為Servlet提供更多的和特定協議相關的數據。
例如,HttpServletRequest提供了讀取HTTP Head信息的方法。
?
ServletResponse接口
ServletResponse接口為Servlet提供了返回響應結果的方法。
它允許Servlet設置返回數據的長度和MIME類型,并且提供輸出流ServletOutputStream。
ServletResponse子類可以提供更多和特定協議相關的方法。
例如,HttpServletResponse提供設定HTTP Head信息的方法。
?
?
?
創建自己的HttpServlet類的步驟
1.擴展HttpServlet抽象類。
2.覆蓋HttpServlet的部分方法,如覆蓋doGet()或doPost()方法。
3.獲取HTTP請求信息,例如通過HttpServletRequest對象來檢索HTML表單所提交的數據或URL上的查詢字符串。
無論是表單數據還是URL上的查詢字符串,在HttpServletRequest對象中都以參數名/參數值的形式存放,你可以通過getParameter()方法檢索參數信息。
4.生成HTTP響應結果。
通過HttpServletResponse對象可以生成響應結果。
HttpServletResponse對象有一個getWritter()方法,該方法返回一個PrintWriter對象。
用PrintWritter的print()或println()方法可以向客戶端發送字符串數據流。
比如下面這個簡單的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應用關系
當Servlet容器啟動Web應用時,為每個Web應用創建唯一的ServletContext對象。
你可以把ServletContext看成是一個Web應用的服務器端組件的共享內存。
在ServletContext中可以存放共享數據,它提供了讀取或設置共享數據的方法:
setAttribute(java.lang.String name, java.lang.Object object)把一個對象和一個屬性名綁定,將這個對象存儲在ServletContext中。
getAttribute(java.lang.String name)根據給定的屬性名返回所綁定的對象。
?
參考資料
圣思園張龍老師Java Web視頻教程。
參考文檔:
1.javax.servlet包:定義了所有的Servlet類都必須實現或擴展的通用接口和類。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/package-summary.html
?
2.javax.servlet.http包:定義了采用HTTP協議通信的HttpServlet類。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/package-summary.html
API的源碼可以去Tomcat官網下載:
http://tomcat.apache.org/download-70.cgi
轉載于:https://www.cnblogs.com/gwq369/p/5276045.html
總結
以上是生活随笔為你收集整理的Servlet基础(一) Servlet基础和关键的API介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小拉出行有什么独特的服务吗?
- 下一篇: 国六b对汽车有什么影响呢?