Martin的EIP之概論:使用模式解決集成問題:
ESB是企業服務總線:Enterprise Services Bus,其最早概念來自于 Predicts 2004: Enterprise Service Buses Are Taking Off 。
我們來看一下Bitpipe.com的定義:An enterprise integration architecture that allows incremental integration driven by business requirements, not technology limitations. Also called: Enterprise Service Bus and Enterprise Services Bus。
而 O'reiley的Enterprise Services Bus一書中說:
在 ESB中,應用和事件驅動服務以一種松散耦合的方式緊密地聯系在SOA 中。 這使得它們能夠彼此獨立運行,并且仍然能夠提供廣泛的業務功能價值。
其核心特征是:
1. Web Services
2. 數據變換
3. 智能路由
4. MOM
兩個主要特點:一是分布式集成,二是松散耦合的應用和集成邏輯的分離
Oracle 去年將ADF Faces免費之后,目前又將其捐獻出來,給了Apache的Myfaces項目。前些天看到過一些風聲,現在TSS也公布了這一消息。
這簡直是一條很好的消息,這下JSF世界終于可以有豐富的控件使用了。Myfaces本來就非常優秀,整合了Smile之后,如今再得到ADF Faces的Code base,已經兵強馬壯,個人認為可以勘作企業應用了。
Untitled Document
Struts1.2.4
新特征
主要修改:
不贊成特征
Struts1.1中已經有很多構造不再贊成使用。許多已經被刪除了。所以在升級到1.2.4時,請clean-compile 你的應用,并且使deprecation warnings 被打開。在升級到1.2.4之前強烈建議解決所有decprecated 的用法。最可能應用開發人員的用法是:
- org.apache.struts.Action statics: 如今使用org.apache.struts.Global statics
- Action.perform: 如今使用Action.execute
雖然沒有被刪除也沒有被標明為不贊成使用,最好還是將ActionErrors 替換為ActionMessages 以確保正確的操作。
TagUtils 和ModuleUtils
許多以前在org.apache.struts.utils.RequestUtils中找到的工具方法如今移動到了org.apache.struts.taglibs.TagUtils 或org.apache.struts.utils.ModuleUtils包中。
GenericDataSource / GenericConnection 實現被刪除
datasources manager 仍然支持,但是我們自己的datasource implementationis 并不被支持。很歡迎你插入自己的DataSource 實現,但是我們沒有資源來維護我們自己的實現。如果你的容器不支持DataSource實現,推薦使用Jakarta Commons的 DBCP package。
Validator 增強
- ValidWhen
Struts Validator 如今支持ValidWhen 規則,以便一個驗證可以依賴于另一個驗證。
- IntRange 現在可以檢測select-one 和radio 字段。比如:這使得我們可以使用一些有效的選項加上一個具有諸如"Choose one" 標題并且值為"-1"的附加選項來組裝一個組合框。那么當用戶試圖提交一個表單時,你可以檢測值是否為-1,從而決定是否沒有選擇選項。
- 你現在可以強制進行客戶端Javascript 驗證來檢測所有約束,而不是停留在第一個錯誤之處。方法是設置Validator PlugIn上的一個新的屬性stopOnFirstError為false。
- "required" 驗證現在可以檢測checkboxes, radio,select-one, 和 select-multiple 字段類型。參見修改后的Validator 示例來看如何使用這些新的特征。
- 一個標準的validateUrl 規則可以讓你能夠檢測某一個屬性是否包含一個格式正確的URL。
DigestingPlugIn
一個新的標準PlugIn 可以幫助你在application范圍內創建你自己的對象圖(object graph)。這是創建供Action調用的業務對象的快捷方式。請參見最新的MailReader 示例來看如何使用DigestingPlugin。
ModuleConfigVerifier
雖然不是全新的,一個標準類,用來驗證模塊配置,位于PlugIn 包。ModuleConfigVerifier 主要確認Struts對象圖的各中組件被載入。但是,開發人員可擴展此類來檢查確保Struts 配置文件的內部一致性。
提供了支持Maven的項目文件.
新的配置DTD
推薦使用struts-config_1_2.dtd。新的DTD 添加了兩個新的元素<display-name> 和 <description> 到struts-config 元素中。這些元素可用于struts配置文件工具和文檔產生工具。在Struts 1.2.x 中,已有的Struts 配置文件可以使用兩個版本的DTD 都可載入。
新的Taglib URIs
標簽庫的URI已經被修改已反映Struts從Jakarta 移到了Apache 的頂級項目。為了兼容,使用舊的URI的TLD仍然有效,但是鼓勵使用新的URI。
Struts-Chain
試驗性的,這個新的"contrib" package 使用了Jakarta Sandbox中的Responsibilty package 的Chainin 來創建一個新的RequestProcessor的Breed。未來版本可能會成為默認實現。.
MappingDispatchAction
一個新的標準Action,將控制轉發到ActionMapping 參數命名的一個方法。
Cancel handlers
DispatchAction, LookupDispatchAction, 和 MappingDispatchAction ,如今提供了默認的可以覆寫的cancel handler。也可以指定默認的handler name。
Session-scoped ActionMessages
現在你可以將ActionMessages 保存在session 中and have them cleaned up after the first use。現在除了Action.saveMessages() 將消息保存在session中還有了另外一種選擇。在消息已經被訪問過一次之后ActionMessages.isAccessed() 返回true。RequestProcessor.processCachedMessages() 查詢isAccessed() 已決定是否應該將消息從session中刪除。
JA Mailreader
Struts Mailreader Example 應用現在包含Japanese 資源文件。
Tiles EL
Tiles tags 如今可以通過Struts EL taglib使用EL,后者基于JSTL。
Wildcard Mappings
現在可以在actiponMapping中使用通配符。詳細信息參見Struts Mailreader Example application。
Action attributes
html img tag 添加了Action 屬性,以匹配html link tag。
Module attribute
Forward元素以及多個核心標簽中新增一個"module" 屬性。這個屬性允許你通過名稱(或者前綴)指定另一個模塊來創建模塊間的直接鏈接。新的module 屬性優于contextRelative屬性,并且可以常用于"SwitchAction"中。
Struts 1.2.7
主要修改
依賴性
Struts 對下列組件的依賴性發生了改變:
依賴性 |
新的版本 |
Commons BeanUtils |
Version 1.7.0 |
Commons Digester |
Version 1.6 |
Commons Validator |
Version 1.1.4 |
Commons Collections |
removed |
Commons Lang |
removed |
Core Struts
Saving Messages in the Session
在action也新增了一個方法[saveErrors(HttpSession, ActionMessages)]來將errors 保存在Session 中,并且在其第一次被訪問之后被自動從Session中刪除。這是等同于1.2.4 中message上新增的功能。
Re-directing ActionForward
ActionRedirect 是ActionForward 的一個子類,其設計來用于重定向請求,支持在運行時添加參數。
Download Action
DownloadAction 是一個提供了下載文件的具體細節的抽象Action。
Dispatch Helper
ActionDispatcher 是一個提供DispatchAction 類型的行為但是不必繼承自DispatchAction。
Lazy Validator Form
DynaBean 風格的ActionForm,它不需要其屬性被定義,并提供Lazy List 和Lazy Map 行為。
jars 中的配置文件
配置文件(如. Struts config, Validator config 和 Tiles 配置文件)現在可以被保存在jars。Struts 會像以前一樣檢查servlet context,但是如果沒找到, Struts 會嘗試classloader 去查找。
Tag Library 改變
Highlighting Errors
Struts現在可以使用HTML Input Tags上的 errorKey, errorStyle, errorStyleClass 和 errorStyleId 屬性自動高亮錯誤字段。
Readonly / Disabled Forms
現在可以使用<html:form> tag的readonly 和disabled屬性來禁止或者使全部的字段只讀。
N.B. readonly 屬性只影響<html:text>, <html:textarea> 和 <html:password> as per the HTML 4 specification。
HTML Tag Refactoring
許多HTML標簽都被重構了,以便更易使用。
- 添加了prepareOtherAttributes() 方法- 剛好在關閉元素之前調用,提供一個地方來渲染額外的屬性。
- name 屬性渲染如今在prepareName() 方法中,以便更易提供定制行為。
- value 屬性如今在prepareValue() 方法中以便更易提供定制行為。
- 當渲染一個屬性時,這些標簽現在使用屬性的getter 而不是直接使用實際的屬性,這意味著如果你想,比如覆蓋TextTag的 styleClass ,那么一個選擇是覆蓋getStyleClass()方法。
- 屬性的渲染現在使用一個簡單的 prepareAttribute() 方法來產生name="attribute" 格式,使多數屬性渲染一個一行語句。
Bundle Attribute
bundle 屬性被添加到了下列標簽:ButtonTag, CancelTag, CheckboxTag, FileTag, FrameTag, HiddenTag, LinkTag, MultiboxTag, PasswordTag, RadioTag, ResetTag, SelectTag, SubmitTag, TextTag, TextareaTag。
ErrorTag
現在新增了header, footer, prefix, suffix屬性。
Validator
Resource Bundle Support
Validator 配置文件中(e.g. validation.xml)的<msg> 和 <arg> 元素的bundle 屬性現在隨同<msg> 的resource 屬性一起得到支持。
struts-examples webapp 中添加了新的頁面來展示對Resource Bundle 的支持。
Struts1.2.8
主要改變
Struts 1.2.8 的主要改變是修正了Cross Site Scripting (XSS) 弱點。
最近在編寫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