閱讀323 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Servlet、JSP和Spring MVC初學指南》——1.8 GenericServlet

本節書摘來自異步社區《Servlet、JSP和Spring MVC初學指南》一書中的第1章,第1.8節,作者:【加】Budi Kurniawan(克尼亞萬) , 【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

1.8 GenericServlet

前麵的例子中展示了如何通過實現Servlet接口來編寫Servlet。但你注意到沒有?它們必須給Servlet中的所有方法都提供實現,即便其中有一些根本就沒有包含任何代碼。此外,還需要將ServletConfig對象保存到類級變量中。

值得慶幸的是GenericServlet抽象類的出現。本著盡可能使代碼簡單的原則, GenericServlet實現了Servlet和ServletConfig接口,並完成以下任務:

將init方法中的ServletConfig賦給一個類級變量,以便可以通過調用getServletConfig獲取。
為Servlet接口中的所有方法提供默認的實現。
提供方法,包圍ServletConfig中的方法。
GenericServlet通過將ServletConfig賦給init方法中的類級變量servletConfig,來保存ServletConfig。下麵就是GenericServlet中的init實現:

public void init(ServletConfig servletConfig)
        throws ServletException {
    this.servletConfig = servletConfig;
    this.init();
}
但```  
是,如果在類中覆蓋了這個方法,就會調用Servlet中的init方法,並且還必須調用super.init(servletConfig)來保存ServletConfig。為了避免上述麻煩,GenericServlet提供了第二個init方法,它不帶參數。這個方法是在ServletConfig被賦給servletConfig後,由第一個init方法調用:
```javascript
public void init(ServletConfig servletConfig)
        throws ServletException {
    this.servletConfig = servletConfig;
    this.init();
}
這```  
意味著,可以通過覆蓋沒有參數的init方法來編寫初始化代碼,ServletConfig則仍然由GenericServlet實例保存。

清單1.3中的GenericServletDemoServlet類是對清單1.2中ServletConfigDemoServlet類的改寫。注意,這個新的Servlet擴展了GenericServlet,而不是實現Servlet。

清單1.3 GenericServletDemoServlet類
```javascript
package app01a;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(name = "GenericServletDemoServlet",
    urlPatterns = { "/generic" },
    initParams = {
        @WebInitParam(name="admin", value="Harry Taciak"),
        @WebInitParam(name="email", value="admin@example.com")
    }
)
public class GenericServletDemoServlet extends GenericServlet {

    private static final long serialVersionUID = 62500890L;
    @Override
    public void service(ServletRequest request,
            ServletResponse response)
            throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        String admin = servletConfig.getInitParameter("admin");
        String email = servletConfig.getInitParameter("email");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.print("<html><head></head><body>" +
                "Admin:" + admin +
                "<br/>Email:" + email +
                "</body></html>");
    }
}

可見,通過擴展GenericServlet,就不需要覆蓋沒有計劃改變的方法。因此,代碼變得更加整潔。在清單 1.3 中,唯一被覆蓋的方法是 Service 方法。而且,不必親自保存ServletConfig。

利用下麵這個URL調用Servlet,其結果應該與ServletConfigDemoServlet相似:

https://localhost:8080/app01a/generic
即使GenericServlet是對Servlet一個很好的加強,但它也不常用,因為它畢竟不像HttpServlet那麼高級。HttpServlet才是主角,在現實的應用程序中被廣泛使用。關於它的詳情,請查閱1.9節。

最後更新:2017-05-27 17:31:25

  上一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.9 Http Servlets
  下一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.7 ServletContext