【发布时间】:2013-03-23 21:31:53
【问题描述】:
我尝试学习 JSF 并面临问题。
我确实使用了 Servlet 2.5、JDK 1.6 和 JSF 2.0.6(来自 pom 文件的 com.sun.faces 版本)。
我有一个简单的 JSF 页面,其中有一个 <h:inputText/> 标记用于与用户交互
我希望用户填写此h:inputText,然后单击h:commandButton,然后在服务器端我将获得具有更新值的支持 bean。
但在我的情况下,JSF 的生命周期在 process validations 中断,移动到 render
response 并向用户显示“解析器错误!”留言
即对于没有任何验证器和转换器的简单 h:inputText,我从服务器端收到有关解析 h:inputText 值的错误消息。
一段时间后,我想出了什么可以创建自己的转换器,它不会修改对象,只需通过自己传递String。
我确实将转换器的实现添加到 <h:inputText/> 并且这项工作。
问题:
在书籍和其他教程中的所有示例中,如果 inputText 是支持 bean 的 String 值的表示,则没有人使用 <h:inputText/> 的自定义转换器。
如果没有自定义转换器,为什么所有这些教程和示例都不适合我?我的错在哪里?
源代码:
index.xhtml 没有转换器,不适合我:
<h:form id="UserForm">
<h:outputText value="Insert your first name:" />
<h:inputText id="userNameID" required="true" value="#{userBean.firstName}">
<f:validateLength minimum="5" maximum="25" />
</h:inputText>
<h:message showSummary="true" showDetail="false" for="userNameID" />
<h:commandButton id="submit" action="/view/validator/response?faces-redirect=true"
value="Submit" />
</h:form>
UserBean.java:
@ManagedBean(name = "userBean")
@SessionScoped
public class UserBean implements Serializable {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
MyConverter.java - 虚拟转换器
@FacesConverter(value = "myConverter")
public class MyConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
index.xhtml 与转换器,按预期工作:
<h:form id="UserForm">
<h:outputText value="Insert your first name:" />
<h:inputText id="userNameID" required="true" value="#{userBean.firstName}" converter="myConverter">
<f:validateLength minimum="5" maximum="25" />
</h:inputText>
<h:message showSummary="true" showDetail="false" for="userNameID" />
<h:commandButton id="submit" action="/view/validator/response?faces-redirect=true"
value="Submit" />
</h:form>
【问题讨论】:
-
你没有运行你认为你正在运行的代码。该错误来自不同的转换器,目前在提供的信息中不可见。也许您已经创建了一个
@FacesConverter(forClass=String.class),它会自动在每个String属性上运行? -
BalusC,感谢您的回答。你说的对。我在
sys.out"detail=(Cannot parse this date!)" 和另一节课的DateConverter中有消息。将DateConverter从@FacesConverter更改为@FacesConverter(value = "dateConverter")后,所有工作都按预期进行。但是为什么这个转换器在没有任何转换器的情况下应用于inputText? -
因为
forClass.