代码之家  ›  专栏  ›  技术社区  ›  Hosam Aly

修剪JBoss Seam中的输入

  •  1
  • Hosam Aly  · 技术社区  · 16 年前

    我正在使用 JBoss Seam 2.2.0,我希望在接收输入之前,甚至在HibernateBean验证阶段之前,修剪输入。这有可能吗?

    我看见了 someone 使用A PhaseListener 做同样的功能。这是最好的方法吗?

    3 回复  |  直到 15 年前
        1
  •  9
  •   Damo    16 年前

    我用一个转换器。效果很好。

    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;
        }
    
    }
    
        2
  •  2
  •   Romain Linsolas    16 年前

    一个建议是,在用户更改输入值后,在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月份 二千零八 !).

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


    编辑2

    达莫提出的解决方案 Convertor 也可以,但您需要为 每一个 输入,不需要 PhaseListener ,即,您需要始终添加 converter="#{stringTrimConverter}" 所有的投入。

        3
  •  2
  •   Shervin Asgari    15 年前

    也许更好的方法是扩展 <h:inputText> ,创建与 <H:输入文本& GT; 但默认情况下,这会减少结果。

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

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

    更新:

    好的,下面是如何创建一个组件来修剪输入文本字段。 但是请注意,我还没有测试代码,所以我不能百分之百地确定它是否可以工作,但是应该可以。

    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> 
    
    推荐文章