为啥 <h:inputText required="true"> 允许空格?
Posted
技术标签:
【中文标题】为啥 <h:inputText required="true"> 允许空格?【英文标题】:Why does <h:inputText required="true"> allow blank spaces?为什么 <h:inputText required="true"> 允许空格? 【发布时间】:2012-01-09 17:10:38 【问题描述】:当我在<h:inputText>
中设置required="true"
时,它仍然允许空格。我一直在尝试修改jsf-api.jar
,但我不明白如何生成新的JAR,所以我尝试从UIInput
类修改isEmpty()
方法并编译它,打开jsf-api.jar
并将其替换为新的,但它不起作用。
当用户在<h:inputText>
中写入不允许空格时,我需要做的是trim()
。我怎样才能做到这一点?
如果你想下载jsf-api.jar
资源,你可以这样做,只需阅读如何在:http://javaserverfaces.java.net/checkout.html。
【问题讨论】:
【参考方案1】:这是正常和自然的行为,不是 JSF 特有的。空格可能是完全有效的输入。 required="true"
只对空输入起作用,而不是对填充输入起作用。但是,在 JSF 中,您可以为 String
类创建一个 Converter
以自动修剪空白。
@FacesConverter(forClass=String.class)
public class StringTrimmer implements Converter
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
return value != null ? value.trim() : null;
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
return (String) value;
把这个类放在你项目的某个地方。感谢@FacesConverter
,它将自动注册,并感谢forClass=String.class
,为每个String
条目自动调用。
无需破解 JSF API/impl。这毫无意义。
【讨论】:
哇!!!这很容易,而且很有效,谢谢。我花了很多时间来完成这项任务:/ 不客气。将来,每当您认为“我需要破解 JSF”时,请先在 Stack Overflow 上询问您的理由是否真的有效;) 请注意:如果这似乎不起作用(从未调用转换器),请检查this question中的答案 我遇到了这个异常:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
【参考方案2】:
如果您想关闭 BalusC 作为标准 JSF 行为的答案之一的行为,您可以修改 web.xml 并包含以下内容。
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
<context-param>
这将触发 JSF 框架考虑可能更可取的值 null
,或者替代 BalusC 的答案。
【讨论】:
OP 的具体问题涉及带有空格/空格的字符串,而不是空字符串,对此上下文参数确实是解决方案之一。以上是关于为啥 <h:inputText required="true"> 允许空格?的主要内容,如果未能解决你的问题,请参考以下文章
在 <h:inputText> 上使用哪个事件来涵盖所有更改