struts2的目的是什么
MVC模式应用于web程序设计
给我们带来什么样的好处?
(1)
实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现。
(2) 丰富的标签库,大大提高了开发的效率.
(3) Struts2提供丰富的拦截器实现。
(4) 通过配置文件,就可以掌握整个系统各个部分之间的关系。
(5)
异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。
(6) Struts2的可扩展性高。Struts2的核心jar包中由一个struts-default.xml文件,在该文件中设置了一些默认的bean,resultType类型,默认拦截器栈等,所有这些默认设置,用户都可以利用配置文件更改,可以更改为自己开发的bean,resulttype等。因此用户开发了插件的话只要很简单的配置就可以很容易的和Struts2框架融合,这实现了框架对插件的可插拔的特性。
(7)
面向切面编程的思想在Strut2中也有了很好的体现。最重要的体现就是拦截器的使用,拦截器就是一个一个的小功能单位,用户可以将这些拦截器合并成一个大的拦截器,这个合成的拦截器就像单独的拦截器一样,只要将它配置到一个、Action中就可以。
struts的工作原理
一个请求在Struts2框架中的处理大概分为以下几个步骤
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
<form
action="${pageContext.request.contextPath}/login"
method="post">
username:<input
type="text"
name="username"><br>
password:<input
type="password"
name="password"><br>
<input
type="submit"
value="提交">
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请是否需要调用某个Action
StrutsPrepareAndExecuteFilter是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:StrutsPrepareAndExecuteFilter进行初始化并启用核心doFilter
<filter>
<filter-name>struts2Filter</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
<action
name="login"
class="com.itheima.web.action.LoginAction"
method="login">
<result
name="success">/success.jsp</result>
<result
name="failer">/login.jsp</result>
</action>
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
下面我们来看看ActionInvocation是如何工作的:
ActionInvocation是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。
Interceptor的调度流程大致如下:
1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。
这里,我们简单的介绍一下Interceptor
public
class
MyInterceptor
implements
Interceptor {
@Override
public
String intercept(ActionInvocation
invocation)
throws
Exception {
//获取登录时存进session 中的user
User
user = (User)
ServletActionContext.getRequest().getSession().getAttribute("user");
if(user!=null){
//如果登录则放行
return
invocation.invoke();
}else{
//重新登录
ProductAction action = (ProductAction) invocation.getAction();
action.addActionError("登录失败");
return
"login";
}
}
并且在struts.xml中进行配置
//拦截器
<interceptors
>
<!-- 拦截showProduct 方法 -->
<interceptor
name="myInterceptor"
class="com.itheima.utils.MyInterceptor">
<param
name="includeMethods">showProduct</param>
</interceptor>
<interceptor-stack
name="myStack">
<interceptor-ref
name="myInterceptor"></interceptor-ref>
<interceptor-ref
name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
//登录的action 中引入拦截器
<result
name="login">/login.jsp</result>
<interceptor-ref
name="myStack"></interceptor-ref>
</action>
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2
框架中继承的标签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。