如何使接缝中的字段无效?

时间:2009-06-29 21:49:18

标签: jsf seam

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

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

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

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

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

我想要的解决方案是为相应的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>

2 个答案:

答案 0 :(得分: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()参数进行比较。< / p>

如果黄色小于红色,您可以使用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);

答案 1 :(得分:0)

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

或者那种效果。 :)