博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet 详解(二)-继承体系
阅读量:4982 次
发布时间:2019-06-12

本文共 5818 字,大约阅读时间需要 19 分钟。

servlet 详解(二)-继承体系

熟悉servlet,我们不只是要用到,还要彻底研究他的继承体系,如果之前没有认真学习他的生命周期和运行过程,那么继承体系你也只能有个略懂。

我的做法,自己写类来模拟 genericservlet和httpservlet2个类!并且理解他们为什么要这么做!

(一)模拟genericservlet

1,我们新建一个类,如MyGenericServlet,让他实现Servlet、ServletConfig和Serializable

前2个类Servlet、ServletConfig,我们不需要详述,前面我已经讲过作用,Serializable这个接口是为了让他能在网络上传输。

2,实现他的一些基本方法,如下:

private ServletConfig config;//实现config参数@Overridepublic void destroy() {    // TODO Auto-generated method stub    }@Overridepublic String getInitParameter(String param) {    // TODO Auto-generated method stub    return config.getInitParameter(param);}@Overridepublic Enumeration
getInitParameterNames() { // TODO Auto-generated method stub return config.getInitParameterNames();}@Overridepublic String getServletName() { // TODO Auto-generated method stub return null;}@Overridepublic ServletConfig getServletConfig() { // TODO Auto-generated method stub return this.config;}@Overridepublic String getServletInfo() { // TODO Auto-generated method stub return null;}@Overridepublic void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub this.config=config; init(); }public void init() throws ServletException { }@Overridepublic void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("hello world"); }public ServletContext getServletContext(){ return config.getServletContext();}

我们说servlet的生命周期是首先运行带有参的init方法,那么我们想要子类重写并且保障config被传入就一定要定义一个空参的方法,并且在有参方法中执行,这样根据多态的特性,子类重写父类init方法,被执行的是子类的方法,所以我们只需要在子类重写空参方法,这样保障config被传入后再执行自己的方法,如果子类重写有参方法,那么悲哀了,肯定报错,就没有ServerletConfig对象了!所以在这个类中的init方法是这么实现的!

@Overridepublic void init(ServletConfig config) throws ServletException {    // TODO Auto-generated method stub    this.config=config;    init();    }public void init() throws ServletException {    }

然后讲一下为什么要用getInitParameter(String param)这个方法,子类想要获取config对象,如果没有这个方法我们肯定是这么调用!

super.getServletConfig().getInitParameter("param");

从中看出,servlet为了优化一点点细节,从得多好,他用了一个getInitParameter(String param)方法,让子类可以少写一点点代码.

super.getInitParameter("param");

而自身只多写了这样一个方法,所以我们父类的构造要合理设计!

public String getInitParameter(String param) {        // TODO Auto-generated method stub        return config.getInitParameter(param);    }

子类只需要这样写:

package gwd.com.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class Server2 extends MygenericServlet {    /**     *      */    private static final long serialVersionUID = 1L;    @Override    public void init() throws ServletException {        // TODO Auto-generated method stub        System.out.println("这是我自定义的初始化");    }    @Override    public void service(ServletRequest arg0, ServletResponse arg1)            throws ServletException, IOException {        // TODO Auto-generated method stub        String code=getInitParam("code");        System.out.println(code);    }        }

(二)模拟HttpServlet

至于HttpServerlet这个类是为了http协议而生的,我们建一个MyHttpServlet类!他只处理http请求!而响应或请求我们都在service中实现!

我们再来看看上面这个类(Servlet2)中的service方法!

public void service(ServletRequest arg0, ServletResponse arg1)            throws ServletException, IOException {        // TODO Auto-generated method stub        String code=getInitParam("code");        System.out.println(code);    }

我们看到他的参数名ServletRequest arg0, ServletResponse arg1!ServletRequest和ServletResponse只能用到普通请求,要实现http必须依靠HttpServletRequest和HttpServletResponse来实现,所以我们要把这两个参数强转,然后重载一个service方法单独处理,当然为了代码复用,我们这个MyHttpServlet必须继承MyGenericServlet,代码如下:

package gwd.com.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyHttpServlet extends MygenericServlet {    /**     *      */    private static final long serialVersionUID = 1L;    @Override    public void service(ServletRequest request, ServletResponse response)            throws ServletException, IOException {        // TODO Auto-generated method stub        HttpServletRequest res=(HttpServletRequest) request;        HttpServletResponse resp=(HttpServletResponse)response;        service(res, resp);    }    private void service(HttpServletRequest res, HttpServletResponse res2) {        // TODO Auto-generated method stub        String method=res.getMethod();        //System.out.println(method);        if("GET".equals(method)){            doGet(res,res2);        }        else if("POST".equals(method)){            doPost(res,res2);        }            }    protected void doPost(HttpServletRequest res, HttpServletResponse res2) {        // TODO Auto-generated method stub            }    protected void doGet(HttpServletRequest res, HttpServletResponse res2) {        // TODO Auto-generated method stub            }    }

在重载的service中,我们可以判断出请求的是什么方法,是get还是post,然后分离出来处理,给子类自由实现,这就是著名的模板方法设计模式!(后面我再单独写博!),注意了如果这2个方法写成private的活,子类将无法重写!

然后子类只要继承并重写dopost和doget方法就可以了,我们以后写servlet也只需要继承httpservlet方法,查看httpservlet和GeneticServerlet类的源码,是不是和我的设计差不多呢?

子类我们可以这么写,是不是越来越简单了呢?

package gwd.com.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Sever1 extends MyHttpServlet{    /**     *      */    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest req,HttpServletResponse resp){                System.out.println("doget");            }        protected void doPost(HttpServletRequest req,HttpServletResponse resp){                System.out.println("dopost");            }        }

(三)我们弄张图来总结一下继承体系!

1114325-20170306152216547-18181821.png

时间急,请多指正!

转载于:https://www.cnblogs.com/java-gwd/p/6510130.html

你可能感兴趣的文章