为什么<h:inputText required="true">允许空格?

15
当我在 <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
2个回答

44

这是正常和自然的行为,不仅限于JSF。空格可以是完全有效的输入。 required =“true”仅在空输入时启用,而不是在已填充的输入中。但在JSF中,您可以创建Converter来自动修剪空格以处理String类。

@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,这没有意义。


哇!!!这很容易并且成功了,谢谢。我花了很多小时来完成这个任务 :/ - Ing.LkRuiZ
不客气。将来,如果你认为“我需要黑JSF”,请先在Stack Overflow上提问,以确定你的原因是否真正有效 ;) - BalusC
1
请注意:如果这似乎无法工作(转换器从未被调用),请检查此问题中的答案。 - Louise
我遇到了这个异常:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String - Akhil

9

如果你想关闭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的答案更好,或者是一种替代方案。

2
OP的具体问题涉及带有空格/空白的字符串,而不是空字符串,对于这种情况,上下文参数确实是其中之一的解决方案。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接