what?
struts2是一个基于mvc模式的web层框架,基于前端控制器的模式,以webWork为核心,采用拦截器的机制来处理用户的请求,使业务逻辑控制器与servlet的ApI完全脱离。
什么是前端控制器模式?
传统方式的开发,有一次请求就会对一个Servlet,这样会导致出很多servlet
struts2框架: 将所有的请求都先经过一个前端控制器,在前端控制器中实现框架的部分功能,剩下具体操作要提交到具体的Action中。
而前端控制器就是通过过滤器来实现的,因为需要所有的请求都可以被过滤器拦截,然后再过滤器中实现部分的功能。
如图所示:
工作原理
点击打开链接
http://blog.youkuaiyun.com/laner0515/article/details/27692673/
1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2.这个请求经过一系列的过滤器,(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3.接着FilterDispatcher被调用,FilterDispather询问ActionMapper来决定这个请求是否需要调用某个Action
4.如果ActionMapper决定需要调用某个Action,FiletrDispatcher把请求的处理交给ActionProxy
5.ActionProxy通过ConfigurationManager询问框架的配置文件(struts.xml),找到需要调用的Action类
6..ActionProxy创建一个ActionInvocation的实例
7.ActionInvocation的实例使用命名模式来调用,在调用Action的过程前后,涉及到相应的拦截器的调用
8.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到相应的返回结果。返回结果通常是一个需要被jsp或者FreeMaker的模板。在表示的过程中, 可以使用 struts2框架中继承的标签,在这个过程中需要涉及到ActionMapper
框架图:
Struts2工作原理(基于看完上图的理解):参考链接http://blog.youkuaiyun.com/izard999/article/details/39891281
当一个HttpServletRequest请求来了,先经过ActionContextCleanUp过滤器,清除Action环境,
再经过其他的过滤器,例如说SiteMesh和用户自定义过滤器等等, 最后到达Struts2的核心过滤器StrutsPrepareAndExecuteFilter,
此时,StrutsPrepareAndExecuteFilter会去找ActionMapping看此Action路径是否存在,如果存在,则会参照Struts.xml文件产生Action的代理,
并且执行Action,Struts2很多功能是靠拦截器完成的,所以这个Action代理真正调用Action的处理请求的方法的时候会经过拦截器1,2,3,
才真正调用Action的方法,Action方法结束后会返回一个视图,视图也会去参照ActionMapping,还会参照Template(JSP,FreeMarker),此时,
拦截器会再次拦截(说明Struts2的拦截器是进入Action和返回结果的时候都会拦截的,这比Filter好!),最后产生HttpServletResponse,相应结果!
工作流程:
1.客户端浏览器发出HTTP请求
2.根据web.xml配置,该请求被FilterDispatcher 接收(即前端核心控制器)
3.根据struts.xml配置,找到需要调用的Action类和方法,并通过IOC方式,将值注入给Action
4.Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证
5..Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应的页面
6.返回HTTP响应到客户端浏览器
优点和缺点:
1.开源方便拓展
2.提供Exception处理机制
3. result方式的页面导航,方便实现重定向和页面跳转
4. 拥有简单的插件,只需放入相应的jar包,
Struts2与Struts1的区别.
最根本的区别是Struts2基于Filter,Struts1基于Servlet, 在Web容器中, Filter的优先级是高于Servlet的
创建步骤:
1. 导包:
其中
StrutsPrepareAndExecuteFilter源码解析
<filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.添加struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DyanmicMethodInvocation" value="false"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default" >
<action name="emp-*" class="employeeAction" method="{1}">
<result name="list" >list.jsp</result>
。。。。。。此处省略多个 result标签。。。。。。。。。。
</action>
</package>
</struts>
3.写对应的Action,Service,Dao类等 .java文件
4.写对应的页面 .jsp 文件