1.GenericServlet:
1).是一个Servlet 。是Servlet接口和ServletConfig接口的实现类。但是一个抽象类。其中的service方法为抽象类
2).如果新建的Servlet程序 直接继承GenericServlet会使开发更简洁。
3).具体实现:
①.在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
②.利用servletConfig 成员变量的方法实现了ServletConfig接口的方法
③.还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
④.不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(config);,而还是用了ServletConfig接口的方法,
则会出现空指针异常。
⑤.新建的init(){}并非Servlet 的生命周期方法。而init(ServletConfig)是生命周期相关的方法。
public abstract class MyGenericServlet implements Servlet ,ServletConfig{
/*以下方法为Servlet接口的方法*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return servletConfig;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
private ServletConfig servletConfig;
@Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig=arg0;
init();
}
public void init() throws ServletException {
// TODO Auto-generated method stub
}
@Override
public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ;
@Override
public String getInitParameter(String arg0) {
// TODO Auto-generated method stub
return servletConfig.getInitParameter(arg0);
}
/*以下方法为ServletConfig接口的方法*/
@Override
public Enumeration<String> getInitParameterNames() {
// TODO Auto-generated method stub
return servletConfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return servletConfig.getServletContext();
}
@Override
public String getServletName() {
// TODO Auto-generated method stub
return servletConfig.getServletName();
}
}
2.HttpServlet
1).是一个Servlet(),继承自GenericServlet。针对于HTTP协议所定制。
2)在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse
并调用了重载的service(HttpServletRequest request, HttpServletResponse response)获取了请求方式:request.getMethod().
根据请求方式又创建了doXXX()方法(XXX代表具体的请求方式 ,比如doGET,doPOST)
代码:
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
if (arg0 instanceof HttpServletRequest) {
HttpServletRequest request=(HttpServletRequest)arg0;
if (arg1 instanceof HttpServletResponse) {
HttpServletResponse response=(HttpServletResponse) arg1;
service(request,response);//重载
}
}
}
private void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// TODO Auto-generated method stub
//1.获得请求方式
String method =request.getMethod();
//2.根据请求方式在调用对应的处理方法。
if ("GET".equalsIgnoreCase(method)) {
doGet(request,response);
}else if ("POST".equalsIgnoreCase(method)) {
doPost(request,response);
}
}
private void doPost(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
private void doGet(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
3).实际开发中, 直接继承HttpServlet,并根据请求方式复写doXXX()方法即可。
4).好处:直接有针对性的覆盖doXXX()方法;直接使用HttpServletRequest和 HttpServletResponse ,不在需要强转。