struts2的原理及作用

来源:互联网 发布:sql删除行 编辑:程序博客网 时间:2024/05/30 05:00
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)的请求

<formaction="${pageContext.request.contextPath}/login"method="post">
 username:<inputtype="text"name="username"><br>
 password:<inputtype="password"name="password"><br>
<inputtype="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配置中读取。

<actionname="login"class="com.itheima.web.action.LoginAction"method="login">
     <resultname="success">/success.jsp</result>
     <resultname="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

publicclass MyInterceptor implements Interceptor {
     @Override
     publicString intercept(ActionInvocationinvocation)throws Exception {
          
         //获取登录时存进session 中的user
          Useruser = (User)ServletActionContext.getRequest().getSession().getAttribute("user");
          if(user!=null){
              
            //如果登录则放行
              returninvocation.invoke();
          }else{
             //重新登录
              ProductAction action = (ProductAction) invocation.getAction();
              action.addActionError("登录失败");
              return"login";
          }
     }






并且在struts.xml中进行配置


//拦截器
<interceptors>
     <!--  拦截showProduct 方法 -->
     <interceptorname="myInterceptor"class="com.itheima.utils.MyInterceptor">
     <paramname="includeMethods">showProduct</param>
     </interceptor>
     
     <interceptor-stackname="myStack">
          <interceptor-refname="myInterceptor"></interceptor-ref>
          <interceptor-refname="defaultStack"></interceptor-ref>
     </interceptor-stack>
     
     </interceptors>

//登录的action 中引入拦截器
<resultname="login">/login.jsp</result>
     <interceptor-refname="myStack"></interceptor-ref>
     </action>


    8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
原创粉丝点击