修剪JBoss Seam中的输入

时间:2009-09-06 10:12:12

标签: java jsf jboss java-ee seam

我正在使用JBoss Seam 2.2.0创建一个Web应用程序,我希望在接收它们之前修剪我的输入,甚至在Hibernate Bean验证阶段之前。这可能吗?

我看到someone使用PhaseListener来执行相同的功能。这是最好的方法吗?

3 个答案:

答案 0 :(得分:9)

我使用转换器。效果很好。

Page:

<h:inputText value="#{myBean.myValue}" converter="#{stringTrimConverter}"/>

代码:

@Name("stringTrimConverter")
@BypassInterceptors
@Converter
public class StringTrimConverter implements javax.faces.convert.Converter {

    public Object getAsObject(FacesContext context, UIComponent cmp, String value) {

        if(StringUtils.isBlank(value)) {
            return null;
        } else {
            return value;
        }
    }

    public String getAsString(FacesContext context, UIComponent cmp, Object value) {

        if(value != null) {
            return value.toString().trim();
        } 
        return null;
    }

}

答案 1 :(得分:2)

一个建议是在用户更改输入值后修剪Javascript中的文本:

<h:inputText ... onchange="this.value = trim(this.value);"/>

使用Javascript函数:

function trim(myString) {
    return myString.replace(/^\s+/g,'').replace(/\s+$/g,'');
}

<小时/> 编辑,关于您的评论:

我建议的解决方案是最好的方法,因为它是在客户端完成的。但是,正如您在评论中所说,如果客户端的浏览器不允许Javascript,它将无法工作。 As shown here 95%用户在其浏览器上激活Javascript(并且是在1月 2008 !)。

但是,如果您确实不需要支持任何Javascript浏览器,我建议您确实实现PhaseListener解决方案。

<小时/> EDIT2

Damo使用Convertor提出的解决方案也有效,但您需要为每个输入指定转换器,而PhaseListener不需要该转换器,即,您需要始终为所有输入添加converter="#{stringTrimConverter}"

答案 2 :(得分:2)

也许更好的方法是扩展<h:inputText>,创建自己的组件与<h:inputText>几乎相同但默认情况下会削减结果。

在我看来,inputText中应该有一个默认修剪的属性,即:

<h:inputText value="#{myBean.text}" trim="true"/>

<强>更新

好的,所以这里是如何创建一个修剪inputText字段的组件。 请注意,但是我没有测试过代码,所以我不是100%确定它会起作用,但它应该。

faces-config.xml

添加您的组件

<component>
  <component-type>foo.InputControlComponent</component-type>
  <component-class>my.package.foo.InputControl</component-class>
</component>

创建WEB-INF/foo.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
   <namespace>http://whatever.com/foo</namespace>
    <tag>
        <tag-name>inputControl</tag-name>
        <component>
            <component-type>foo.InputControlComponent</component-type>
        </component>
    </tag>
 </facelet-taglib>

web.xml

<context-param>
  <param-name>facelets.LIBRARIES</param-name>
  <param-value>/WEB-INF/foo.taglib.xml</param-value>
</context-param>

InputControl.java

public class InputControl extends UIPanel {

    public InputControl() {
        super();
    }

    private void childrenEncodeBegin(FacesContext context, List<UIComponent> children) {
    for (UIComponent comp : children) {
            if (comp instanceof UIInput) {
                comp = (UIInput) comp;
                ((UIInput) comp).setValue(((UIInput) comp).getValue().toString().trim());
            } 

        // Encode recursively
        if (comp.isRendered() && comp.getChildCount() > 0)
            childrenEncodeBegin(context, comp.getChildren());
    }

    }

    public void encodeBegin(FacesContext context) throws IOException {
        if (getChildren() != null)
            childrenEncodeBegin(context, getChildren());
    }
}

现在在您的xhtml中,您可以像这样使用它:

<foo:inputControl>
  <ui:include src="myForm.xhtml"/>
</foo:inputControl>