【问题标题】:How to invalidate a field in seam?如何使接缝中的字段无效?
【发布时间】:2009-06-29 21:49:17
【问题描述】:

我需要在 seam 中验证两个用户输入字段。对于 ui:repeat 标记中的每一行,Field1 必须大于 Field2。截至目前,我将两个字段包装在一个 s:decorate 标记中,该标记将所有输入包装在一个 s:validateAll 标记中。如果其中任何一个验证失败,这允许我将错误消息浮动到字段的右侧。

例如(我不能插入图片,所以我必须使用ascii图片,低质量请见谅,斜体表示红色文字):

标签: |黄色 | 0|% 红色:| 0%| | 黄色和红色必须介于 0 和 100 之间,并且黄色必须大于红色。

标签: |黄色 | 0|% 红色:| 0%| | Yellow 和 Red 必须介于 0 和 100 之间,Yellow 必须大于 Red。

下面是两个控件和装饰xhtml。注意:“0 到 100 之间的值”验证已经通过 hibernate 注释处理。我只需要知道如何相互验证这两个字段以确保黄色大于红色,并且仍然显示错误消息。

我想要的解决方案是为相应的 s:decorate 标记设置 #{invalid} 属性,这样会显示错误消息,但我会接受任何想法。

输入:

<table>
    <ui:repeat value="#{action.List}" var="var">
        <s:decorate template="/layout/decorateMultipleInputs.xhtml" >
            <ui:define name="label">
                Label:
            </ui:define>
            <ui:define name="input">
                <h:panelGrid columns="8" frame="border">
                    <h:outputText value="Yellow:" />
                    <h:inputText value="#{var.yellow}" style="width:25px; text-align:right" maxlength="3"/>
                    %

                    <h:outputText value="Red:" />
                    <h:inputText value="#{var.red}" style="width:25px; text-align:right" maxlength="3"/>
                    %
                </h:panelGrid>
            </ui:define>
            <ui:define name="message">Yellow and Red must be between 0 and 100, and Yellow must be greater than Red.
            </ui:define>
        </s:decorate>
    </ui:repeat>
</table>

还有 decorateMultipleInputs.xhtml:

<ui:composition  xmlns="http://www.w3.org/1999/xhtml"
             xmlns:ui="http://java.sun.com/jsf/facelets"
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:s="http://jboss.com/products/seam/taglib">
<tr>
<td>        
    <s:label styleClass="#{invalid?'error':''}">
        <ui:insert name="label"/>
        <s:span styleClass="required" rendered="#{required}">*</s:span>
    </s:label>
</td>
<td>
    <s:validateAll>
        <ui:insert name="input"/>
    </s:validateAll>
</td>
<td>
    <s:div styleClass="error" rendered="#{invalid}">
        <h:graphicImage value="/images/error.gif" />
    </s:div>    
</td>
<td>
    <s:div styleClass="error" rendered="#{invalid}">
        <ui:insert name="message"/>
    </s:div>    
</td>
</tr>
</ui:composition>

【问题讨论】:

    标签: jsf seam


    【解决方案1】:

    我会将您自己的自定义 JSF 验证器附加到红色的 &lt;h:inputText/&gt;

    <h:inputText value="#{var.red}" style="width:25px; text-align:right" maxlength="3">
      <f:validator validatorId="rowValidator"/>
    </inputText>
    

    实现一个 JSF 验证器(因为您使用的是 Seam,所以可以使用 @Validator 注释)。

    @Validator
    public class RowValidator implements javax.faces.validator.Validator
    {
        public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException 
        {
            <snip/>  
        }
    }
    

    这里的关键是传递给validate() 方法的UIComponent 对象。这是您将验证器绑定到的&lt;h:inputText/&gt;。从这里您可以致电getParent() 以获取&lt;h:inputText/&gt; 父级(&lt;h:panelGrid/&gt;)。您现在可以枚举&lt;h:panelGrid/&gt; 子对象以找到黄色的&lt;h:inputText/&gt;,检索传递给它的值并与传递给validate() 方法的value 参数进行比较。

    如果黄色小于红色,您可以在 validate() 方法中执行以下操作:

    FacesMessage message = new FacesMessage();
    message.setDetail("Yellow must be greater than red");
    message.setSummary("Yellow must be greater than red");
    message.setSeverity(FacesMessage.SEVERITY_ERROR);
    throw new ValidatorException(message);
    

    【讨论】:

    • 好主意,我试试,谢谢!
    • 这很好用!感觉就像是通过父级来访问兄弟级控件,但它的工作原理足够简单,很有用。再次感谢!
    • 请注意标记和验证器之间的紧密耦合。如果标记发生变化,它可能会破坏验证器。 :)
    【解决方案2】:

    Seam 目前没有办法进行多字段验证。这目前在 JSR-299 WebBeans 的案卷上,但没有一个干净或明确的方法来做到这一点。

    您可以通过在表单提交后作为您常用操作处理程序的一部分进行验证来实现此目的。即。

    public String processRedsAndYellows() {
       for(RedYellow var : ActionBean.getList()) {
          if(var.getYellow() <= var.getRed()) {
             messages.addMessage("All Yellows must be greater than Reds");
             return null;
          }
       }
       return "success";
    }
    

    或者类似的东西。 :)

    【讨论】:

    • 感谢您的快速回复,我担心我不得不走那条路。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多