首先来看看没有BaseServlet的时候我们在做Servlet的时候是怎么做
似曾相识又陌生,以前都是重写doGet,DoPost没有使用过service方法的,但是在这里我重写了Service方法。首先大家清楚一点就是了,doGet是能处理Get请求doPost是处理post请求,那么Service方法就是处理get和post请求。所以下来我们就用service了,为什么一定要用service下文会有说明。(一般不重写Service是因为service方法自己实现了缓存协商的机制,如果我们重写它,反而将这中良好的机制给去掉了。)
我这里有三个Servlet,分别是对用户的增删改操作,就是注册修改信息和删除用户,他们的共同点是什么?就是都是对用户的操作,那么大家有没有觉得我这样一个操作一个Servlet我的Servlet是不是太多了?那一个项目下来我就有无数个Servlet类,是不是很麻烦??有没有办法对一个对象的操作我用一个Servlet就可以解决完,比如对用户的增删改查我弄到一个Servlet里面,这样简洁又方便,我首先是想到的以下的代码:
这个代码的意思是我以url跟参的方式把我要做的操作以v=方法名这样的方式传到后台(比如说user.do?v=add传到后台v就是add),这样我在后台通过对v的判断就可以实现一个Servlet里有多个操作,这样代码就大大的简洁了,但是!如果我一个对象有多个操作,比如就是查询操作,我可以根据Id查根据名字查等等这样我一个对象的操作就可能有很多很多,那么我这个Servlet里面就有很多if判断,那么我们就可以用BaseServlet来避免这种一个Servlet里面出现无数个if判断的情况。
所以大家要明白一点,BaseServlet不是什么高档东西,只是一个程序员偷懒的工具的罢了。没有BaseServlet我照样能做项目但是可能代码就会相当的 繁琐。
看之前明确一点,我的所有Servlet都是继承了BaseServlet,所以我的Servlet里面也继承了BaseServlet的service方法,记住!
首先我们分析一下代码。毫无疑问的,这个BaseServlet要继承HTTPServlet,然后重写service方法。然后我一行代码一行代码的给大家解释一下。
第一行代码(request.setCharacterEncoding("UTF-8");)
这个就是设置一个编码集。相信大家不会陌生。
第二行代码(String v = request.getParameter("v");)
这个就是把url跟参的v=方法名这个的v获取到后台,之前我们也是这样做的只是要在后台增加无数个判断来判断这个请求到底是要调用哪个操作。
第三行代码(Method method = null;)
定义一个类型为Method的对象。这个Mthod就是之前java反射里面的Method,人如其名这个Method的名字和作用都是方法的意思。
第四行(method = getClass().getMethod(v, HttpServletRequest.class,HttpServletResponse.class);)
这个是关键代码,首先getClass大家肯定知道什么意思,就是获取正在运行的类的对象,然后getmethod,大家看看在API中对此的解释
“返回 Method 对象,它反映此Class 对象所表示的类或接口的指定公共成员方法。name参数是一个 String,用于指定所需方法的简称。parameterTypes参数是按声明顺序标识该方法形参类型的 Class对象的一个数组。如果 parameterTypes为 null,则按空数组处理。”,顾名思义,就是就是获取到该cass对象里面指定的方法,他有两个参数,第一个是方法名字第二个是参数列表。
好,那么我们倒过来看第四行代码,我们把这行代码写得完整一点就是:this.getClass().getMethod(v, HttpServletRequest.class,HttpServletResponse.class);
意思很清楚了,this表示当前类,那么这行代码的意思就是:获取当前类的名字为V参数为HttpServletRequest,HttpServletResponse的方法。
第五行代码:(String result =(String) method .invoke(this,request, response);)
这个method就是上文的method,他表示当前类下指定了名字和参数列表的方法。现在看看API中对invoke的解释
我们直接看最后一行,这个函数的返回是使用参数 args 在 obj 上指派该对象所表示方法的结果。而对args和obj的解释是:
那么这行代码意思就很简单了,我在当前对象里就是这里的类里面执行上面的method,且我传进去两个参数request和response,这样说大家有点难懂,我换个方法来说,这句代码的意思就是:this.method(request,reponse)就是在service方法里面执行我同类的方法,并用一个字符串类型的result来接收返回值。
我写了个例子帮助大家更好的理解,第五行代码就和上图的第五行代码的作用是一模一样的,只是BaseServlet的第五行代码利用了java反射就可以动态的执行不同的方法上图的第五行代码只能执行add方法。
接下来的代码就很简单了,
我一起说了,就是对这个返回值进行解析,大家记住在Servlet我们的返回值就是”r:index.html“这种形式。所以这里对返回值进行解析看返回值写的是要用转发还是重定向,然后看跳转到的目标网页,在用决定用request.getRequestDispatcher还是response.sendRedirect。
好了,最后BaseServlet解析完了,我们来看看怎么使用。
就是在你的Servlet首先继承BaseServlet就可以了
就像这样。类继承BaseServlet,我的方法就关心我要处理的业务,改什么操作就操作,然后把目标网页返回出去,前面加个跳转的类型,然后BaseServlet就可以帮助你处理一切了。