最近在編寫Struts教程的時(shí)候,把Struts1.1到1.2的個(gè)版本變化總結(jié)了一下,希望能夠從整體上把握它的變遷脈絡(luò),在開發(fā)和維護(hù)的時(shí)候也可以參考參考。
Struts1.1的修改
新特征
引入新的配置DTD
Struts 1.0 的配置DTD 已經(jīng)不贊成使用,引入了新的struts-config_1_1.dtd。在Struts 1.1 中,已有的Struts 配置文件可以使用這兩個(gè)版本的DTD載入。
新的Commons 包依賴性
在Struts中使用了多個(gè)Apache Jarkarta commons的組件,而Commons組件并不僅僅可以用來構(gòu)建Struts應(yīng)用。在Struts1.1中,所使用的Commons組件已經(jīng)重構(gòu)來外部依賴于Jarkarta Commons項(xiàng)目,而不是1.0中的內(nèi)部版本。
下面的Commons包包括了對(duì)相應(yīng)的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.*.
下面這幾個(gè)包現(xiàn)在仍然被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 參考實(shí)現(xiàn)和Xerces 1.3.1+。
源代碼
如果需要從源代碼開始構(gòu)建Struts,請(qǐng)使用Ant 1.4 以上版本。
集成Struts Validator
一個(gè)新的Commons Validator組件被集成到Struts 1.1中,包含在新的Validator包中。
Tiles
引入了一個(gè)新的JSP模板組裝機(jī)制Tiles,通過標(biāo)簽庫提供集成。
Nested
Nested taglib 綁定到了Struts1.1中,增強(qiáng)了現(xiàn)有Struts標(biāo)簽的功能。
新的示例應(yīng)用
Struts1.1發(fā)布包中包括了針對(duì)Validator 和Tiles的新的示例。
新的可選組件
CVS源代碼庫中新增了一個(gè)目錄contrib,包含了很有用的,但是沒有集成到標(biāo)準(zhǔn)代碼基中的擴(kuò)展。
- Scaffold – 一個(gè)對(duì)Commons Scaffold 工具包擴(kuò)展,旨在提供可重用的構(gòu)建Web應(yīng)用的類
- Struts-EL – 可選的Struts-EL taglib 使得在Struts 中使用JSTL更加容易。(需要Servlet 2.3 +容器支持)
Action 包的增加
基本的控制器框架 [org.apache.struts.action]新增了一下特征:
- ActionServlet 現(xiàn)在提供了對(duì)模塊化應(yīng)用的支持,并且新增了多個(gè)擴(kuò)展點(diǎn)。
- 新增了一個(gè)ActionMessages 類,支持ActionErrors功能的一個(gè)超集,可以用于通用的消息收集傳遞,不僅僅針對(duì)errors。
Upload 包
文件上傳類[org.apache.struts.upload]新增了一下特征:
- CommonsMultipartRequestHandler:這個(gè)新類使用Jakarta Commons FileUpload 包實(shí)現(xiàn)了文件上傳。這也是Struts的默認(rèn)文件上傳實(shí)現(xiàn)。
Util 包
工具(utility)類 [org.apache.struts.util]新增了以下特征:
- LocalStrings: 修正了與可替換參數(shù)相關(guān)的消息,以便它不會(huì)添加一個(gè)外來的無關(guān)的字符。
- LabelValueBean: 一個(gè)新類,定義了一個(gè)名值對(duì)的集合,可以用在<html:options> 和<html:optionsCollection>標(biāo)簽,或者其它地方。
- MessageResources: 轉(zhuǎn)移包含在特定消息字符串中的單引號(hào)。
- computeParameters: 允許事務(wù)令牌是唯一的參數(shù)。
- RequestUtils: 在構(gòu)建一個(gè)查詢字符串時(shí),修改來編碼一個(gè)&號(hào)。
Bean Taglib
struts-bean 標(biāo)簽庫[org.apache.struts.taglib.bean]中新增了以下特征:
- <bean:write>:加入了format, locale 和 bundle 屬性以支持根據(jù)用戶當(dāng)前場(chǎng)所進(jìn)行格式化的功能,格式化來自屬性或者來自字符串資源的字符串。
- <bean:cookie>, <bean:header>, 或<bean:parameter>:糾正了在標(biāo)簽使用"multiple"屬性時(shí),所產(chǎn)生的腳本變量類型。
- <bean:message>:加入了name, property, 和scope 屬性,以便消息資源key 可以動(dòng)態(tài)地從一個(gè)bean 或者bean 屬性獲得。
HTML Taglib
struts-html [org.apache.struts.taglib.html]加入了如下新特征:
- <html:link>: 添加了'action' 屬性
- <html:options>: 如果'property' 屬性制定的屬性(property)返回null,現(xiàn)在標(biāo)簽將拋出一個(gè)錯(cuò)誤消息指名實(shí)際問題而不是造成NPE。
- <html:option> 和 <html:options>:添加了'style' 和'styleClass' 屬性。
- <html:optionsCollection>:新標(biāo)簽。提供了一個(gè)更清晰的方式來從集合組裝HTML options。
- <bean:message>:添加了'name', 'property' 和'scope' 屬性,以便消息資源key 可以動(dòng)態(tài)地從bean獲得。
- <html:messages>:新標(biāo)簽。可以通過新的ActionMessages 類中的一個(gè)消息集合進(jìn)行迭代。
- ActionForm:現(xiàn)在,此標(biāo)簽在它初始化ActionForm Bean的時(shí)候會(huì)調(diào)用reset() 方法。它也要求被標(biāo)簽所實(shí)例化的bean 是ActionForm 的一個(gè)子類。
- <html:image>:添加了'align' attribute。
- <html:img>:添加了mouse 事件屬性('onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout')。
- SubmitTag, SelectTag, LinkTag.java, CheckboxTag, ButtonTag, ImageTag, RadioTag, 和TextArea 標(biāo)簽: 添加了indexed 屬性。
Logic Taglib
struts-logic 標(biāo)簽庫[org.apache.struts.taglib.logic]加入了如下新特征:
- <logic:empty> 和<logic:notEmpty>:新標(biāo)簽。類似于<logic:present> 和<logic:notPresent>,但對(duì)空字符串的處理不同。
Template Taglib
無變化,但無贊成使用。推薦使用Tiles.
運(yùn)性層面的改變
加入了Config Package
- ControllerConfig:添加了inputForward 屬性以指示ActionMapping.input是一個(gè)forward 而不是URI。
- ControllerConfig:添加了forwardPattern 和inputPattern 到help 應(yīng)用面模塊的管理頁面目錄
- 添加了一個(gè)新的包以提供更多的靈活性來支持控制器配置和多模塊應(yīng)用的支持。
Action 包
基本框架(org.apache.struts.action)進(jìn)行了如下修改或者修正:
- Action 類中的所有常數(shù):不贊成使用。提取到新的Globals類中。
- ActionMapping:如果模塊的ControllerConfig bean [org.apache.struts.config.ControllerConfig]的inputForward 設(shè)置為true,input 屬性將引用一個(gè)ActionForward 而不是模塊相對(duì)的路徑。
- ActionServlet:添加了convertNull 參數(shù)以在組裝Form時(shí)仿真Struts 1.0 行為。如果設(shè)置為true,數(shù)值numeric Java wrapper 類類型 (如java.lang.Integer) 將默認(rèn)為null (而不是0)。
- ActionServlet:添加了"config/$foo" 參數(shù),不贊成使用包中的其他參數(shù)。
- ActionForms 和相關(guān)類:為了保存資源,現(xiàn)在在響應(yīng)toString請(qǐng)求的時(shí)候使用一個(gè)StringBuffer。
- LookupDispatchAction:添加的新的標(biāo)準(zhǔn)Action,以幫助在國際化的按鈕之間進(jìn)行選擇。
- ActionForm 類:修改來使用ActionServletWrapper 而不是暴露ActionServlet。
- ActionServletWrapper 類:添加的新類,用于ActionForm,以防止ActionServlet 的公開字符串屬性被通過查詢字符串改寫。
- Action.MAPPING_KEY的 request 屬性: 如果沒有指定form bean,無條件地將選擇的mapping 傳遞為請(qǐng)求屬性("org.apache.struts.action.mapping.instance")。
- ActionServlet:避免了在初始化Servlet失敗的時(shí)候?qū)е碌腘ullPointerException。
- ActionForm 類:現(xiàn)在是真正的serializable,因?yàn)閮蓚€(gè)非serializable 的實(shí)例變量(servlet 和multipartRequestHandler) 已經(jīng)成為transient。但是,如果你的確需要序列化和解序列化這個(gè)實(shí)例,你要自己負(fù)責(zé)重設(shè)這兩個(gè)屬性。
- ActionMessages 和ActionErrors:The initial order a property/key is added in is now retained.
- processActionForward(): 不贊成,推薦使用processForwardConfig
Upload包
文件上傳 (package org.apache.struts.upload) [ Upload 應(yīng)用的一部分]作了如下修改和修正:
- CommonsMultipartRequestHandler:基于Jakarta Commons FileUpload 包的文件上傳的新實(shí)現(xiàn)。這個(gè)新實(shí)現(xiàn)如今是默認(rèn)實(shí)現(xiàn)。
- BufferedMultipartInputStream:解決了丟失字節(jié)的問題。
- ArrayIndexOutOfBoundsException:解決了已知的錯(cuò)誤。
- Multipart requests:Better reporting for premature closing of input streams while reading multipart requests.
- 新行字符(New line characters):解決了上傳和新?lián)Q行字符時(shí)導(dǎo)致的文件損壞問題。
Utility包
utilities (package org.apache.struts.util)發(fā)生如下修改和修正:
- RequestUtils:添加了對(duì)ControllerConfig 的forwardPattern, pagePattern, 和inputForward 屬性的支持。
- GenericDataSource:不贊成。修改為作為[org.apache.commons.dbpc.BasicDataSource]的一個(gè)薄的Wrapper。建議直接使用BasicDataSource 或其它兼容組件。
- RequestUtils 類:修改為使用ActionServletWrapper而不是暴露 ActionServlet。
- 為getActionErrors 和 getActionMessages 方法添加了錯(cuò)誤消息。
- getActionErrors 和 getActionMessages:添加了根據(jù)基于傳入的消息關(guān)鍵字從Request范圍獲取的對(duì)象來產(chǎn)生正確的相應(yīng)對(duì)象的方法。
- ActionErrors 或 ActionMessages:創(chuàng)建一個(gè)這種對(duì)象的邏輯被移到了RequestUtils中的一個(gè)工具方法。.
- JspException 消息:現(xiàn)在在RequestUtils中生成。
- ConvertUtils.convertCharacter():現(xiàn)在將檢測(cè)空字符串并返回默認(rèn)值。
Bean Taglib包
struts-bean c標(biāo)簽庫 [org.apache.struts.taglib.bean]發(fā)生了如下修改和修正:
- <html:errors>:當(dāng)指定了屬性標(biāo)簽時(shí),如果指定的屬性沒有發(fā)生錯(cuò)誤,則不會(huì)輸出錯(cuò)誤。而前面的錯(cuò)誤將總是會(huì)被輸出。未來的增強(qiáng)版本將包括額外的屬性來關(guān)閉header 或 footer。
- 將helper 方法從"private"改為 "protected" 。
HTML Taglib 包
struts-html 標(biāo)簽庫(package org.apache.struts.taglib.html)發(fā)生了如下修改和修正:
- FormTag:修正為,當(dāng)指定了action mapping的名稱時(shí),要排除查詢字符串。
- ImgTag:如果只有一個(gè)參數(shù),能正確地URLEncode 查詢字符串參數(shù)。
- MultiboxTag.doAfterBody()::修正為返回SKIP_BODY 而不是SKIP_PAGE。
- Errortag:不贊成使用defaultLocale方法。
Documentation 示例應(yīng)用
Struts Documentation 應(yīng)用(對(duì)應(yīng)Struts 網(wǎng)站的內(nèi)容)發(fā)生了如下修改:
- 重新組織了資源到單獨(dú)的頁面中。
- 在Tag Developers Guide中,添加了更詳細(xì)的文件上傳要求。
- 在Building View Components,澄清了額外的i18n 支持可以由瀏覽器提供,并且超出了框架的范圍。
- 在Building Controller Components一節(jié),文檔 'validating' init-param,添加了各種參數(shù)的默認(rèn)值,澄清了某些web.xml 設(shè)置不是Struts特定的。
- Tag library 文檔:移到User's Guide下。
MailReader 示例應(yīng)用
Struts MailReader Example Application 發(fā)生如下修改和修正:
- 添加了應(yīng)用資源的 Russian 和Japanese 翻譯,并且設(shè)置JSP的字符集為"UTF-8"以便其可以顯示English 或Japanese。
- 在Struts配置文件中交換了Edit mappings的"attribute" 屬性的"name" 。
- 刪除了對(duì)"tour"文檔中的保存的數(shù)據(jù)庫數(shù)據(jù)的引用,因?yàn)檫@個(gè)功能已經(jīng)被刪除。
Exercise Taglib 示例應(yīng)用
Struts Exercise Taglib Example Application 發(fā)生了如下修改和修正:
- 添加了針對(duì)使用了"action"屬性的<html:link> 的test case 。
- 添加了針對(duì)基于保存在page上下文中的集合使用<html:options> 和 <html:optionsCollection>的<html:select> 的test case。
不同之處
這里列出1.0到1.1中新增的類和已經(jīng)不贊成使用的類:
1.0中不贊成使用,1.1中已經(jīng)刪除的類。
- 刪除: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 和其相應(yīng)的TLD – 替換為bean, logic, 和html taglib。
- 刪除:"form" taglib 和其相應(yīng)的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