2009-09-06 42 views
1

我使用JBoss Seam 2.2.0來製作一個web應用程序,並且我希望在接收它們之前修剪我的輸入,甚至在Hibernate Bean驗證階段之前。這可能嗎?我看到someone使用PhaseListener做相同的功能。這是做這件事的最好方法嗎?在JBoss Seam中修剪輸入

+0

http://stackoverflow.com/a/8327848/617373 – Daniel 2014-09-03 19:24:00

回答

9

我爲此使用了一個轉換器。工作得很好。

頁:

<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; 
    } 

} 
+0

謝謝。這當然是一個可能的解決方案,但我必須手動添加轉換器到每個輸入字段。我希望可以有一個更簡單的方法。 – 2009-09-08 09:11:54

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(並且這是在一月!)。但是,如果您確實需要支持任何Javascript瀏覽器,我建議您確實實施PhaseListener解決方案。


EDIT2

Convertor提出達摩該解決方案還工作,但是你需要指定輸入,則不需要與PhaseListener轉換器,即你會需要始終爲您的所有輸入添加converter="#{stringTrimConverter}"

+0

謝謝。這是部分解決方案,但對禁用JavaScript的客戶端無效。 – 2009-09-07 09:54:32

+0

好的,然後我編輯了我的答案... – romaintaz 2009-09-07 11:33:36

+0

謝謝。許多瀏覽器都支持JavaScript,但這在桌面上。一些手機瀏覽器不支持JavaScript(雖然很多)。另一方面,我不喜歡信任從客戶端發送的值,所以我寧願在客戶端和服務器端都這樣做。 – 2009-09-08 09:13:57

2

也許是更好的辦法是擴大<h:inputText>,創建自己的組件,它幾乎是一樣的<h:inputText>但trimmes結果通過默認。

在思想上我看來,應該有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> 
+0

這看起來像個好主意。你可以添加一個關於如何做的例子嗎? – 2010-09-22 08:33:58