1

シームで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>
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/>valuevalidate()

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のドケットにありますが、これを行う方法は明確でも明確でもありません。

これは、通常のアクションハンドラーの一部としてフォーム送信後に検証することで実現できます。すなわち。

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 に答える