1.3.1 Struts2的优势
相对于Struts 1仅支持JSP表现层技术的缺陷而言,Struts 2支持更多的表现层技术,如Velocity、FreeMarker和XSLT等。
由于Struts 2是由WebWork发展而来的,因此它具备了WebWork与生俱来的优势。
1.3.1.1 Action无须与Servlet API耦合,更易测试
相对于Struts 1框架中的Action出现了大量Servlet API而言,Struts 2的Action更像一个普通的Java对象,该控制器代码中没有耦合任何Servlet API。看下面的Struts 2的Action示例。
public class LoginAction implements Action { // 该Action封装的两个请求参数 private String password; private String username; // 省略password的setter、getter方法 ... // 省略username请求参数对应的getter方法 ... // 处理用户请求的execute方法 public String execute() throws Exception { if ("crazyit".equalsIgnoreCase(getUsername()) && "leegang".equals(getPassword())) { ActionContext ctx = ActionContext.getContext(); // 将当前登录的用户名保存到Session Map session = ctx.getSession(); session.put("username",getUsername()); return SUCCESS; } else { return ERROR; } } }
在上面的Action代码中,我们看不到任何的Servlet API,当系统需要处理两个请求参数:username和password时,Action并未通过HttpServletRequest对象来获得请求参数,而是直接调用访问该Action的username和password成员属性——这两个属性由Action拦截器负责初始化,以用户请求参数为其赋值。
即使 Action 中需要访问 HTTP Session 对象,也依然没有在代码中直接出现 HttpSession API,而是以一个Map对象代表了HTTP Session对象。
将Struts 2的Action和Struts 1的Action进行对比,不难发现Struts 1的Action确实太臃肿了,确实不如Struts 2的Action那么优雅。
如果需要测试上面的Action代码,测试用例的书写将非常容易,因为execute方法中没有包含任何Servlet API,甚至没有Struts 2的API。
1.3.1.2 Action无须与WebWork耦合,代码重用率高
在上面的Action代码中,不难发现Struts 2中的Action其实就是一个POJO(普通、传统的Java对象),该Action仅仅实现了Action接口,包含了一个execute方法。
Struts 1中的Action类需要继承Struts 1的Action类。我们知道,实现一个接口和继承一个类是完全不同的概念:实现一个接口对类的污染要小得多,该类也可以实现其他任意接口,还可以继承一个父类;但一旦已经继承一个父类,则意味着该类不能再继承其他父类。
除此之外,Struts 1中的Action也包含了一个execute方法,但该方法需要4个参数,类型分别是ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,一个包含了这4个参数的方法,除了在Struts 1框架下有用外,笔者难以想象出该代码还有其他的复用价值。但Struts 2的execute方法则完全不同,该方法中没有出现任何Servlet API,也没有出现任何Struts 2 API,这个方法在任何环境下都有重用的价值。
得益于Struts 2灵巧的设计,Struts 2中的Action无须与任何Servlet API、Struts 2 API耦合,从而具有更好的代码重用率。
1.3.1.3 支持更多的表现层技术,有更好的适应性
Struts 2对JSP、Velocity和FreeMarker等多种表现层技术都提供了很好的支持。不仅如此,开发者还可以实现自定义的Result Type,这样可以让Struts 2支持任意的表现层技术。
1.3.1.4 更好的模块化支持
无论是Action管理、Action的输入校验,还是国际化资源文件的管理,Struts 2都提供了更好的模块化支持,因此更适合大项目的团队协作开发。
1.3.1.5 更好的可扩展性
Struts 2框架的核心由大量拦截器实现,这些拦截器都是可“插拔式”的,因此开发者可以随时替换、升级其中的一个或多个拦截器,这样即可扩展Struts 2框架本身的功能。更令人欣喜的是,Struts 2还提供了插件机制,开发者可以在不对Struts 2框架进行任何修改的前提下,通过开发插件来扩展Strust 2的功能。