gpt4 book ai didi

jsf - 即使 JSF 在流程验证阶段失败,是否有一种方法可以更新组件

转载 作者:行者123 更新时间:2023-12-04 19:50:36 26 4
gpt4 key购买 nike

我有一个具有 required=true 属性的输入文本,如下所示

<h:panelGrid columns=2>
<h:panelGroup id="ccm">
<p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}"
required="true" requiredMessage="Required">
<p:ajax event="blur" listener="#{setupView.handleLooseFocusCCMTextbox()}"
update=":setupForm:ccm :setupForm:ccmMsg"/>
</p:inputText>
<h:outputText value="Duplicated" id="ccmExisted"
styleClass="ui-message-error ui-widget ui-corner-all"
rendered="#{setupView.ccmNameExisted}"/>
<h:graphicImage id="ccmNotExist" url="resources/images/check-icon.png"
rendered="#{setupView.ccmNameUnique}"
width="18"/>
</h:panelGroup>
<p:message for="txtCCMNumber" id="ccmMsg" display="text"/>
</h:panelGrid>

所以我的要求是,如果值为空,那么它会显示Required,因为required=true,它应该在Process Validation阶段失败。如果该值是唯一的,则显示一个check 图像,如果重复,则显示Duplicated 文本。我遇到的问题是,在我输入一些内容并用 Tab 键离开后(假设我输入了一些独特的东西),它会显示 check 图像,然后我删除文本,然后再次 Tab 键离开,现在Required 文本出现,但 check 图像也出现。我的理论是,在 Process validation 阶段,由于值为空而失败,因此在更新组件阶段,它不会调用该方法 handleLooseFocusCCMTextbox()这会将 bool 值 ccmNameUnique 设置为 false。有没有办法来解决这个问题?

注意:handleLooseFocusCCMTextbox() 只是打开和关闭 bool 值以显示check 图像或Duplicated 文本。

已回答。创建Validator类,取出required=true

public void validate(FacesContext fc, UIComponent uic, Object value)
throws ValidatorException {
FacesContext context = FacesContext.getCurrentInstance();
SetupView setupView = (SetupView) context.getApplication().
evaluateExpressionGet(context, "#{setupView}", SetupView.class);
if (value == null || value.toString().isEmpty()) {
setupView.setCcmNameUnique(false);
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
message.setSummary("Error");
message.setDetail("Required");
//This will end up in <p:message>
throw new ValidatorException(message);
}
String rootPath = setupView.getRootPath();
File rootFolder = new File(rootPath);
if (rootFolder.exists() && rootFolder.canRead()) {
List<String> folderNames = Arrays.asList(new File(rootPath).list());
if (folderNames.contains(value.toString())) {
setupView.setCcmNameUnique(false);
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
message.setSummary("Error");
message.setDetail("Duplicate");
//This will end up in <p:message>
throw new ValidatorException(message);
} else {
setupView.setCcmNameUnique(true);
}
} else {
logger.log(Level.SEVERE, "Please check the root folder path as "
+ "we cannot seems to see it. The path is {0}", rootPath);
}
}

最佳答案

您想使用验证器而不是 Action 监听器。

<p:inputText id="txtCCMNumber" value="#{setupView.selectedCCM}"
required="true" requiredMessage="Required"
validator="#{setupView.validateDuplicateCCM}">
<p:ajax event="blur" update="ccm ccmMsg" />
</p:inputText>

public void validateDuplicateCCM(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value == null || value.toString().isEmpty()) {
return; // Let required="true" handle.
}

// ...

if (duplicate) {
((UIInput) component).setValid(false);
ccmNameExisted = true;
// I'd rather throw ValidatorException instead of above two lines here so that it ends up in <p:message>
} else {
ccmNameUnique = true;
}
}

关于jsf - 即使 JSF 在流程验证阶段失败,是否有一种方法可以更新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469694/

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