技术开发 频道

Tapestry 和 Wicket 的比较

  开发过程

  本节说明在 Tapestry 和 Wicket 中如何完成典型的任务。注意下面的代码片段大多数取自较大的代码源,比如组件和页面。因此,它们可能包含此处没有描述的一些业务方法的调用。

  支持的数据类型

  这两个框架都支持 Java 数据类型。Tapestry 采用对象图导航语言(Object-Graph Navigation Language,OGNL)。它是一种获取和设置 Java 对象属性的表达式语言。Wicket 用它独有的机制进行数据绑定。 有 两 种 方便的实现可以动态检索和更新对象属性:PropertyModel 和 CompoundPropertyModel。

  我们来查看一个应用 float 类型的示例。在 Tapestry 中,按照以下方式指定一个具有 float 值的文本字段:

  清单 1. Tapestry 代码示例

<component id="weight" type="TextField">
        
<binding name="value" value="ognl:weight"/>
        
<binding name="translator" value="translator:number,pattern=#.#"/>
        
<binding name="displayName" value="literal:Weight"/>
    
</component>

  Wicket 中按照以下方式指定这种文本字段:

  清单 2. Wicket 代码示例

FormComponent field = new TextField("weight", Float.class);
field.setLabel(
new Model("Weight"));
add(field);

  因此,可以自然地使用简单的数据类型,比如 string、integer、 float,甚至是 BigDecimal。

  验证

  作为一条经验法则,应该针对业务规则验证所有的用户输入。Tapestry 和 Wicket 都能够对表单输入字段执行服务器端或客户机端(使用 DHTML)的验证。思考一下在服务器端如何完成这个任务。在框架中将按照以下方式通过特定的验证程序进行字段输入验证:

  清单 3. Tapestry 验证程序

<component id="weight" type="TextField">
        ...
        
<binding name="validators" value="validators:min=1,max=500"/>
    
</component>

  清单 4. Wicket 验证程序

...
field.add(NumberValidator.range(
1, 500));

  如果没有符合要求的验证程序,也可以定义一个自定义字段验证程序。如果产生任何验证错误,都应该向用户显示以表明输入无效。

  在 Tapestry 中,我们应当在字段之上定义一个循环,跟踪默认的 ValidationDelegate 表单 bean,从而显示所有的表单错误。

  清单 5. ValidationDelegate 表单 bean

    <property name="currentFieldTracking"/>
    
<component id="errors" type="For">
        
<binding name="source" value="beans.delegate.fieldTracking"/>
        
<binding name="value" value="currentFieldTracking"/>
    
</component>
    
<component id="isInError" type="If">
        
<binding name="condition" value="currentFieldTracking.inError"/>
    
</component>
    
<component id="error" type="Delegator">
        
<binding name="delegate" value="currentFieldTracking.errorRenderer"/>
    
</component>

  相应的 HTML 标记如下所示:

  清单 6. Wicket 验证程序

     <ul jwcid="errors">
        
<li jwcid="isInError">
            
<span jwcid="error">Form validation error </span>
        
</li>
    
</ul>

  在 Wicket 中,FeedbackPanel 实现了显示多种错误的功能:add(new FeedbackPanel("feedback"));。HTML 标记如下: <span wicket:id="feedback" /></div>

  要启用客户端验证,需要将 clientValidationEnabled 参数添加到 Tapestry 的一个表单中,如下所示:

  清单 7. Tapestry 中的客户端验证

<component id="actionForm" type="Form">
        
<binding name="delegate" value="beans.delegate"/>
        
<binding name="clientValidationEnabled" value="true"/>
    
</component>

  基于相同的目的,Wicket 中采用AjaxFormValidatingBehavior 类。

  清单 8. Wicket 中的客户端验证

    AjaxFormValidatingBehavior.addToAllFormComponents(form, "onkeydown");
    
// Add the button to submit the form using AJAX
    form.add(
new AjaxButton("ajax-button", form) {
        protected void onSubmit(AjaxRequestTarget target, Form form) {
            target.addComponent(feedback);
        }
        protected void onError(AjaxRequestTarget target, Form form) {
            target.addComponent(feedback);
        }
    });
0
相关文章