Struts2杂谈

看看Struts-2的处理流程:  

1)   Browser产生一个请求并提交框架来处理:根据配置决定使用哪些拦截器、action类和结果等。  

2)   请求经过一系列拦截器:根据请求的级别不同拦截器做不同的处理。这和Struts-1RequestProcessor类很相似。  

3)   调用Action:       产生一个新的action实例,调用业务逻辑方法。  

4)   调用产生结果:匹配result       class并调用产生实例。  

5)   请求再次经过一系列拦截器返回:过程也可配置减少拦截器数量  

6)   求返回用:从control返回servlet,生成Html  

 

里很明的一点是不存在FormBean的作用域封装,直接可以从Action中取得数据。       里有一个Strut-2配置的web.xml文件:  

<filter>      

   <filter-name>   controller   </filter-name>      

   <filter-class> org.apache.struts.action2.dispatcher.FilterDispatcher   </filter-class>  

</filter>  

<filter-mapping>      

   <filter-name>   cotroller   </filter-name>      

   <url-pattern>   /*   </url-pattern>  

</filter-mapping>  

注意到以往的servlet成了filterActionServlet成了FilterDispatcher*.do成了/*filter 配置定了名称(关联)filterFilter mappingURI匹配成功的的filter。默情况下,展名".action"个是在default.properties文件里的"struts.action.extension"属性定的。default.properties是属性定文件,通classpath路径中包含一个名struts.properties”的文件来置不同的属性。而Struts-2的默配置文件名struts.xml。由于12action展名分别为.do.action,所以很方便能共存。我再来看一个Struts-2action  

        public   class   MyAction   {  

              public   String   execute()   throws   Exception   {      

                      //do   the   work      

                      return   "success   ";  

              }  

        }  

很明显的区别是不用再继承任何类和接口,返回的只是一个String,无参数。实际上在Struts-2中任何返回String的无参数方法都可以通过配置来调用action。所有的参数从哪里来获得呢?答案就是Inversion of Control技术(控制反转)。笔者尽量以最通俗的方式来解释,我们先试图让这个Action获得reuqest对象,这样可以提取页面提交的任何参数。那么我们把request设为一个成员变量,然后需要一个对它的set方法。由于大部分的action都需要这么做,我们把这个set方法作为接口来实现。  

        public   interface   ServletRequestAware   {  

                public   void   setServletRequest(HttpServletRequest   request);  

        }  

 

        public   class   MyAction   implements   ServletRequestAware   {      

                private   HttpServletRequest   request;      

 

                public   void   setServletRequest(HttpServletRequest   request)  {      

                        this.request   =   request;      

                }  

                               

                public   String   execute()   throws   Exception       {  

                          return       Action.SUCCESS;      

                }      

        }  

么谁set方法呢?也就是说谁来控制action的行,以往我都是自己在适当的地方写上一句 action.setServletRequest(…),也就是控制在程序员这边然而控制反转的思想是在哪里调用交给正在运行的容器来决定,只要利用Java反射机制来获得Method对象然后调用它的invoke方法传入参数就能做到,这样控制权就从程序员这边转移到了容器那边。程序员可以减轻很多繁琐的工作更多的关注业务逻辑。Request可以这样注入到action中,其他任何对象也都可以。为了保证action的成员变量线程安全, Struts-2action不是单例的,每一个新的请求都会产生一个新的action实例。  

那么有人会问,到底谁来做这个对象的注入工作呢?答案就是拦截器。拦截器又是什么东西?笔者再来尽量通俗的解释拦截器的概念。大家要理解拦截器的话,首先一定要理解GOF23种设计模式中的Proxy模式。  

A对象要调用f(),它希望代理给B来做,那么B就要获得A对象的引用,然后在Bf()中通过A对象引用调用A对象的f()方法,最终达到Af()被调用的目的。有没有人会觉得这样很麻烦,为什么明明只要A.f()就可以完成的一定要封装到Bf()方法中去?有哪些好处呢?  

1)   这里我们只有一个A,当我们有很多个A的时候,只需要监视B一个对象的f()方法就可以从全局上控制所有被调用的f()方法。  

2)   另外,既然代理人B能获得A对象的引用,那么B可以决定在真正调A对象的f()方法之前可以做哪些前置工作,调完返回前可有做哪些后置工作。  

讲到这里,大家看出来一点拦截器的概念了么?它拦截下一调f()方法的请求,然后统一的做处理(处理每个的方式还可以不同,解析A对象就可以辨别),处理完毕再放行。这样像不像对流动的河水横切了一刀,对所有想通过的水分子进行搜身,然后再放行?这也就是AOPAspect  of  Programming面向切面编程)的思想。  

AnywayStruts-2只是利用了AOPIoC技术来减轻action和框架的耦合关系,力图到最大程度重用action的目的。这样的技下,Struts-2action成了一个简单被框架使用的POJOPlain Old Java Object了。事上AOPIoC的思想已遍布新出来的个框架上,他并不是多新的技,利用的也都是JDK早已可以最到的事情,它代表的是更加面向接口程,提高重用,增加展性的一思想。Struts-2只是部分的使用这两种思想来设计完成的,另外一个最近很火的框架 Spring,更大程度上代表了这两种设计思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值