/*第31集 */
我们目前所有的Servlet类直接实现了javax.servlet。Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能指选哟编写service。直接实现Servlet接口的话,代码比较冗余,有必要在中间添加一个适配器,以后所有的Servlet类不再直接实现Servlet接口,应该去继承适配器类。
同时我们可以在适配器中添加大量的方法,子类继承之后可以在子类中直接使用。
- 手写一个GenericServlet接口(适配器)
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public abstract class GenericServlet implements Servlet {
private ServletConfig config;
@Override
public void init(ServletConfig arg0) throws ServletException {
}
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException ;
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
//------一下所有方法都是扩展方法,方便子类的使用-----------
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
}
- 我们创建一个Servlet直接继承GenericServlet:
package com.ztaistudy.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet extends GenericServlet {
//在这个给地方重写init()方法会出问题,不能被覆盖。
//所以我们在继承适配器的时候,怎么在初始化的时候写?
//答案:我们应该在适配器里面构造一个方法
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("hello world!");
}
//右键--source--override
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("helloServlet`s init......");
}
}
- 我们如果向想在GenericServlet中重写init()方法,语句中必须有super.init();可以使用更小巧的方法。
源码解释: