【问题标题】: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

【问题讨论】:

    标签: validation jsf jsf-2 whitespace required-field


    【解决方案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 的具体问题涉及带有空格/空格的字符串,而不是空字符串,对此上下文参数确实是解决方案之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-06-21
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多