gpt4 book ai didi

java - 为什么输入在必填字段验证后保持值(value)

转载 作者:行者123 更新时间:2023-11-29 05:50:37 25 4
gpt4 key购买 nike

当页面加载了绑定(bind)到 View 范围支持 bean 中的值的输入时,如果该值是预初始化的,则在必填字段验证之后,输入将再次填充以前的值。

这是托管 bean:

@ManagedBean(name = "adminController")
@ViewScoped
public class AdminController extends BaseWebController implements Serializable {

private static final long serialVersionUID = 1019716974557397635L;

private transient CustomerDTO customerDTO;

public AdminController() {
log.debug("Inside AdminController");
}

@PostConstruct
public void init() {
initCustomerDTO();
customerDTO.setCustomerName("Test");
}

public void saveCustomer(ActionEvent event) {
try {
getServiceProvider().getCustomerService().addNewCustomer(customerDTO);
getFacesContext().addMessage(null, FacesMessageUtils.getMessageForCustomerSaveSuccess(getFacesContext()));
} catch (Throwable throwable) {
getFacesContext().addMessage(null, FacesMessageUtils.getMessageForCustomerSaveError(getFacesContext()));
printStackTrace(throwable);
}

initCustomerDTO();
}

private void initCustomerDTO() {
customerDTO = new CustomerDTO();
}

public CustomerDTO getCustomerDTO() {
return customerDTO;
}

public void setCustomerDTO(CustomerDTO customerDTO) {
this.customerDTO = customerDTO;
}
}

CustomerDTO 是一个 POJO。

jsf 包含:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions">

<h:form id="customerForm">

<p:inputText id="customerName" styleClass="customerName"
autocomplete="off"
label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}"
value="#{adminController.customerDTO.customerName}"
required="true" />


<p:commandButton value="#{adbBundle['saveButton']}"
actionListener="#{adminController.saveCustomer}"
icon="ui-icon-check"
update=":growl, @form, :adminTabView:customerListForm:customerListPanel" />

</h:form>

</ui:composition>

我还有一个自定义转换器类,用于修剪空白 String

@FacesConverter(forClass = String.class)
public class StringTrimmer implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (StringUtils.isBlank(value)) {
if (component instanceof EditableValueHolder) {
((EditableValueHolder) component).setSubmittedValue(null);
}
return null;
}
return value;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}

因此,当页面首次加载时,输入字段包含“Test”。我清理了测试字段并单击保存按钮。我收到了必填字段验证的错误消息,但输入再次填充了我之前设置的默认值“测试”。

我该如何解决这个问题?

更新:

我在 JBoss AS7 中运行,Mojarra 2.1.7 是 JBoss 的实现和 Primefaces 3.4.2。

最佳答案

您的问题是由转换器引起的。

当特定组件的 JSF 验证失败时,提交的值将保留在组件中,否则将其清空并设置为本地值。当 JSF 完成所有组件的验证并且没有一个验证失败时,所有本地值都将被清空并设置为模型值(被引用为 value 属性的值)。当 JSF 需要重新显示带有值的表单时,它首先检查提交的值是否不为 null 然后显示它,否则它检查本地值是否不为 null 然后显示它,否则它直接显示模型值。

在您的情况下,无论验证结果如何,您都将提交的空字符串值转换为 null。因此提交的值始终为 null,因此 JSF 将始终重新显示模型值而不是空字符串提交值。

我相信您宁愿需要以下上下文参数而不是转换器,当然如果唯一的目标是防止模型值在提交空输入时被空字符串污染。

<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>

或者如果您的唯一目标真的是从字符串中去除空格,正如转换器类名称所暗示的那样,那么您根本不应该触及提交的值。你可以在这里找到一个具体的例子:Why does <h:inputText required="true"> allow blank spaces? getAsObject() 不会设置为提交值,而是设置为本地值(验证成功时)并最终设置为模型值。

关于java - 为什么输入在必填字段验证后保持值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14003806/

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