servlet抽取公共类basicServlet

来源:互联网 发布:淘宝开店后怎么卖东西 编辑:程序博客网 时间:2024/06/03 14:37

          初学javaEE的朋友,想必和我当时一样,先是学习servlet,再学jsp(如果返回来,个人觉得并不好,应该从历史发展的角度来理解,毕竟先有了servlet,但是大家觉得在服务器端使用字符串拼接前端的页面,通过responce对象使用输出流输出到浏览器上,实属不易(主要是拼接字符串繁琐带来的不易),接着后面使用jsp,使用jsp(就是在html页面中写java代码),随着业务的复杂,单纯使用jsp已经满足业务需求,随着发展起来的mvc设计,使用servlet,jsp,javabean作为基本,数据层使用javaBean,视图使用jsp,控制层使用servlet。这就形成了javaweb基本架构),接下来我将附上一个demo

项目文件结构

每个servlet代码(由于只是展示,不是这篇的重点)






看过了上面的servlet代码截图和工程的文件结构图,是否有种感觉,文件数太多了(A:4个不多啊? B:这还只是product模块,而且业务还没有,只是简单的增删改查,等到了后面多到自己都看不过来,还有就是重复代码太多了。

那么能不能把这些相关的代码放在一个文件上呢?

现在读者明白了为什么要对servlet进行抽取了吧!

现在我们就来说说,抽取的思路是什么?

如果有http协议,jsp基础的朋友都明天,前台浏览器访问后台程序,无非就是匹配到路径,带上应有的参数(也可以无参数)

例: http://127.0.0.1:8080/project/addProductServlet?name=cherish_laiali&age=22  (大概写的一个路径)

这是我们熟悉的,但是有addProductServlet、deleteProductServlet等等,那么这样不止文件多了,你想想,最终的浏览器匹配的 <url-pattern>也会变得很乱。那么现在跟着前面的思路,将这些方法都放在一个servlet文件中,那么,后台如何区分前台需要执行的方法是哪个(合并后的servlet可就有add、delete等等方法了),这里就牵扯到了java SE的高级知识点,反射。简单的理解,在运行做一些是,实例化对象,执行方法等等,在此不是重点(没有这个知识作为基点,抽取servlet就无法完成)。

现在默认读者已经懂得了基本的反射知识,以及一些方法的使用。

设计一个basicServlet,作为每个servlet的父类

public class BaseServlet extends HttpServlet {


@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.setCharacterEncoding("UTF-8");

try {
//1、获得请求的method的名称
String methodName = req.getParameter("method");
//2、获得当前被访问的对象的字节码对象
Class clazz = this.getClass();
//3、获得当前字节码对象的中的指定方法
Method method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//4、执行相应功能方法
method.invoke(this, req,resp);

} catch (Exception e) {
e.printStackTrace();
}

}
}

如果你懂得反射,上面的代码一看便知,细心的朋友可以发现,编码问题同时解决了,也就可以少一个解决字符中文乱码的问题了。

你如果是 http://127.0.0.1:8080/project/Product?method=addProduct 

在productServlet中没有service、doget、dopost这些方法,他就找到了父类,父类有service方法,他就执行service方法,在父类中的this才是重点,this指的当前对象,切记是子类servlet对象,接着就是反射获取当前需要执行的方法,使用反射的invoke方法执行子类servlet的方法addProduct ()。


讨论到这里,读者估计已经懂得了我们抽取其实就是整合方法,在访问路径上表示需要执行的方法,使用反射执行。

        在这提出一个问题,这设计的方法,例如basicServlet里面的代码都是通用的,每个项目要用的话,基本就能用上,是不是可以提取出来,作为公用的代码?还能不能扩展?


                                            just do it


原创粉丝点击