一、Struts2 是什么?
Struts2 刚开始是 Jakarta 项目的子项目,后来转到了 Apache 软件基金会下的一个开源子项目。
Apache Struts 2 是一个基于 MVC 设计模式的、简洁的、可扩展的、成熟的 web 应用程序框架
二、MVC 模式
在 mvc 模式之前,代码和业务都写在 jsp 文件中,非常臃肿,没有分离。早期,Sun 公司推出了两种模式:
适用于小型网站开发,model1 已经做了初步的表达和内容的分离。并不能满足大型的、复杂的项目,如果采用 model1,导致在 jsp 中嵌入大量的代码片段,可读性非常差。
model2 是最典型的 mvc 模式。
MVC 是模型视图控制器(Model、View、Controller),一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC 业务流程:
MVC 的核心思想是业务数据抽取同业务数据呈现相分离。程序分层,分工合作,既互相独立,又协同工作
三、Struts2 的发展历史
- 2001 年 Struts1 发布;
- 2007 年 Struts2 发布;
Struts2 不是一个全新的框架,是在 WebWork 框架的基础上升级的。因此稳定性、性能等各方面都有很好的保证,同时吸收了 Struts1 和 WebWork 两者的优势。
使用 Struts2 的目的是为了从构建、部署、到应用程序维护方面来简化整个开发周期。
Apache Struts 官方网站
Struts 历史版本
四、Struts 的工作原理
- 用户通过 HttpServletRequest 用户请求发送过来;
- 经过一系列的核心的过滤器;
- 到达 FilterDispatcher(最新的是 StrutsPrepareAndExecuteFilter);
- ActionMapper 查找
五、Struts 的优缺点
优点
- POJO表单及POJO操作
- 标签支持
- AJAX支持
- 易于整合
- 模板支持
- 插件支持
- 性能分析
- 易于修改标签
- 促进减少配置
- 视图技术
缺点:
- 更大的学习曲线
- 文档缺乏
- 不够透明
六、Struts 与 SpringMVC 的区别
框架机制
SpringMVC 和 struts2 的加载机制不同:SpringMVC 的入口是 servlet,而 struts2 是 filter。
- Struts2 采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。
- Filter 在容器启动之后即初始化,服务停止以后销毁,(晚于 Servlet)。Servlet 是在调用时初始化(先于Filter 调用),服务停止后销毁。
拦截机制
- Struts2
- Struts2 框架是类级别的拦截,每次请求就会创建一个 Action,和 Spring 整合时 Struts2 的 ActionBean 注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter 把 request 数据注入到属性。
- Struts2 中,一个 Action 对应一个 request,response 上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。
- Struts2 中 Action 的一个方法可以对应一个 url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
- SpringMVC
- SpringMVC 是方法级别的拦截,一个方法对应一个 Request 上下文,所以方法直接基本上是独立的,独享 request,response 数据。而每个方法同时又何一个 url 对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过 ModelMap 返回给框架。
- 在 Spring 整合时,SpringMVC 的 Controller Bean 默认单例模式 Singleton,所以默认对所有的请求,只会创建一个 Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加 @Scope 注解修改。
- Struts2
性能方面
SpringMVC 实现了零配置,由于 SpringMVC 基于方法的拦截,有加载一次单例模式 bean 注入。而 Struts2 是类级别的拦截,每次请求对应实例一个新的 Action,需要加载所有的属性值注入,所以,SpringMVC 开发效率和性能高于 Struts2。
拦截机制
Struts2 有自己的拦截 Interceptor 机制,SpringMVC这是用的是独立的 AOP 方式,这样导致 Struts2 的配置文件量还是比 SpringMVC 大。
配置方面
SpringMVC 和 Spring 是无缝的。从这个项目的管理和安全上也比 Struts2 高(当然 Struts2 也可以通过不同的目录结构和相关配置做到 SpringMVC 一样的效果,但是需要 xml 配置的地方不少)。
SpringMVC 可以认为已经 100% 零配置。
设计思想
Struts2 更加符合 OOP 的编程思想, SpringMVC 就比较谨慎,在 servlet 上扩展。
集成方面
SpringMVC 集成了 Ajax,使用非常方便,只需一个注解 @ResponseBody 就可以实现,然后直接返回响应文本即可,而 Struts2 拦截器集成了 Ajax,在 Action 中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。