0

JSF2.0を使用しています。

h:selectOneMenu値のリストを含むページがあり、同じページに1つあります。h:inputTextこれrequiredは、現在選択されているの値によって異なりますh:selectOneMenu。特定の値のセットのみがrequiredチェックをトリガーする必要があり、他のセットはトリガーしない必要があります。

これは私が試したことです:

<h:inputText ... required="#{(selectedPaymentType.value == 'some value') || (selectedPaymentType.value == 'other value')}" />

上記のコード#{selectedPaymentType}では、で定義されていh:selectOneMenu bindingます。

このような値がさらに3つあり、required属性をにトリガーする必要がありますtrue。これはちょっと不器用に見えます。そうするためのより良い方法はありますか?

4

3 に答える 3

2

ファントは、プロパティを持つ列挙型を使用する必要があるという正しい方向へのヒントを与えましたが、requiredそれを適切に実装する方法が完全にはわからないようです。確かに、ファントの答えは十分に精巧ではありません。そこで、より詳細な回答を示します。

基本的に、すべてのドロップダウン値を次のような列挙型に置き換える必要があります。

public enum PaymentType {
    FOO("Some label for foo", true),
    BAR("Some label for bar", false),
    BAZ("Some label for baz", true);

    private String label;
    private boolean required;

    private PaymentType(String label, boolean required) {
        this.label = label; 
        this.required = required;
    }

    public String getLabel() { 
        return label;
    }

    public boolean isRequired() {
        return required;
    }
}

そして、次のように使用します

<h:selectOneMenu binding="#{selectedPaymentType}" value="#{bean.selectedPaymentType}">
    <f:selectItems value="#{bean.availablePaymentTypes}" var="paymentType"
        itemValue="#{paymentType}" itemLabel="#{paymentType.label}" />
</h:selectOneMenu>
<h:inputText ... required="#{selectedPaymentType.value.required}" />

private PaymentType selectedPaymentType; // +getter+setter

public PaymentType[] getAvailablePaymentTypes() { 
    return PaymentType.values();
}

(または、OmniFaces を使用している場合は、を使用します。その場合<o:importConstants>、そのようなゲッターは必要ありません<f:selectItems>。いいえ、コンバーターは必要ありません。JSF/EL には既に列挙型の変換が組み込まれています)

属性は、required選択した値に関連付けられたモデルで既に定義されているため、非常に単純化されています。

于 2012-11-22T11:55:33.773 に答える
2

設計内で可能であれば、次のようなインターフェイスを含む列挙型を PaymentType として使用できます。

public interface RequireSomeMoreStuff {
   public boolean required();
}

public enum PaymentType implements RequireSomeMoreStuff {
   FOO { boolean required() { return true; } },
   BAR { boolean required() { return false; } }
}
于 2012-11-21T19:09:56.110 に答える
-2

I would use a4j in order to render the inputText only if certain values of your selectOneMenu are selected:

<h:selectOneMenu value="#{MyBean.selectedValue}">
    <f:selectItems value="#{MyBean.listOfValues}" />
    <a4j:support event="onchange" reRender="requiredText" ajaxSingle="true"/>
</h:selectOneMenu>

<a4j:outputPanel id="requiredText">
    <h:inputText value="#{MyBean.inputValue}" rendered="#{(MyBean.selectedValue == value_1) || (MyBean.selectedValue == value_2) || ...}" />
</a4j:outputPanel>

In order to avoid a large string on inputText's rendered parameter, I suggest you to create a boolean function which performs these conditions: rendered="#{MyBean.inputTextIsRendered}.

CLIENT-SIDE SOLUTION

There's also a solution based on Validators. Here's my approach:

  • JSF Code

The selectOneMenu code above uses the binding tag to bind the value selected in the selectOneMenu with an attribute that will be retrieved in the validator method, declared for the inputText component.

  • Validator class

Then, you need to create the CheckInputValue validator class.

public class CheckInputValue implements Validator {
    public CheckInputValue() {}

    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

        //We retrieve thei binded value:
        UIInput confirmComponent = (UIInput) component.getAttributes().get("selectedValue");
        String theValue = confirmComponent.getSubmittedValue();

        //Here you check the retrieved value with the list of values that makes your inputText required.
        //In these cases you will chech the inputText is not empty and, if so, you return a ValidatorException:
        if(isEmpty){
            FacesMessage message = new FacesMessage();
            message.setDetail("inputText cannot be empty");
            message.setSummary("inputText cannot be empty");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }
}
  • faces-config.xml

Finally, you have to declare your validator class in faces-config.xml:

<validator>
    <validator-id>CheckInputValue</validator-id>
    <validator-class>myPackage.myValidations.CheckInputValue</validator-class>
</validator>
于 2012-11-22T08:40:18.843 に答える