gpt4 book ai didi

JSF2 h :selectOneMenu shows old value when Validation Failed

转载 作者:行者123 更新时间:2023-12-03 15:02:23 24 4
gpt4 key购买 nike

我有一个包含几个输入字段和一个选择一个菜单的表单。
所有字段都是必填项="true",
名字、姓氏、电子邮件地址、密码、国家。

测试用例#1:
1) 在所有输入字段中输入值,离开 firstName 字段而不输入任何值,
选择一个国家(例如:美国)并提交表格,我们可以看到错误信息
对于 firstName 字段是必需的。

2) 保持表单原样,离开 firstName 字段而不输入任何值,
然后选择国家“选择一个”,并提交表格。我们可以看到错误信息
对于名字和国家/地区字段,但在下拉列表中没有显示“选择一个”,
它显示美国(之前的选择)。

我对输入字段有同样的问题,但我用转换器解决了。
有没有办法解决这个问题。我在 stackoverflow 中发表了几篇文章,才知道这是 mojarra 中的一个错误。

这是我的代码...

用户注册.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" >
<h:body>
<h:form id="registrationForm">
<h:messages layout="table" infoClass="infoMsgs" errorClass="errMsgs"/>

<table>
<tr>
<td>First Name:</td>
<td>
<h:inputText size="40" maxlength="100"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}"
value="#{registrationAction.firstName}" />
</td>
</tr>
<tr>
<td>Last Name:</td>
<td>
<h:inputText size="40" maxlength="100"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}"
value="#{registrationAction.lastName}" />
</td>
</tr>
<tr>
<td>Email Address:</td>
<td>
<h:inputText size="40" maxlength="100"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}"
value="#{registrationAction.emailAddress}" />
</td>
</tr>
<tr>
<td>Password:</td>
<td>
<h:inputSecret size="20" maxlength="15"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}"
value="#{registrationAction.password}" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<h:selectOneMenu id="yourCountry" name="yourCountry"
value="#{shortRegistrationAction.shortRegistrationForm.selectedCountry}"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}">
<f:selectItem itemValue="#{null}" itemLabel="-Select One-" />
<f:selectItems value="#{registrationAction.countryList}" />
</h:selectOneMenu>
</td>
</tr>
<tr>
<td>&#160;</td>
<td>
<h:commandButton name="RegisterButton" id="RegisterButton"
styleClass="submitbutton"
value="Register"
action="#{registrationAction.registerUser}" />
</td>
</table>
</h:form>
</h:body>
</html>

注册 Action .java
package com.ebiz.web.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import com.ebiz.service.ICountryService;
import com.ebiz.service.IUserService;
import com.ebiz.vo.UserVO;
import org.apache.log4j.Logger;

@ManagedBean(name = "registrationAction")
@ViewScoped
public class RegistrationAction implements Serializable {

private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(RegistrationAction.class);

@ManagedProperty("#{countryService}")
private ICountryService countryService;

@ManagedProperty("#{userService}")
private IUserService userService;

private String firstName;
private String lastName;
private String emailAddress;
private String password;
private String selectedCountry;
private List<String> countryList;

@PostConstruct
public void init(){
countryList = countryService.getCountryList();
}

public void registerUser() {

UserVO userVO = new UserVO();
userVO.setFirstName(firstName);
userVO.setLastName(lastName);
userVO.setEmailAddress(emailAddress);
userVO.setPassword(password);
userVO.setCountry(selectedCountry);

userService.registerUser(userVO);

}
}

InputTextTrimmer.java
package com.ebiz.web.converter;

import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

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

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
//return value != null ? value.trim() : null;
if (value == null || value.trim().isEmpty()) {
if (component instanceof EditableValueHolder) {
((EditableValueHolder) component).setSubmittedValue(null);
((EditableValueHolder) component).resetValue();
}
return null;
}
return value;
}

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

}

最佳答案

经过长时间的研究,我没有找到在 JSF 中实现这一点的任何方法。
所以我用jQuery来处理它的客户端,
可能这个答案不是最佳解决方案,但至少对需要解决方案的人有用。

这里的下拉值将显示一个旧值,但它仍然显示下拉的验证错误。
在上面的 xhtml 页面中,如果您查看下拉菜单部分,

    <h:selectOneMenu id="yourCountry" name="yourCountry"    
value="#{shortRegistrationAction.shortRegistrationForm.selectedCountry}"
required="true"
styleClass="#{component.valid ? '' : 'text_error'}">
<f:selectItem itemValue="#{null}" itemLabel="-Select One-" />
<f:selectItems value="#{registrationAction.countryList}" />
</h:selectOneMenu>

即使它显示验证失败情况的旧值,styleClass 仍然会变为 text_error。
在关闭 <h:body> 之后,我在我的 xhtml 页面中添加了以下代码标签。即( </h:body>)
它仅适用于此特定 xhtml 页面中的所有下拉菜单,但是我们可以将其放置在 commonTemplate.xhtml 之类的公共(public)位置以在所有页面上执行它。
 <script>
//<![CDATA[
jQuery(document).ready(function() {
jQuery("select").each(function () {
var dropDownClass = jQuery(this).attr('class');
if(dropDownClass == 'text_error'){
jQuery(this).val('');
}
});
});
//]]>
</script>

关于JSF2 h :selectOneMenu shows old value when Validation Failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485028/

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