最近在编写Struts教程的时候,把Struts1.1到1.2的个版本变化总结了一下,希望能够从整体上把握它的变迁脉络,在开发和维护的时候也可以参考参考。
Struts1.1的修改
新特征
引入新的配置DTD
Struts 1.0 的配置DTD 已经不赞成使用,引入了新的struts-config_1_1.dtd。在Struts 1.1 中,已有的Struts 配置文件可以使用这两个版本的DTD载入。
新的Commons 包依赖性
在Struts中使用了多个Apache Jarkarta commons的组件,而Commons组件并不仅仅可以用来构建Struts应用。在Struts1.1中,所使用的Commons组件已经重构来外部依赖于Jarkarta Commons项目,而不是1.0中的内部版本。
下面的Commons包包括了对相应的Struts 1.0 中的类的替代:
- BeanUtils [org.apache.commons.beanutils]:
- org.apache.struts.utils.BeanUtils
- org.apache.struts.utils.ConvertUtils
- org.apache.struts.utils.PropertyUtils.
- Collections [org.apache.commons.collections]
- org.apache.struts.util.ArrayStack
- org.apache.struts.util.FastArrayList
- org.apache.struts.util.FastHashMap
- org.apache.struts.util.FastTreeMap.
- Digester [org.apache.commons.digester]
- org.apache.struts.digester.*.
下面这几个包现在仍然被Struts框架的各种组件使用:
- FileUpload [org.apache.commons.fileupload]
- Logging [org.apache.commons.logging]
- Validator [org.apache.commons.validator]
XML解析器
另外,Struts 1.1 需要符合JAXP/1.1 (而不是JAXP/1.0) API的XML解析器,比如JAXP/1.1 参考实现和Xerces 1.3.1+。
源代码
如果需要从源代码开始构建Struts,请使用Ant 1.4 以上版本。
集成Struts Validator
一个新的Commons Validator组件被集成到Struts 1.1中,包含在新的Validator包中。
Tiles
引入了一个新的JSP模板组装机制Tiles,通过标签库提供集成。
Nested
Nested taglib 绑定到了Struts1.1中,增强了现有Struts标签的功能。
新的示例应用
Struts1.1发布包中包括了针对Validator 和Tiles的新的示例。
新的可选组件
CVS源代码库中新增了一个目录contrib,包含了很有用的,但是没有集成到标准代码基中的扩展。
- Scaffold – 一个对Commons Scaffold 工具包扩展,旨在提供可重用的构建Web应用的类
- Struts-EL – 可选的Struts-EL taglib 使得在Struts 中使用JSTL更加容易。(需要Servlet 2.3 +容器支持)
Action 包的增加
基本的控制器框架 [org.apache.struts.action]新增了一下特征:
- ActionServlet 现在提供了对模块化应用的支持,并且新增了多个扩展点。
- 新增了一个ActionMessages 类,支持ActionErrors功能的一个超集,可以用于通用的消息收集传递,不仅仅针对errors。
Upload 包
文件上传类[org.apache.struts.upload]新增了一下特征:
- CommonsMultipartRequestHandler:这个新类使用Jakarta Commons FileUpload 包实现了文件上传。这也是Struts的默认文件上传实现。
Util 包
工具(utility)类 [org.apache.struts.util]新增了以下特征:
- LocalStrings: 修正了与可替换参数相关的消息,以便它不会添加一个外来的无关的字符。
- LabelValueBean: 一个新类,定义了一个名值对的集合,可以用在<html:options> 和<html:optionsCollection>标签,或者其它地方。
- MessageResources: 转移包含在特定消息字符串中的单引号。
- computeParameters: 允许事务令牌是唯一的参数。
- RequestUtils: 在构建一个查询字符串时,修改来编码一个&号。
Bean Taglib
struts-bean 标签库[org.apache.struts.taglib.bean]中新增了以下特征:
- <bean:write>:加入了format, locale 和 bundle 属性以支持根据用户当前场所进行格式化的功能,格式化来自属性或者来自字符串资源的字符串。
- <bean:cookie>, <bean:header>, 或<bean:parameter>:纠正了在标签使用"multiple"属性时,所产生的脚本变量类型。
- <bean:message>:加入了name, property, 和scope 属性,以便消息资源key 可以动态地从一个bean 或者bean 属性获得。
HTML Taglib
struts-html [org.apache.struts.taglib.html]加入了如下新特征:
- <html:link>: 添加了'action' 属性
- <html:options>: 如果'property' 属性制定的属性(property)返回null,现在标签将抛出一个错误消息指名实际问题而不是造成NPE。
- <html:option> 和 <html:options>:添加了'style' 和'styleClass' 属性。
- <html:optionsCollection>:新标签。提供了一个更清晰的方式来从集合组装HTML options。
- <bean:message>:添加了'name', 'property' 和'scope' 属性,以便消息资源key 可以动态地从bean获得。
- <html:messages>:新标签。可以通过新的ActionMessages 类中的一个消息集合进行迭代。
- ActionForm:现在,此标签在它初始化ActionForm Bean的时候会调用reset() 方法。它也要求被标签所实例化的bean 是ActionForm 的一个子类。
- <html:image>:添加了'align' attribute。
- <html:img>:添加了mouse 事件属性('onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout')。
- SubmitTag, SelectTag, LinkTag.java, CheckboxTag, ButtonTag, ImageTag, RadioTag, 和TextArea 标签: 添加了indexed 属性。
Logic Taglib
struts-logic 标签库[org.apache.struts.taglib.logic]加入了如下新特征:
- <logic:empty> 和<logic:notEmpty>:新标签。类似于<logic:present> 和<logic:notPresent>,但对空字符串的处理不同。
Template Taglib
无变化,但无赞成使用。推荐使用Tiles.
运性层面的改变
加入了Config Package
- ControllerConfig:添加了inputForward 属性以指示ActionMapping.input是一个forward 而不是URI。
- ControllerConfig:添加了forwardPattern 和inputPattern 到help 应用面模块的管理页面目录
- 添加了一个新的包以提供更多的灵活性来支持控制器配置和多模块应用的支持。
Action 包
基本框架(org.apache.struts.action)进行了如下修改或者修正:
- Action 类中的所有常数:不赞成使用。提取到新的Globals类中。
- ActionMapping:如果模块的ControllerConfig bean [org.apache.struts.config.ControllerConfig]的inputForward 设置为true,input 属性将引用一个ActionForward 而不是模块相对的路径。
- ActionServlet:添加了convertNull 参数以在组装Form时仿真Struts 1.0 行为。如果设置为true,数值numeric Java wrapper 类类型 (如java.lang.Integer) 将默认为null (而不是0)。
- ActionServlet:添加了"config/$foo" 参数,不赞成使用包中的其他参数。
- ActionForms 和相关类:为了保存资源,现在在响应toString请求的时候使用一个StringBuffer。
- LookupDispatchAction:添加的新的标准Action,以帮助在国际化的按钮之间进行选择。
- ActionForm 类:修改来使用ActionServletWrapper 而不是暴露ActionServlet。
- ActionServletWrapper 类:添加的新类,用于ActionForm,以防止ActionServlet 的公开字符串属性被通过查询字符串改写。
- Action.MAPPING_KEY的 request 属性: 如果没有指定form bean,无条件地将选择的mapping 传递为请求属性("org.apache.struts.action.mapping.instance")。
- ActionServlet:避免了在初始化Servlet失败的时候导致的NullPointerException。
- ActionForm 类:现在是真正的serializable,因为两个非serializable 的实例变量(servlet 和multipartRequestHandler) 已经成为transient。但是,如果你的确需要序列化和解序列化这个实例,你要自己负责重设这两个属性。
- ActionMessages 和ActionErrors:The initial order a property/key is added in is now retained.
- processActionForward(): 不赞成,推荐使用processForwardConfig
Upload包
文件上传 (package org.apache.struts.upload) [ Upload 应用的一部分]作了如下修改和修正:
- CommonsMultipartRequestHandler:基于Jakarta Commons FileUpload 包的文件上传的新实现。这个新实现如今是默认实现。
- BufferedMultipartInputStream:解决了丢失字节的问题。
- ArrayIndexOutOfBoundsException:解决了已知的错误。
- Multipart requests:Better reporting for premature closing of input streams while reading multipart requests.
- 新行字符(New line characters):解决了上传和新换行字符时导致的文件损坏问题。
Utility包
utilities (package org.apache.struts.util)发生如下修改和修正:
- RequestUtils:添加了对ControllerConfig 的forwardPattern, pagePattern, 和inputForward 属性的支持。
- GenericDataSource:不赞成。修改为作为[org.apache.commons.dbpc.BasicDataSource]的一个薄的Wrapper。建议直接使用BasicDataSource 或其它兼容组件。
- RequestUtils 类:修改为使用ActionServletWrapper而不是暴露 ActionServlet。
- 为getActionErrors 和 getActionMessages 方法添加了错误消息。
- getActionErrors 和 getActionMessages:添加了根据基于传入的消息关键字从Request范围获取的对象来产生正确的相应对象的方法。
- ActionErrors 或 ActionMessages:创建一个这种对象的逻辑被移到了RequestUtils中的一个工具方法。.
- JspException 消息:现在在RequestUtils中生成。
- ConvertUtils.convertCharacter():现在将检测空字符串并返回默认值。
Bean Taglib包
struts-bean c标签库 [org.apache.struts.taglib.bean]发生了如下修改和修正:
- <html:errors>:当指定了属性标签时,如果指定的属性没有发生错误,则不会输出错误。而前面的错误将总是会被输出。未来的增强版本将包括额外的属性来关闭header 或 footer。
- 将helper 方法从"private"改为 "protected" 。
HTML Taglib 包
struts-html 标签库(package org.apache.struts.taglib.html)发生了如下修改和修正:
- FormTag:修正为,当指定了action mapping的名称时,要排除查询字符串。
- ImgTag:如果只有一个参数,能正确地URLEncode 查询字符串参数。
- MultiboxTag.doAfterBody()::修正为返回SKIP_BODY 而不是SKIP_PAGE。
- Errortag:不赞成使用defaultLocale方法。
Documentation 示例应用
Struts Documentation 应用(对应Struts 网站的内容)发生了如下修改:
- 重新组织了资源到单独的页面中。
- 在Tag Developers Guide中,添加了更详细的文件上传要求。
- 在Building View Components,澄清了额外的i18n 支持可以由浏览器提供,并且超出了框架的范围。
- 在Building Controller Components一节,文档 'validating' init-param,添加了各种参数的默认值,澄清了某些web.xml 设置不是Struts特定的。
- Tag library 文档:移到User's Guide下。
MailReader 示例应用
Struts MailReader Example Application 发生如下修改和修正:
- 添加了应用资源的 Russian 和Japanese 翻译,并且设置JSP的字符集为"UTF-8"以便其可以显示English 或Japanese。
- 在Struts配置文件中交换了Edit mappings的"attribute" 属性的"name" 。
- 删除了对"tour"文档中的保存的数据库数据的引用,因为这个功能已经被删除。
Exercise Taglib 示例应用
Struts Exercise Taglib Example Application 发生了如下修改和修正:
- 添加了针对使用了"action"属性的<html:link> 的test case 。
- 添加了针对基于保存在page上下文中的集合使用<html:options> 和 <html:optionsCollection>的<html:select> 的test case。
不同之处
这里列出1.0到1.1中新增的类和已经不赞成使用的类:
1.0中不赞成使用,1.1中已经删除的类。
- 删除:org.apache.struts.utils.BeanUtils, org.apache.struts.utils.ConvertUtils, and org.apache.struts.utils.PropertyUtils – 替换为org.apache.commons.beanutils
- 删除:org.apache.struts.util.ArrayStack, org.apache.struts.util.FastArrayList, org.apache.struts.util.FastHashMap, org.apache.struts.util.FastTreeMap – 替换为org.apache.commons.collections
- 删除: org.apache.struts.digester.* - 替换为org.apache.commons.digester
- 删除:struts-config.dtd – 替换为struts-config_1_1.dtd.
- 删除:omnibus "struts" taglib 和其相应的TLD – 替换为bean, logic, 和html taglib。
- 删除:"form" taglib 和其相应的TLD – 替换为html taglib.
Struts 1.1新增的包
- config
- taglib.nested
- taglib.nested.bean
- taglib.nested.html
- taglib.nested.logic
- validator
Struts 1.1新增的类
action
- ActionMessage
- ActionMessages
- DynaActionForm
- DynaActionFormClass
- ExceptionHandler
- RequestProcessor
actions
- LookupDispatchAction
taglib.html
- FrameTag
- JavascriptValidatorTag
- MessagesTag
- OptionsCollectionTag
taglib.logic
- EmptTag
- MessagesNotPresentTag
- MessagesPresentTag
- NotEmptyTag
upload
- CommonsMultipartRequestHandler
util
- LabelValueBean
Struts 1.1中新增的类成员
action.Action
- ACTION_SERVLET_KEY
- APPLICATION_KEY
- MESSAGE_KEY
- PLUG_INS_KEY
- REQUEST_PROCESSOR_KEY
- execute
- getResources(javax.servlet.http.HttpServletRequest)
- saveMessages
action.ActionServlet
- configDigester
- convertHack
- log
- processor
- getInternal
- destroyApplications
- destroyConfigDigester
- getApplicationConfig
- getRequestProcessor
- initApplicationConfig
- initApplicationDataSources
- initApplicationPlugIns
- initApplicationMessageResources
- initConfigDigester
- methods created for backward-compatiblity only
- defaultControllerConfig
- defaultFormBeansConfig
- defaultForwardsConfig
- defaultMappingsConfig
- defaultMessageResourcesConfig
taglib.html.BaseHandlerTag
- indexed
- setIndexed
- getIndexed
Struts 1.0 到Struts 1.1不赞成的类
action
- ActionException
- ActionFormBeans
- ActionForwards
- ActionMappings
Struts 1.0 不赞成的类成员
action.Action
- FORM_BEANS_KEY
- FORWARDS_KEY
- MAPPINGS_KEY
- getResources()
- perform
ActionServlet
- findDataSource
- findFormBean
- findForward
- findMapping
- initDataSources
- methods created for backward-compatiblity only
- defaultControllerConfig
- defaultFormBeansConfig
- defaultForwardsConfig
- defaultMappingsConfig
- defaultMessageResourcesConfig