藏拙首页 | 贴吧 | 藏拙导航 | 藏拙IP搜索
 
查看文章
 



Java杂谈(九2)--Struts2

2008-07-11 00:29
request;
}

public String execute() throws Exception {
// do the work directly using the request
return Action.SUCCESS;
}
}

那么谁来调用这个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的结构。

类别:默认分类 | 浏览(60) | 评论 (0)
 
 
网友评论:
发表评论:
姓 名:
网 址:
内 容:




     

©2008 CangZhuo