Struts2 作为当今主流框架之一,有其自己的优点,它的优点如下:
Struts2的优点:
<1>实现了MVC模式,层次结构清晰,使程序员只关注业务逻辑的实现。
<2>丰富的标签库,大大提高了开发的效率。
<3>Struts2提供了丰富的拦截器实现。
<4>通过配置文件,就可以掌握整个系统各个部分之间的关系。
<5>异常处理机制,只要在配置文件中配置异常的映射,即可对异常做出相应的处理。
<6>Struts2 的可扩展性高。Struts2 中的核心jar包是由一个叫struts-default.xml文件,该文件中配置了一些默认的bean,resultType类型,默认拦截器栈等,所有这些默认设置,用户都可以利用配置文件更改,可以更改为自己开发的bean,resultType等。因此,如果用户开发插件的话,只要很简单的配置,就可以和 struts2 融合,这实现了框架对插件的可插拔的特性。
<7> 面向切面的编程思想在Struts2中得到很好的体现。最重要的体现就是拦截器的使用,拦截器就是一个一个的小功能单位,用户可以将这些拦截器合并成一个大的拦截器,这个合成的拦截器就像单独的拦截器一样,只要将它配置到一个Action中就可以。
一个东西有它的优点,自然也就有缺点,Struts2的缺点如下:
缺点:
<1> 在Action中从jsp传过来的参数比较麻烦。
<2> 校验比较繁琐、凌乱,也太细化。如果有多个字段,每个字段出错时返回到不同的画面,这个功能在Strut2框架下借助框架提供的校验逻辑就不容易实现
<3> 安全性有待提高。Struts2曝出2个高危安全漏洞,一个是使用缩写的导航参数前缀时的远程代码执行漏洞,另一个是使用缩写的重定向参数前缀时的开放式重定向漏洞。这些漏洞可使黑客取得网站服务器的“最高权限”,从而使企业服务器变成黑客手中的“肉鸡”。
下面就来了解一下它的工作原理。
下图为 Struts2的官方文档附带了Struts2的架构图
流程
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2、这个请求经过一系列的过滤器(Filter)。
3、接着 FilterDispatcher(已过时,现在用StrutsPrepareAndExecuteFilter) 被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action。
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionPorxy。
5、ActionProxy 通过ConfigurationManager 询问框架的配置文件,找到需要调用的Action类,这里一般是从struts.xml文件中读取。
6、ActionProxy 创建一个 ActionInvocation 实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的前后过程中,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation 负责根据struts.xml配置文件中找到对应的返回结果(可能是一个需要被表示的jsp、FreeMark的模板、另一个Action链)。
Struts1和Struts2 比较:
Struts2 比Struts1简单了很多,功能也强大了很多,他们的区别如下:
从体系结构来看:struts2大量使用拦截器来出来请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性;而struts1.x在action中明显的侵入了servlet-api.
从线程安全分析:struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。
性能方面:struts2.x测试可以脱离web容器,而struts1.x依赖servlet-api,测试需要依赖web容器。
请求参数封装对比:struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。
标签的优势:标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。
当然,struts2和struts1相比,在 文件上传,数据校验 等方面也 方便了好多。在这就不详谈了。