0

値が互いに依存している2つのコンポーネント(selectとinputText)があります。たとえば、「オプション 1」が選択されている場合、inputText は数値でなければなりません。

私のBeanでは、バインディング用の2つのコンポーネントと検証メソッドの属性を追加しましたが、jspでは、selectに「validator」および「binding」属性を追加し、inputTextに「binding」を追加しました。

バインディングを使用して、検証のために両方のコンポーネントの送信された値を取得しました。

これは正しい方法ですか?提出された値を取得する代替手段はありますか?

これを行うと、メッセージが重複して表示されます。選択からバインディング属性を削除すると、期待どおりに機能しますが、選択した値を取得できず、キャッシュ値(セッションのBean値)が使用されます。

前もって感謝します。

アルメロ

コード:

<p:selectOneMenu
value="#  {deploymentRequestViewBean.deploymentRequestDTO.deploymentRequest.requestLevel}"
id="requestLevel" required="true" label="requestLevel" 
validator="#{deploymentRequestViewBean.validateRequestDate}">
<p:ajax listener="#{deploymentRequestViewBean.processRequestLevelValueChanged}" 
binding="#{deploymentRequestViewBean.requestLevelSelectOne}"/>
<f:selectItem itemValue="" itemLabel="Select One" />
<f:selectItem itemValue="DEV" itemLabel="DEV" />
<f:selectItem itemValue="QUA" itemLabel="QUA" />
<f:selectItem itemValue="PRD" itemLabel="PRD" />
</p:selectOneMenu>

 <p:calendar
 value="#{deploymentRequestViewBean.deploymentRequestDTO.deploymentRequest.deployDate}"
 id="deployDate" required="true" label="deployDate" showOn="button" pattern="yyyy-  MM-dd" binding="#{deploymentRequestViewBean.requestDateInput}"/>
<p:spacer width="10" height="10" /> 

//for component-binding
private UISelectOne requestLevelSelectOne;
private UIInput requestDateInput;


//validation method
public void validateRequestDate(FacesContext facesContext,
    UIComponent component, Object newValue){

//get the current value of select;
requestLevelSelectOne.getSubmittedValue();
//get the current vallue of input;
requestDateInput.getSubmittedValue()

if(not valid combination){
           facesContext.addMessage(requestDateInput.getClientId(facesContext), new  FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", selectedLevel + " deployment request requires at least 2 days."));
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Deployment date must be at least 2 days."));
}
}
4

1 に答える 1

0

非表示のコンポーネント値をselectコンポーネントにバインドすることにより、ハックバイパスを使用できます。の「onchange」メソッドでは<h:selectOneMenu>、この非表示のコンポーネントの値を設定し、サーバーで値を取得できます。

<h:form id="myForm">
    <h:selectOneMenu id="cmbOptions"
        onchange="document.getElementById('myForm:hidSelectOption').value=this.value">
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </h:selectOneMenu>
    <h:inputHidden id="hidSelectOption" value="#{bean.selectedOption}" />
    <h:commandButton value="Click me" action="#{bean.someAction}" />
</h:form>

マネージドBean

@RequestScope
@ManagedBean
public class Bean {
    private String selectedOption;
    //getters and setters...
    public Bean() {
    }

    public void someAction() {
        //showing the actual value of the hidden component...
        //remember that you should use a logger, this is a basic example
        System.out.println(selectedOption);
    }
}
于 2012-07-26T20:43:28.060 に答える