高手支招 Java经验分享(十)
创始人
2024-07-24 20:50:33
0

  这篇是笔者Java学习经验分享的第十篇,这次准备继续上次的话题先讲讲Struts-2。首先简短回顾一段历史:随着时间的推移,Web应用框架经常变化的需求,产生了几个下一代Struts的解决方案。其中的Struts Ti 继续坚持 MVC模式的基础上改进,继续Struts的成功经验WebWork项目是在2002年3月发布的,它对Struts式框架进行了革命性改进,引进了不少新的思想,概念和功能,但和原Struts代码并不兼容。WebWork是一个成熟的框架,经过了好几次重大的改进与发布。在2005年12月,WebWork与Struts Ti决定合拼,再此同时,Struts Ti 改名为 Struts Action Framework 2.0,成为Struts真正的下一代。

  看看Struts-2的处理流程:

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

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

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

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

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

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

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

  1.  
  2.        controller           
  3.        org.apache.struts.action2.dispatcher.FilterDispatcher         
  4.      
  5.          
  6.        cotroller            
  7.        /*        
  8.  

  注意到以往的servlet变成了filter,ActionServlet变成了FilterDispatcher,*.do变成了/*。filter配置定义了名称(供关联)和filter的类。filter mapping让URI匹配成功的的请求调用该filter。默认情况下,扩展名为 ".action "。这个是在default.properties文件里的 "struts.action.extension "属性定义的。

  default.properties是属性定义文件,通过在项目classpath路径中包含一个名为“struts.properties”的文件来设置不同的属性值。而Struts-2的默认配置文件名为struts.xml。由于1和2的action扩展名分别为.do和.action,所以很方便能共存。我们再来看一个Struts-2的action代码:

  1. public class MyAction {  
  2.   public String execute() throws Exception {  
  3.   //do the work  
  4.   return "success ";  
  5.   }  
  6. }  
  7.  
  8.     

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

  1. public interface ServletRequestAware {  
  2.   public void setServletRequest(HttpServletRequest request);  
  3. }  
  4. public class MyAction implements ServletRequestAware {  
  5.   private HttpServletRequest request;  
  6.   public void setServletRequest(HttpServletRequest request) {  
  7.   this.request = request;  
  8.   }  
  9.   public String execute() throws Exception {  
  10.   // do the work directly using the request  
  11.   return Action.SUCCESS;  
  12.   }  

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

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

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

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

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

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

  Anyway,Struts-2只是利用了AOP和IoC技术来减轻action和框架的耦合关系,力图到***程度重用action的目的。在这样的技术促动下,Struts-2的action成了一个简单被框架使用的POJO(Plain Old Java Object)罢了。实事上AOP和IoC的思想已经遍布新出来的每一个框架上,他们并不是多么新的技术,利用的也都是JDK早已可以最到的事情,它们代表的是更加面向接口编程,提高重用,增加扩展性的一种思想。Struts-2只是部分的使用这两种思想来设计完成的,另外一个最近很火的框架Spring,更大程度上代表了这两种设计思想,笔者将于下一篇来进一步探讨Spring的结构。

  附言: 关于Struts-2笔者也没真正怎么用过,这里是看了网上一些前辈的帖子之后写下自己的学习体验,不足之处请见谅!

【编辑推荐】

  1. 新手入门:学习Java的一点经验心得
  2. 61条Java面向对象设计的经验原则
  3. 经验分享:我的JavaEE学习道路
  4. Java对象类型转换的四个经验
  5. 高手支招 Java经验分享(一)

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...