2009-09-06 4 views
1

Я делаю веб-приложение с использованием JBoss Seam 2.2.0, и я хочу обрезать свои входы перед их получением, даже до фазы проверки фаз гибернации. Это возможно?Обрезка входов в JBoss Seam

Я видел someone с помощью PhaseListener для выполнения той же функции. Это лучший способ сделать это?

+0

http://stackoverflow.com/a/8327848/617373 – Daniel

ответ

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

Спасибо. Это, безусловно, возможное решение, но мне нужно будет добавить конвертер вручную в каждое поле ввода. Надеюсь, что может быть проще. –

2

Одно предложение, чтобы обрезать текст в Javascript, когда пользователь изменяет значение входа:

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

с функцией Javascript:

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


Edit, то относительно ваших комментарий:

Решение, которое я предложил, - лучший способ сделать это потому что это делается на стороне клиента. Однако, как вы сказали в комментарии, это не сработает, если браузер клиента не разрешит Javascript. As shown here, 95% пользователей активирует Javascript в своих браузерах (и был в январе !).

Однако, если вам действительно нужно поддерживать Javascript-браузеры, я предлагаю вам действительно реализовать решение PhaseListener.


Edit2

Решение, предложенное Дамо с Convertor также работает, но вам нужно будет указать конвертер для каждый ввода, который не нужен с PhaseListener, то есть вы будете необходимо всегда добавлять converter="#{stringTrimConverter}" для всех ваших входов.

+0

Спасибо. Это частичное решение, но оно не будет работать для клиентов, у которых отключен JavaScript. –

+0

Хорошо, тогда я отредактировал свой ответ ... – romaintaz

+0

Спасибо. Многие браузеры поддерживают JavaScript, но это на рабочем столе. Некоторые браузеры для мобильных телефонов не поддерживают JavaScript (хотя многие это делают). С другой стороны, мне не нравится доверять значениям, отправленным с клиентов, поэтому я бы предпочел сделать это как на стороне клиента, так и на стороне сервера. –

2

Возможно, лучший способ заключается в расширении <h:inputText>, создать свой собственный компонент, который в значительной степени так же, как <h:inputText> но trimmes результат на по умолчанию.

На мой взгляд, хотя, должно быть атрибутом в inputText, который обрезается по умолчанию, т.е.:

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

Update:

Итак, вот как вы можете создать компонент, который подрезать-х поля 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

Это выглядит неплохо. Не могли бы вы добавить пример о том, как это сделать? –

Смежные вопросы