1

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

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

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

标签: | 黄色 | 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>
4

2 回答 2

1

我会将您自己的自定义 JSF 验证器附加到红色<h:inputText/>

<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 对象。这是<h:inputText/>您将验证器绑定到的。从这里您可以调用getParent()以获取<h:inputText/>父级 ( <h:panelGrid/>)。您现在可以枚举<h:panelGrid/>子对象以查找黄色<h:inputText/>,检索传递给它的值并与value传递给validate()方法的参数进行比较。

如果黄色小于红色,您可以在您的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);
于 2009-06-30T05:12:34.997 回答
0

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

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

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";
}

或者类似的东西。:)

于 2009-06-29T22:01:12.060 回答