3

是否可以进行此条件表达式验证?:

(invitation.id==null and (newText==null or newText.isEmpty()))

我已经尝试了几种方法,几次,但没有实现。此版本正在运行,但在服务器端,如果invitation.id 为空或为空,请忽略...任何想法???:

<field name="newText">
   <field-validator type="fieldexpression">
      <param name="expression">!(invitation.id eq null and (newText eq null or newText.empty))</param>
      <message>${getText("validation.required")}</message>
   </field-validator>
</field>

http://struts.apache.org/release/2.2.x/docs/fieldexpression-validator.html

表达有什么问题??谢谢!

4

3 回答 3

2

您的问题是您正在尝试将另一个字段 ( invitation.id) 验证到newText字段验证器中(我认为这不可能,但我不确定)。

但是,您可以将其拆分为两个验证器,从而引发与失败案例相对应的消息,恕我直言,这更正确;

<field name="invitation.id">
    <field-validator type="required">
        <message>${getText("validation.invitation.id.required")}</message>
    </field-validator>
</field>

<field name="newText">
    <field-validator type="fieldexpression">
        <param name="expression">
           <![CDATA[                 
           newText != null && !newText.trim().empty())
           ]]>
        </param>
        <message>${getText("validation.newText.required")}</message>
    </field-validator>
</field>

, 如果你需要修剪它,否则它可能会变得简单

<field name="invitation.id">
    <field-validator type="required">
        <message>${getText("validation.invitation.id.required")}</message>
    </field-validator>
</field>

<field name="newText">
    <field-validator type="requiredString">
        <message>${getText("validation.newText.required")}</message>
    </field-validator>
</field>

请注意,这required适用于每个非文本字段,而requiredString仅适用于文本字段。

表达式验证器非常强大,但它应该用于更复杂的目的:

例如,如果您想针对从您的 Action 动态读取(通过 Getter)的另一个日期来验证日期;假设您之前选择了一个用户,并且您需要根据用户开始和结束有效期间隔验证页面中的日期;但是如果没有插入日期,您也想通过验证,因为它已经由所需的验证器处理(因此您不会引发两条消息):

<field name="inputDate">
    <field-validator type="required">
       <message><![CDATA[ Input Date is mandatory ]]></message>
    </field-validator>
    <field-validator type="fieldexpression">
        <param name="expression"> 
            <![CDATA[ 
              inputDate==null || 
                (inputDate >= chosenUser.startValidity 
                 && 
                 inputDate <= chosenUser.EndValidity
                ) 
            ]]>            
        </param> 
        <message>
            <![CDATA[Input Date must be included in the User Validity interval 
               (from ${chosenUser.startValidity} to ${chosenUser.endValidity} ) 
            ]]>
        </message>
     </field-validator>
</field>

其中chosenUser是来自 Action ( public User getChosenUser()) 的 User 对象,startValidity 和 endValidity 是 User 对象 ( public Date getEndValidity()) 的属性。

如您所见,动态读取也可以在消息中执行……这就是表达式验证器的强大之处;)

于 2013-02-13T10:45:34.850 回答
1

首先表达式 不是一个有效的参数。如果您真的想在客户端进行验证,请尝试使用 java-script 或 jquery 进行验证。但是您还必须在服务器端验证输入,因为有时用户可能会禁用javascript 。所以在这种情况下,您可以使用 struts2 - 验证。

有关详细说明,请参阅http://viralpatel.net/blogs/struts2-validation-framework-tutorial-example/

于 2013-02-13T06:08:59.783 回答
1

好的,最后我使用了模拟struts2的客户端验证宽度jquery。

出于兼容性原因,我不喜欢这个,如果有办法以标准方式做到这一点,我会感谢任何帮助。

删除 struts 验证:

<!--<field name="newText">
      <field-validator type="fieldexpression">
          <param name="expression">!((invitation.id==null or invitation.id.empty) and (newText==null or newText.empty))</param>
          <message>${getText("validation.required")}</message>
      </field-validator>
    </field>-->

添加 js/jquery 代码:

function mySubmit() {
    if ((invitationId==null || invitationId<0) && $("#text").val().trim()=='') {
        var trStrutsFieldError='<tr errorfor="text">'+
                                    '<td colspan="2" align="center" valign="top"><span class="errorMessage">'+strValidationRequired+'</span></td>'+
                                '</tr>';
        $(trStrutsFieldError).insertBefore($("#text").parent().parent());
        return false;
    }
    return true;
}
$(document).ready(function(){
    $("form").submit(function(event) {
        $.each($("form").find("span.errorMessage"), function() {  /* <tr errorfor="title"><td colspan="2" align="center"><span classname="errorMessage" class="errorMessage">Campo requerido */
            return false;
        });
        if ($(mySubmit).exists()) {
            if (!mySubmit()) 
                return false;
        }
        return true;
    });
});
于 2013-02-13T07:42:09.417 回答