uda*_*day 5 jsf facelets jsf-2
我有一个包含少量输入字段和一个选择菜单的表单.所有字段都是必需的="true",firstName,lastName,emailAddress,密码,国家/地区.
测试用例#1:1)在所有输入字段中输入值,保留firstName字段而不输入任何值,
选择一个国家(例如:美国)并提交表单,我们可以看到所需的firstName字段的错误消息.
2)保持表单不变,保留firstName字段而不输入任何值,然后选择country to"select one",并提交表单.我们可以看到firstName和country字段的错误消息,但是在下拉列表中它没有显示"Select One",它显示美国(之前的选择).
我对输入字段有同样的问题,但我用转换器解决了.有没有办法解决这个问题.我在stackoverflow中发布了一些帖子,后来才知道这是mojarra中的一个bug.
这是我的代码......
<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> </td>
<td>
<h:commandButton name="RegisterButton" id="RegisterButton"
styleClass="submitbutton"
value="Register"
action="#{registrationAction.registerUser}" />
</td>
</table>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
看看下面的BalusC博客文章在 ajax 更新时重置未处理的输入组件
您可以将OmniFaces添加到您的项目并使用其ResetInputAjaxActionListener
所以你必须将你的代码更新为这个(你最好f:ajax
也使用):
<h:commandButton name="RegisterButton" id="RegisterButton"
styleClass="submitbutton"
value="Register"
action="#{registrationAction.registerUser}">
<f:ajax execute="@form" render="@form" />
<f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
另外,看看这个BalusC 答案How can I populate a text field using primefaces ajax aftervalidation errorgenesis?
归档时间: |
|
查看次数: |
3248 次 |
最近记录: |