servlet三種方式實現servlet接口

簡單介紹

Servlet接口實現類java

一、Servlet接口SUN公司定義了兩個默認實現類,分別爲:GenericServlet、HttpServlet。web

二、HttpServlet指可以處理HTTP請求的servlet,它在原有Servlet接口上添加了一些與HTTP協議處理方法,它比Servlet接口的功能更爲強大。所以開發人員在編寫Servlet時,一般應繼承這個類,而避免直接去實現Servlet接口。apache

三、HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如爲GET請求,則調用HttpServlet的doGet方法,如爲Post請求,則調用doPost方法。所以,開發人員在編寫Servlet時,一般只須要覆寫doGet或doPost方法,而不要去覆寫service方法。設計模式

接口分離原則:

    將一個包含多功能的單一接口根據函數功能分離稱多個獨立的接口,同時每一個接口都有本身特有的、有意義的、具備實際哦那功能的修飾器。
    多重接口修飾:
         每一個修飾器設計時都須要首先實現他要修飾的接口,能夠配合應用 適配器和修飾器這兩個模式來構建多重修飾器,同時也能保證代碼量最少。
客戶端構建:
    爲客戶端提供接口實例的方式必定程度上取決於接口實現的數目。若是每一個接口都有本身特有的實現,那就須要構造全部實現的實例並提供給客戶端。或者若是全部的接口的實現都包含在單個類中,那麼只須要構建該類的實例就可以知足客戶端的全部依賴。
    一、多接口、多實例:
        控制器類:將全部方法整合到控制器類中(構造函數傳入參數爲各個接口)。控制器類中的每一個方法都須要一個不一樣的接口來執行他的功能。
    二、單接口、單實例:
        在單個類中繼承並實現全部接口。這樣將每一個接口的實現方法都整合到一個類中。(通常用於葉子實現類)瀏覽器

Servlet的做用:

1.接收請求數據服務器

2.處理請求app

3.完成響應ide

Servlet接口中的五大方法:函數

其中有三個是生命週期方法:post

1.void init(ServletConfig).當Servlet對象被服務器建立時調用,僅調用一次。

2.void service(ServletRequest, ServletResponse).可被服務器調用屢次。

3.void destroy().服務器關閉鏈接以前調用,僅一次。

另外的兩個:

4.ServletConfig getServletConfig()

5.String getServletInfo()

Servlet代碼源

package javax.servlet; import java.io.IOException; public interface Servlet { void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy(); }
View Code

HttpServlet代碼源

package javax.servlet.http; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.Enumeration; import java.util.ResourceBundle; import javax.servlet.DispatcherType; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public abstract class HttpServlet extends GenericServlet { private static final long serialVersionUID = 1L; private static final String METHOD_DELETE = "DELETE"; private static final String METHOD_HEAD = "HEAD"; private static final String METHOD_GET = "GET"; private static final String METHOD_OPTIONS = "OPTIONS"; private static final String METHOD_POST = "POST"; private static final String METHOD_PUT = "PUT"; private static final String METHOD_TRACE = "TRACE"; private static final String HEADER_IFMODSINCE = "If-Modified-Since"; private static final String HEADER_LASTMOD = "Last-Modified"; private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings"; private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings"); public HttpServlet() { } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_get_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } } protected long getLastModified(HttpServletRequest req) { return -1L; } protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) { this.doGet(req, resp); } else { NoBodyResponse response = new NoBodyResponse(resp); this.doGet(req, response); response.setContentLength(); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_post_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } } protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_put_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } } protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_delete_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } } private static Method[] getAllDeclaredMethods(Class<?> c) { if (c.equals(HttpServlet.class)) { return null; } else { Method[] parentMethods = getAllDeclaredMethods(c.getSuperclass()); Method[] thisMethods = c.getDeclaredMethods(); if (parentMethods != null && parentMethods.length > 0) { Method[] allMethods = new Method[parentMethods.length + thisMethods.length]; System.arraycopy(parentMethods, 0, allMethods, 0, parentMethods.length); System.arraycopy(thisMethods, 0, allMethods, parentMethods.length, thisMethods.length); thisMethods = allMethods; } return thisMethods; } } protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Method[] methods = getAllDeclaredMethods(this.getClass()); boolean ALLOW_GET = false; boolean ALLOW_HEAD = false; boolean ALLOW_POST = false; boolean ALLOW_PUT = false; boolean ALLOW_DELETE = false; boolean ALLOW_TRACE = true; boolean ALLOW_OPTIONS = true; Class clazz = null; try { clazz = Class.forName("org.apache.catalina.connector.RequestFacade"); Method getAllowTrace = clazz.getMethod("getAllowTrace", (Class[])null); ALLOW_TRACE = (Boolean)getAllowTrace.invoke(req, (Object[])null); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException var14) { ; } for(int i = 0; i < methods.length; ++i) { Method m = methods[i]; if (m.getName().equals("doGet")) { ALLOW_GET = true; ALLOW_HEAD = true; } if (m.getName().equals("doPost")) { ALLOW_POST = true; } if (m.getName().equals("doPut")) { ALLOW_PUT = true; } if (m.getName().equals("doDelete")) { ALLOW_DELETE = true; } } String allow = null; if (ALLOW_GET) { allow = "GET"; } if (ALLOW_HEAD) { if (allow == null) { allow = "HEAD"; } else { allow = allow + ", HEAD"; } } if (ALLOW_POST) { if (allow == null) { allow = "POST"; } else { allow = allow + ", POST"; } } if (ALLOW_PUT) { if (allow == null) { allow = "PUT"; } else { allow = allow + ", PUT"; } } if (ALLOW_DELETE) { if (allow == null) { allow = "DELETE"; } else { allow = allow + ", DELETE"; } } if (ALLOW_TRACE) { if (allow == null) { allow = "TRACE"; } else { allow = allow + ", TRACE"; } } if (ALLOW_OPTIONS) { if (allow == null) { allow = "OPTIONS"; } else { allow = allow + ", OPTIONS"; } } resp.setHeader("Allow", allow); } protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String CRLF = "\r\n"; StringBuilder buffer = (new StringBuilder("TRACE ")).append(req.getRequestURI()).append(" ").append(req.getProtocol()); Enumeration reqHeaderEnum = req.getHeaderNames(); while(reqHeaderEnum.hasMoreElements()) { String headerName = (String)reqHeaderEnum.nextElement(); buffer.append(CRLF).append(headerName).append(": ").append(req.getHeader(headerName)); } buffer.append(CRLF); int responseLength = buffer.length(); resp.setContentType("message/http"); resp.setContentLength(responseLength); ServletOutputStream out = resp.getOutputStream(); out.print(buffer.toString()); out.close(); } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); long lastModified; if (method.equals("GET")) { lastModified = this.getLastModified(req); if (lastModified == -1L) { this.doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader("If-Modified-Since"); } catch (IllegalArgumentException var9) { ifModifiedSince = -1L; } if (ifModifiedSince < lastModified / 1000L * 1000L) { this.maybeSetLastModified(resp, lastModified); this.doGet(req, resp); } else { resp.setStatus(304); } } } else if (method.equals("HEAD")) { lastModified = this.getLastModified(req); this.maybeSetLastModified(resp, lastModified); this.doHead(req, resp); } else if (method.equals("POST")) { this.doPost(req, resp); } else if (method.equals("PUT")) { this.doPut(req, resp); } else if (method.equals("DELETE")) { this.doDelete(req, resp); } else if (method.equals("OPTIONS")) { this.doOptions(req, resp); } else if (method.equals("TRACE")) { this.doTrace(req, resp); } else { String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[]{method}; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(501, errMsg); } } private void maybeSetLastModified(HttpServletResponse resp, long lastModified) { if (!resp.containsHeader("Last-Modified")) { if (lastModified >= 0L) { resp.setDateHeader("Last-Modified", lastModified); } } } public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest)req; response = (HttpServletResponse)res; } catch (ClassCastException var6) { throw new ServletException("non-HTTP request or response"); } this.service(request, response); } }
View Code

GenericServlet代碼源

package javax.servlet; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final long serialVersionUID = 1L; private transient ServletConfig config; public GenericServlet() { } public void destroy() { } public String getInitParameter(String name) { return this.getServletConfig().getInitParameter(name); } public Enumeration<String> getInitParameterNames() { return this.getServletConfig().getInitParameterNames(); } public ServletConfig getServletConfig() { return this.config; } public ServletContext getServletContext() { return this.getServletConfig().getServletContext(); } public String getServletInfo() { return ""; } public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } public void init() throws ServletException { } public void log(String msg) { this.getServletContext().log(this.getServletName() + ": " + msg); } public void log(String message, Throwable t) { this.getServletContext().log(this.getServletName() + ": " + message, t); } public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; public String getServletName() { return this.config.getServletName(); } }
View Code

 

 實現接口代碼:

package com.wbg; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/MyServlet") public class MyServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化servlet"); } @Override public ServletConfig getServletConfig() { System.out.println("getServletConfig()"); return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("正在銷燬"); } @Override public String getServletInfo() { System.out.println("getServletInfo()"); return null; } @Override public void destroy() { System.out.println("正在銷燬"); } }

 

 

 

瀏覽器訪問servlet時,須要將servlet與路徑綁定,須要在web.xml中對servlet進行配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
    <servlet>

<servlet-name>testservlet</servlet-name>
 <servlet-class>com.wbg.testservlet</servlet-class> </servlet> </web-app>

實現接口的意義:

一、接口和實現分離給軟件系統提供了無限的想像空間,才使得軟件世界如此豐富多彩。

二、接口和實現分離使得多態變爲可能

三、接口和實現分離使得解耦變爲可能

四、接口和實現分離使得組合更有意義

五、接口和實現分離使得設計模式變爲可能,才能衍生出23種設計模式。

簡單的說接口和實現分離給軟件系統提供了無限的想象空間、多態變爲可能、解耦變爲可能、組合更有意義、設計模式變爲可能,才能衍生出23鍾設計模式(建立型、結構型、行爲型)

相關文章
相關標籤/搜索