这是最近学完servlet后做的第一个小项目,大概总结一下,前面写用户模块的时候总感觉不得劲。所以先将这个项目的大体的东西写一下吧,后续如果想起来什么还会再加进去。
一、设计思想
这个项目,用到的设计思想就是mvc的一种设计模式,简单介绍一下mvc的发展历史吧。。写的不全
1、刚开始人们在使用servlet的时候就发现了一些不好的地方,servlet在向前端网页做输出操作的时候过于复杂,虽然可以使用response.getwriter()的方式去写,但这样一句一句的写,太复杂了。所以sun公司就推出了一种动态向
网页输出的技术:jsp。
2、随着jsp的推出,servlet就被人们遗忘了,因为jsp既可以在html中写java代码,也可以写html的标签。有着
servlet无法比拟的优点,所以人们就开始用jsp做开发。
3、这样的情况持续了一段时间后,人们又发现jsp虽然有着这样那样的好处,但在封装数据方面还差点意思。所以
人们就想到可以使用JavaBean的方式来封装数据,使用jsp来传输数据,这样就看起来天衣无缝了。这个被也被称为
mvc设计模式的model1.
4、而又过了一段时间,人们又发现了一些不好的地方,使用jsp和JavaBean来开发的程序扩展起来很不方便,因为
太乱了。任何java代码都可以来取数据,放数据,很不利于程序的扩展性。这时候,我们的servlet终于被人们想起来了,
它在jsp与JavaBean中间可以充当一个控制器的效果,这也被称为mvc的model2.
m:model 用来封装数据的JavaBean,后面讲到的service和dao层其实也被称为m
v:view用于数据的展示,其实就是jsp所做的工作
c:就是控制器,在v 及 m之间。用来处理请求以及请求的转发
以上就是对mvc设计模式的大概介绍:
二、目录结构
而这个项目也是用到了这种设计模式,将所有前端传过来的http请求通过servlet的处理,再转发到前端,或者
传到service层,再传到dao层做数据的增删改查。
这个就是这个项目中的包结构,没有很复杂。。。
三、BaseServlet模板类
刚开始就碰到了一个问题,如果一次请求就建立一个servlet来处理,那么服务器里的servlet就会很多,所占用的内存也会很大
这里为了避免这个问题,我们会建立一个BaseServlet来做所有servlet的父类,来减少服务器内servlet的数量。BaseServelt的代码
也很简单。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//使用前端发送请求时所携带的参数来确定请求的模块
String methodName = req.getParameter("method");
resp.setContentType("text/html;charset=utf-8");
if(methodName == null || "".equals(methodName)){
resp.getWriter().write("方法参数为空");
return;
}
//使用反射方式判断请求的模块
Class clazz = this.getClass();
//获取子类处理请求的方法
Method method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//若处理请求的方法中需要进行转发或重定向,则可以返回路径
String path = (String) method.invoke(this, req,resp);
if(path!=null){
if(path.startsWith(req.getContextPath()))
resp.sendRedirect(path);
else{
req.getRequestDispatcher(path).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
这段代码中比较难以理解的可能就下面这句:
//若处理请求的方法中需要进行转发或重定向,则可以返回路径
String path = (String) method.invoke(this, req,resp);
这个方法在反射中的Method类中,用来执行当前method对象代表的方法,而方法参数需要传递的是方法所在类的对象以及执行方法
所需要的参数。而这里的this就是指继承BaseServlet类的子类的对象。其实换一种思路想就很好理解了,该方法最终在子类中执行,那么,this
指代当前类的对象也是理所当然的。如果把这段代码copy到子类中,这个this就很好理解了。
编写BaseServlet类这种方式也被称为是模板设计模式,这里先简单提一个,以后再做系统的总结。