簡體   English   中英

Java中的JSF頁面驗證和生成的組件ID問題

[英]JSF page validation in Java and generated component IDs issue

我根據<h:message for="" /> JSF對象有一個問題。 我有一個JSF 1.1(是的,很不幸)myFaces項目。 我准備了一個帶有標簽,inputText和消息持有人的簡單JSP文件:

<h:form id="sacLinkForm">
    <cblFaces:outputLabel for="dedicatedCashAccountNumber"
        value="#{appBundle.KUSTA_DEDICATED_CASH_ACCOUNT_NUMBER}"/>
    <t:inputText id="dedicatedCashAccountNumber"
        value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"/>
    <h:message id="dedicatedCashAccountNumberError"
        for="dedicatedCashAccountNumber" />
</h:form>

我還創建了簡單的驗證方法:

public static boolean validate(SACLink link) {
    boolean isError = false;
    FacesContext context = FacesContext.getCurrentInstance();
    FacesMessage message = new FacesMessage();
    message.setSeverity(FacesMessage.SEVERITY_ERROR);

    if (StringUtils.isEmpty(link.dedicatedCashAccountNumber)) {
        //MessageUtils.addErrorMessage("dedicatedCashAccountNumber", "Dedicated Cash Account Number is mandatory");
        message.setSummary("Field mandatory");
        message.setDetail("Dedicated Cash Account Number is mandatory");
        context.addMessage("sacLinkForm:dedicatedCashAccountNumber", message);
        isError = true;
    }
    return !isError;
}

我的問題是sacLinkForm:dedicatedCashAccountNumber因為已編譯的JSP生成了id(fe _idJsp12:DynTab2:DynView2:tabK.....er:vKustaMa....Controller:sacLinkForm:dedicatedCashAccountNumber ),並且可能導致addMessage方法沒有對應於h:message for=".."屬性。

由於Java無法找到正確的h:message對象,因此消息無法正確顯示。 有什么方法可以通過Java將消息設置為正確的h:message嗎? 我假設沒有辦法在JSF 1.1頁面中強制使用“常量”組件ID。

謝謝。

完全不應該使用JSF操作方法手動執行驗證。 您應該利用JSF內置的驗證工具。 您應該使用普通的JSF Validator 從中拋出的任何ValidatorException都會最終出現在正確的消息組件中。

用以下類替換validate()方法:

public class AccountNumberValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (StringUtils.isEmpty(value)) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Field mandatory");
            message.setDetail("Dedicated Cash Account Number is mandatory");
            throw new ValidatorException(message);
        }
    }

}

如下將其注冊在faces-config.xml中:

<validator>
     <validator-id>accountNumberValidator</validator-id>
     <validator-class>com.example.AccountNumberValidator</validator-class>
</validator>

在視圖中使用它,如下所示:

<t:inputText id="dedicatedCashAccountNumber"
    value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"
    validator="accountNumberValidator" />

而已。 請注意,如果驗證(或轉換)失敗,則不會調用JSF操作方法。 也不需要不必要的isError混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM