<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    選擇java 進入自由開放的國度

    隨筆 - 49, 文章 - 3, 評論 - 154, 引用 - 1
    數據加載中……

    Sturts vs WebWork

    來自官方http://www.opensymphony.com/webwork/wikidocs/Comparison%20to%20Struts.html網站對Struts和WebWork的比較。

    Feature

    Struts

    WebWork 1.x

    WebWork 2.x

    Action classes

    Struts requires Action classes to extend an Abstract base class. This shows a common problem in Struts of programming to abstract classes instead of interfaces.

    Action classes must implement the webwork.Action Interface. There are other Interfaces which can be implemented for other services, such as storing error messages, getting localized texts, etc. The ActionSupport class implements many of these Interfaces and can act as a base class. WebWork is all written to Interfaces, which allows for plugging in your own implementations.

    An Action must implement the com.opensymphony.xwork.Action Interface, with a series of other Interfaces for other services, like in WebWork 1.x. WebWork2 has its own ActionSupport to implement these Interfaces.

    Threading Model

    Struts Actions must be thread-safe because there will only be one instance to handle all requests. This places restrictions on what can be done with Struts Actions as any resources held must be thread-safe or access to them must be synchronized.

    WebWork Actions are instantiated for each request, so there are no thread-safety issues. In practice, Servlet containers generate many throw-away objects per request, and one more Object does not prove to be a problem for performance or garbage collection.

    ditto

    Servlet Dependency

    Struts Actions have dependencies on Servlets because they get the ServletRequest and ServletResponse (not HttpServletRequest and HttpServletResponse, I've been told) when they are executed. This tie to Servlets (although not Http*) is a defacto tie to a Servlet container, which is an unneeded dependency. Servlets may be used outside a Web context, but it's not a good fit for JMS, for instance.

    WebWork Actions are not tied to the web or any container. WebWork actions CAN choose to access the request and response from the ActionContext, but it is not required and should be done only when ABSOLUTELY neccessary to avoid tieing code to the Web.

    ditto

    Testability

    Many strategies have sprung up around testing Struts applications, but the major hurdle is the fact that Struts Actions are so tightly tied to the web (receiving a Request and Response object). This often leads people to test Struts Actions inside a container, which is both slow and NOT UNIT TESTING. There is a Junit extension : Struts TestCase (http://strutstestcase.sourceforge.net/)

    WebWork actions can be tested by instantiating your action, setting the properties, and executing them

    ditto, but the emphasis on Inversion of Control makes testing even simpler, as you can just set a Mock implementation of your services into your Action for testing, instead of having to set up service registries or static singletons

    FormBeans

    Struts requires the use of FormBeans for every form, necessitating either a lot of extra classes or the use of DynaBeans, which are really just a workaround for the limitation of requiring FormBeans

    WebWork 1.x allows you to have all of your properties directly accessible on your Action as regular Javabeans properties, including rich Object types which can have their own properties which can be accessed from the web page. WebWork also allows the FormBean pattern, as discussed in "WW1:Populate Form Bean and access its value"

    WebWork 2 allows the same features as WebWork 1, but adds ModelDriven Actions, which allow you to have a rich Object type or domain object as your form bean, with its properties directly accessible to the web page, rather than accessing them as sub-properties of a property of the Action.

    Expression Language

    Struts 1.1 integrates with JSTL, so it uses the JSTL EL. This EL has basic object graph traversal, but relatively weak collection and indexed property support.

    WebWork 1.x has its own Expression language which is built for accessing the ValueStack. Collection and indexed property support are basic but good. WebWork can also be made to work directly with JSTL using the Filter described in WW1:Using JSTL seamlessly with WebWork

    WebWork 2 uses XW:Ognl which is a VERY powerful expression language, with additions for accessing the value stack. Ognl supports very powerful collection and indexed property support. Ognl also supports powerful features like projections (calling the same method on each member of a collection and building a new collection of the results), selections (filtering a collection with a selector expression to return a subset), list construction, and lambda expressions (simple functions which can be reused). Ognl also allows access to static methods, static fields, and constructors of classes. WebWork2 may also use JSTL as mentioned in WW1:Using JSTL seamlessly with WebWork

    Binding values into views

    Struts uses the standard JSP mechanism for binding objects into the page context for access, which tightly couples your view to the form beans being rendered

    WebWork sets up a ValueStack which the WebWork taglibs access to dynamically find values very flexibly without tightly coupling your view to the types it is rendering. This allows you to reuse views across a range of types which have the same properties.

    ditto

    Type Conversion

    Struts FormBeans properties are usually all Strings. Struts uses Commons-Beanutils for type conversion. Converters are per-class, and not configurable per instance. Getting a meaningful type conversion error out and displaying it to the user can be difficult.

    WebWork 1.x uses PropertyEditors for type conversion. PropertyEditors are per type and not settable per Action, but field error messages are added to the field error map in the Action to be automatically displayed to the user with the field.

    WebWork2 uses Ognl for type conversion with added converters provided for all basic types. Type converters default to these converters, but type conversion can be specified per field per class. Type conversion errors also have a default error message but can be set per field per class using the localization mechanism in WW2 and will be set into the field error messages of the Action.

    Modular Before & After Processing

    Class hierarchies of base Actions must be built up to do processing before and after delegating to the Action classes, which can lead deep class hierarchies and limitations due to the inability to have multiple inheritance WW:Comparison to Struts#1

    Class hierarchies

    WebWork 2 allows you to modularize before and after processing in Interceptors. Interceptors can be applied dynamically via the configuration without any coupling between the Action classes and the Interceptors.

    Validation

    Struts calls validate() on the FormBean. Struts users often use Commons Validation for validation. I don't know a lot about this, so I'll put some questions here:
     
    Because FormBean properties are usually Strings, some types of validations must either be duplicated (checking type conversion) or cannot be done?
     
    Can Commons Validation have different validation contexts for the same class? (I've been told yes, so that's a good thing)
     
    Can Commons Validation chain to validations on sub-objects, using the validations defined for that object properties class?

    WebWork1.x calls the validate() method on Actions, which can either do programmatic validations or call an outside validation framework (this is apparently the same as Struts)

    WebWork2 can use the validate() method of WebWork and Struts and / or use the XW:Validation Framework, which is activated using an XWork Interceptor. The Xwork Validation Framework allows you to define validations in an XML format with default validations for a class and custom validations added for different validation contexts. The Xwork Validation Framework is enabled via an Interceptor and is therefore completely decoupled from your Action class. The Xwork Validation Framework also allows you to chain the validation process down into sub-properties using the VisitorFieldValidator which will use the validations defined for the properties class type and the validation context.

    Control Of Action Execution

    As far as I know Struts sets up the Action object for you, and you have very little control over the order of operations. To change them I think you need to write your own Servlet to handle dispatching as you want

    The ActionFactory chain controls the order in which an Action is constructed and initialised, but this requires writing a class

    The interceptor stacks in WebWork 2 are hugely powerful in this regard. All aspects of Action setup have been moved into Interceptor implementations (ie setting paramters from the web, validation etc), so you can control on a per action basis the order in which they are performed. For example you might want your IOC framework to setup the action before the parameters are set from the request or vice versa - you can thusly control this on a per package or per action basis with interceptor stacks.

    posted on 2005-05-27 14:38 soochow_hhb 以java論成敗 以架構論英雄 閱讀(737) 評論(0)  編輯  收藏 所屬分類: Struts

    主站蜘蛛池模板: 亚洲av永久中文无码精品综合| 国产成人无码区免费内射一片色欲| 亚洲国产人成在线观看69网站| 亚洲视频在线精品| 亚洲精品国产高清在线观看| **俄罗斯毛片免费| 久久亚洲AV成人无码软件| 日本免费中文视频| 亚洲av无码一区二区三区不卡| 久久久久亚洲av无码尤物| 无码人妻一区二区三区免费视频| 亚洲国产成人精品无码区二本| 亚洲中文字幕久久久一区| 少妇太爽了在线观看免费视频| 亚洲另类激情综合偷自拍| 亚洲国产精品久久人人爱| 中国xxxxx高清免费看视频| 亚洲欧洲日产国码在线观看| 国产99视频精品免费专区| 亚洲精品欧洲精品| 亚洲avav天堂av在线网毛片| 日韩高清在线高清免费| 精品国产亚洲一区二区三区| 黄色网站软件app在线观看免费| 91大神免费观看| 四只虎免费永久观看| 美女无遮挡拍拍拍免费视频| 1000部国产成人免费视频| 亚洲乱妇熟女爽到高潮的片| 精品成人免费自拍视频| 亚洲不卡中文字幕| 久久久久国产亚洲AV麻豆| 国产婷婷综合丁香亚洲欧洲| 免费人成无码大片在线观看| 日韩精品无码免费专区午夜不卡| 免费观看a级毛片| 中国一级特黄的片子免费| 国产亚洲精品影视在线| 亚洲精品亚洲人成人网| 国产美女在线精品免费观看| 国产日韩一区二区三免费高清|