Struts如何实现MVC
?
struts是java?web目前最常用的实现框架。他采用mvc结构,将页面展现,流程控制和业务处理强有力的分开,结构清晰,思路明确,是进行java?web的最好选择。
java?web组件间的关系基本有三类:
页面跳转(javax.servlet.RequestDispatcher.forward()方法)
页面重定向(javax.servlet.response.sendRedirect()方法)
页面包含(javax.servlet.RequestDispatcher.include()方法).
其中,页面跳转只是在同一个web应用中进行的,传递的是request和response对象;重定向和包含则可以是不同的url内容。
??????java?web组件间的数据共享有四类:page,request,session和application,共享范围有单个页面到整个web应用,依次变大。
?????struts的页面展示用jsp技术实现,按严格的mvc讲,jsp只是负责显示,不负责流程控制和数据处理;流程控制用action实现,在action的execute()里面通过return?actionMapping.findForward()进行跳转,具体的业务处理是有各种java?bean或者ejb来实现的。actionForm也是struts里面的一部分,目的是存储jsp页面提交的内容,供对应的action使用。
struts1.2?的工作流程
Web应用启动时加载并初始化ActionServlet。ActionServlet从struts-config.xml中读取配置信息,把它们存放到各种配置对象中。当ActionServlet接收到一个请求时,流程如下:
1.检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信 息。
2.如果ActionForm实例不存在,就创建一个ActionForm对象,把提交的表单数据保存到 ActionForm中。
3.根据配置,决定是否需表单验证,若需要,则调用ActionForm的validate方法。
4.如果ActionForm的validate方法返回null或返回不包含ActionMessage的ActionErrors 对象,则表示验证成功。
5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action, 如果Action不存在则先创建这个实例,然后调用Action的execute方法。
6.Action的execute方法返回一个ActionForward对象,ActionServlet再把请求转发给 ActionForward对象指向的JSP组件。
7.ActionForward指向的JSP组件生成动态网页,返回给用户。
Struts2的工作流程
?
1?客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2?这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh?Plugin)
3?接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是 否需要调用某个Action
4?如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给 ActionProxy
5?ActionProxy通过Configuration?Manager询问框架的配置文件,找到需要调用的Action 类
6?ActionProxy创建一个ActionInvocation的实例。
7?ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦 截器(Intercepter)的调用。
8?一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返 回结果。返回结果通常是(但不总是,也可?能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2?框架中继承的标签。在这个过程中需要涉及到ActionMapper
?
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。