gpt4 book ai didi

java - Java 中的 JSF 页面验证和生成的组件 ID 问题

转载 作者:行者123 更新时间:2023-12-01 18:52:26 25 4
gpt4 key购买 nike

我有一个问题,根据<h:message for="" /> JSF 对象。我有一个 JSF 1.1(是的,不幸的是)myFaces 项目。我准备了一个简单的 JSP 文件,其中包含标签、inputText 和消息持有者:

<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(例如 _idJsp12:DynTab2:DynView2:tabK.....er:vKustaMa....Controller:sacLinkForm:dedicatedCashAccountNumber ),并且它可能会导致 addMessage方法与 h:message for=".." 不对应属性。

因此该消息无法正确显示,因为 java 找不到正确的 h:message目的。有什么方法可以将消息设置为正确的h:message来自 java ?我认为无法在 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>

在 View 中使用它,如下所示:

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

就是这样。请注意,如果验证(或转换)失败,则不会调用 JSF 操作方法。也不需要无意义的 isError 困惑。

关于java - Java 中的 JSF 页面验证和生成的组件 ID 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15393510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com