シームで2つのユーザー入力フィールドを相互に検証する必要があります。Field1は、ui:repeatタグの各行でField2より大きくなければなりません。今のところ、2つのフィールドをs:decorateタグでラップしており、すべての入力をs:validateAllタグでラップしています。これにより、フィールドのいずれかで検証が失敗した場合に、フィールドの右側にエラーメッセージを表示できます。
たとえば(画像を挿入できないため、アスキー画像を使用する必要があります。低品質をご容赦ください。斜体は赤いテキストを示します):
ラベル: | 黄色| 0 |%赤:| 0%| | 黄色と赤は0〜100の間である必要があり、黄色は赤より大きくなければなりません。
ラベル: | 黄色| 0 |%赤:| 0%| | 黄色と赤は0〜100の間である必要があり、黄色は赤より大きくなければなりません。
2つのコントロールとdecoratexhtmlを以下に示します。注:「0〜100の値」の検証は、休止状態のアノテーションによってすでに処理されています。黄色が赤よりも大きいことを確認するために、これら2つのフィールドを相互に検証する方法を知っているだけで、エラーメッセージが表示されます。
私の望ましい解決策は、対応する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>