Struts2原码分析系列之一
struts2概述
在struts2的官网上有这么一句话,翻译为:Apache Struts2是一个为企业级应用打造的优秀的、可扩展的WEB框架,该框架旨在充分精简应用程序的开发周期,从而减少创建、发布直到应用所花费的时间。
Apache Struts2原本就是举世闻名的Webwork2,在各自经历几年的发展之后,Struts和Webwork社区决定合二为一,也就是今天的Struts2.
Struts是一个基于Model2的MVC框架,为应用程序的WEB层提供了良好的结构严谨实现,Struts发展较早,早期的Struts1为很过将ee程序员所熟悉,经过多年的发展,这支队伍越来越大,很多企业级应用都是基于Struts开发的。
所以,struts1和struts2已经不能放在一起比较,虽然都是MVC框架的经典实现,本质却完全不同,Struts2的前身是webwork,其实现方式和功能优于struts1.x,但是struts先入为主,很多程序都是基于struts,其生命力和普及度使得Webwork落于下风,随着新思想和新架构的不断涌入,特别是WEB2.0被大量普及,使得struts1.x显然无法跟上日新月异的变化,在很多应用上显得力不从心,最终导致struts2的产生。
Struts2的2.0特征
Action类:
1、Struts1要求Action类继承一个抽象基类,Struts1的一个普遍问题就是使用抽象基类而不是结构
2、Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能,Struts2提供一个ActionSupport基类去实现常用接口,Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式
1、Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的实例来处理所有的请求,单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心,Action资源必须是线程安全的或同步的。
2、Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖:
1、struts1 Action依赖于Servlet API,因为当一个Action被调用时HttpServletRequest,HttpServletResponse被传递给execute方法
2、struts2 Action不依赖于容器,允许Action脱离容器单独被测试,如果需要,Struts2Action任然可以访问初始的request和response,但是,减少了其他元素直接访问HttpservletRequest,HttpServletResponse的必要性
可测性:
1、测试Struts1 Action的一个主要问题是execute方法暴露了Servlet ApI(这使得测试要依赖于容器)。
2、Struts2 Action可以通过初始化,设置属性,调用方法来测试,依赖注入支持也使得测试更容易。
捕获输入:
1、Struts1 使用ActionForm对象捕获输入,所有的ActionForm都必须继承一个基类ActionForm,因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入,虽然动态的Bean可以作为创建传统的ActionForm的选择,但是开发者可能是在重新描述已经存在的javabean(会造成多余的javabean)。
2、Struts2 直接使用Action的属性作为输入属性,消除对第二个输入对象的需求,输入属性可能是有自己或者子属性的rich对象类型,Action属性能通过web页面上的taglibs访问,Struts2页支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入输出对象,这种modelDriven
特性简化了taglib对POJO输入对象的引用。
表达式语言:
Strut1整合了JSTL,因此使用JSTL EL,这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
struts2使用“valueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来,valuestack策略允许通过一系列名称相同但类型不同的属性重用页面。
类型转换
1、Struts1 ActionForm属性通常都是String类型的,Struts1 通过Commons-Beanutils进行类型转换,每个类一个转换器,对每一个实例来说是不可配置的。
2、Struts2 使用OGNL进行类型转换,提供基本和常用对象的转换器。
校验
1、Struts1 支持在ActionForm的validate方法中手动校验,或者通过CommonsValidate的扩张校验,同一个类可以有不同的校验内容,但不能校验子对象
2、Struts2 支持通过拦截器堆栈(interceptor Stacks)为每一个Action创建不同的生命周期,堆栈能后根据需要和不同的Action一起使用。
部署Struts2工程步骤:
1、讲Struts2所带的过滤器org.apache.struts2.dispatcher.FilterDispatcher配置到工程下web.xml中,默认情况下,改过滤器拦截请求字符串中以.action结尾的请求,并将该请求委托给指定的action进行处理,最直观的表现就是调用Action的execute方法。
Struts2原码分析系列之一的更多相关文章
- Struts2 源码分析——拦截器的机制
本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...
- Struts2 源码分析——调结者(Dispatcher)之执行action
章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...
- Spring AOP 源码分析系列文章导读
1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...
- Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理
Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那么这一篇继续 ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- jQuery-1.9.1源码分析系列完毕目录整理
jQuery 1.9.1源码分析已经完毕.目录如下 jQuery-1.9.1源码分析系列(一)整体架构 jQuery-1.9.1源码分析系列(一)整体架构续 jQuery-1.9.1源码分析系列(二) ...
- MyCat源码分析系列之——结果合并
更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ...
- MyCat源码分析系列之——SQL下发
更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
随机推荐
- Unieap3.5-前台js用SQL语句执行数据请求
执行UPDATE var sql=" update T_SS_SETTLEMENT_RECORD "+ " set CINVOICE_INFO_FLAG='Y',&quo ...
- js控制ul的显示隐藏,对象的有效范围
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- sql server 分组后字段拼接
- [视频]MAC OS 技巧之如何更新及重装MAC系统
mac os是当今最好用的桌面操作系统,但再好的系统也有新版本发布的一天,或者被极客的你尝试各种设置而配置混乱了,这时我们就要进行系统更新或者重装了. 系统更新 Mac OS有新版本推出时,会自动在A ...
- boost:进程管理
概述 Boost.Process提供了一个灵活的C++ 进程管理框架.它允许C++ developer可以像Java和.Net程序developer那样管理进程.它还提供了管理当前执行进程上下文.创建 ...
- RocketMQ学习记录
RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 1.能够保证严格的消息顺序 2.提供丰富的消息拉取模式 3.高效的订阅者水平扩展能力 4.实时的消息订阅机制 5.亿级消息堆积能力 ...
- android 客户端支付宝 php服务器端编写
生成私钥 输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原 ...
- 重拾C,一天一点点_8
这两天发现一个问题,我最近发的几篇博文稀里糊涂地被转到别的网站去了,目前发现有两个网站转载了,一个注明了作者出处(博客园 lltong),但没给任何链接.另一个网站呢,就是直接抓的,而且还抓的乱七八糟 ...
- svn的使用!!!
1.SVN:subversion(子级源代码版本控制管理软件) 2.SVN的作用 (1)避免开发同一项目不会出现代码覆盖. (2)同一文件可以创建许多不同的版本,并可以随时查看不同版本的内容. (3) ...
- ajax 注意点
1. 为了把数据发送到服务器,应该使用POST 方法,为了从服务器检索数据,应该使用GET 方法. 2.ajax 完整参数, url 发送的地址 http://localhost/default.a ...