MVC与Servlet
MVC三层架构
jsp + servlet + javabean开发模式剖析
缺点:
每写一个servlet,就需要在web.xml文件中配置8行,如果一个系统中servlet编写的很多,则会导致web.xml中的内容很多;
项目中很多人编辑一个web.xml文件会出现版本冲突问题;
在一个servlet中,执行url请求的方法的入口只有一个,如果servlet中写了很多的方法,这些方法应该往入口方法中传递参数,然后,在入口方法中根据每次请求的参数来判断执行哪个方法;
servlet处理方法中都有两个参数request,response,这两个参数具有严重的容器依赖性,导致在servlet中写的代码是不能单独测试的;
举一个注册servlet的例子:
RegisterServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) { 1、权限判断的操作 2、获取表单中的数据:如果表单中封装的数据很多,在servlet中要想获得表单中的数据, 会产生很多的request.getParameter代码 3、文件上传功能实现代码 4、对表单上的元素进行验证 5、保存用户信息 6、返回 } }
说明:所有的处理逻辑都在一个servlet中实现,会造成处理方法中写的东西很多很杂,导致结构很乱,不容易调试与排错
- servlet被设计为单例对象,在一个servlet的属性中声明一个数据,会存在线程安全问题。
优点:
- Servlet是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键;
- Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点;
- 程序员可以对servlet进行封装,Struts2就是从servlet中封装以后得到的结果;
- 市场上任何一个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运行机制很关键。
重构Servlet
重构的目标
- 只写一个Servlet或者过滤器(我们这里选择过滤器);
- 不用再写任何的Servlet,这样web.xml文件中的额代码会减少很多;
- 原来需要写Servlet,现在只需要写action;
- 在action中把HttpServletRequest参数和HttpServletResponse参数传递过去;
- 在过滤器中通过java的反射机制调用action。
代码简单实现
(1)写一个UserAction
public class UserAction {
public String execute(HttpServletRequest request,
HttpServletResponse response){
return "index.jsp";
}
}
(2)写一个监听器ActionListener implement ServletContextListener
public class ActionListener implements ServletContextListener{
public void contextDestroyed(ServletContextEvent arg0) {
//在摧毁的时候,清空application域中的所有的action的配置
arg0.getServletContext().setAttribute("actions", null);
}
public void contextInitialized(ServletContextEvent arg0) {
/**
* 1、创建一个Map
* 2、把key,value放入到map中
* 3、把map放入到application中
*/
Map<String, String> map = new HashMap<String, String>();
map.put("userAction", "cn.bin.action.UserAction");
arg0.getServletContext().setAttribute("actions", map);
}
}
(3)通过ActionServlet中java的反射机制进行调用
public void doGet(HttpServletRequest request,HttpServletResponse
response)throws ServletException, IOException {
//1、获取url
//2、对url进行解析,把“userAction”的部分解析出来
//3、获取到application
//4、从application中把Map提取出来
//5、根据“userAction”从map中把value提取出来
//6、利用java的反射机制进行调用
// itcastsh08_super_servlet/userAction.action
String uri = request.getRequestURI();
//处理字符串得到map所需要的key值userAction
String[] str = uri.split("/");
String str1 = str[str.length-1];
String actionName = str1.substring(0, str1.indexOf("."));
//通过key值得到value值(action的类名)
Map<String, String> map =
(Map<String, String>)this.getServletContext().getAttribute("actions");
String actionClassName = map.get(actionName);
try {
//得到请求的action所对应的execute方法
Class classt = Class.forName(actionClassName);
String httprequest = "javax.servlet.http.HttpServletRequest";
Class requestClass = Class.forName(httprequest);
String httpresponse = "javax.servlet.http.HttpServletResponse";
Class responseClass = Class.forName(httpresponse);
Method method = classt.getMethod("execute", requestClass,responseClass);
String result =
(String) method.invoke(classt.newInstance(), request,response);
request.getRequestDispatcher(result).forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
(4)web.xml的配置
<listener>
<listener-class>cn.itcast.sh08.listener.ActionListener</listener-class>
</listener>
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>cn.itcast.sh08.servlet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
Struts2介绍
Struts2是什么?
- struts2是apache组织发明的开源框架。是struts的第二代产品;
- struts2是在struts和webwork基础上整合的全新的框架;
- struts2的配置文件组织更合理,是企业开发很好的选择;
- struts2的拦截器为mvc框架注入了全新的概念。
Struts2能干什么?
- Struts2通过简单、集中的配置来调度动作类,使得配置和修改都非常容易;
- Struts2提供简单、统一的表达式语言来访问所有可供访问的数据;
- Struts2提供内存式的数据中心,所有可供访问的数据都集中存放在内存中,所以在调用中不需要将数据传来传去,只要去这个内存数据中心访问即可;
- Struts2提供在动作类执行的前或后附加执行一定功能的能力,能实现AOP;
- Struts2提供标准的、强大的验证框架和国际化框架,而且与Struts2的其他特性紧密结合。
Struts2和MVC
前面说到Struts2是一种基于MVC的Web应用框架,上图显示了Struts是如何与MVC对应的,其中一些名词所代表的具体功能,比如前端控制器(FilterDispatcher)、动作(Action)、结果视图(Result)等,将在后边章节进行介绍。