为啥 <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 【问题描述】:

当我在&lt;h:inputText&gt; 中设置required="true" 时,它仍然允许空格。我一直在尝试修改jsf-api.jar,但我不明白如何生成新的JAR,所以我尝试从UIInput 类修改isEmpty() 方法并编译它,打开jsf-api.jar 并将其替换为新的,但它不起作用。

当用户在&lt;h:inputText&gt; 中写入不允许空格时,我需要做的是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> 上使用哪个事件来涵盖所有更改

如何在 JSF 中动态添加 <h:inputtext>? [复制]

如何在 h:inputText 中保留以前输入的数据?

h:inputText - jsf 不呈现占位符

如何在 jsf 中预填充 h:inputText

只接受 h:inputText 值的数字