2012-11-08 48 views
0

我們有許多XHTML頁面,每個頁面都有一些<h:inputText>,<h:inputSecret>等輸入組件。修剪提交的值在Mojarra TextRenderer

我想找到一種通用的方式來修剪表單提交前的所有這些值。

我實現了一個TrimInputTextRenderer類,

XHTML頁面:

<h:inputText value="#{userBean.emailAddress}" trim="true"> 
     <f:validator validatorId="emailAddressValidator"/> 
</h:inputText> 

TrimInputTextRenderer.java

package com.vyan.web.component; 

import java.io.IOException; 
import java.util.List; 

import javax.faces.component.UIComponent; 
import javax.faces.component.UIInput; 
import javax.faces.component.UIOutput; 
import javax.faces.context.FacesContext; 
import javax.faces.render.FacesRenderer; 

import com.sun.faces.renderkit.html_basic.TextRenderer; 

@FacesRenderer(componentFamily="javax.faces.Input", rendererType="javax.faces.Text") 
public class TrimInputTextRenderer extends TextRenderer { 

    private void encodeBeginForChildren(FacesContext context, UIComponent component) { 
      if (component instanceof UIInput) { 
       component = (UIInput)component; 
       String componentValue = ((UIOutput)component).getValue().toString(); 
       componentValue = (componentValue!=null)?componentValue.trim():componentValue; 
       ((UIInput)component).setValue(componentValue); 
      } 

      // Encoding recursively all childrens. 
      if (component.isRendered() && component.getChildCount() > 0) 
       encodeBeginForChildrens(context, component.getChildren()); 

    } 

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

        // Encoding recursively all childrens. 
      if (comp.isRendered() && comp.getChildCount() > 0) 
       encodeBeginForChildrens(context, comp.getChildren()); 
     } 

    } 

    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException { 
     String trimValue = (String) component.getAttributes().get("trim"); 
     if (trimValue!= null && Boolean.valueOf(trimValue)) { 
      //super.write(string); 
      encodeBeginForChildren(context, component); 
     } 
     super.encodeBegin(context, component); 
    } 

} 

faces-config.xml

<render-kit> 
     <renderer> 
      <component-family>javax.faces.Input</component-family> 
      <renderer-type>javax.faces.Text</renderer-type> 
      <renderer-class>com.vyan.web.component.TrimInputTextRenderer</renderer-class> 
     </renderer> 
    </render-kit> 

問題是,一切工作正常,自定義渲染器修剪值。 但是我們需要驗證器&託管bean中的組件值。 那些在方法TrimInputTextRenderer#encodeBegin()方法調用之前執行。 因此,在驗證程序&託管bean中,我們正在獲取未修剪的值。 有沒有一種方法可以在驗證階段執行, 還是我需要在某些地方實現這個邏輯?

回答

1

該邏輯需要在decode()方法中實現,或者更容易地在setSubmittedValue()中執行。

@Override 
public void setSubmittedValue(UIComponent component, Object value) { 
    if (value instanceof String) { 
     value = ((String) value).trim(); 
    } 

    super.setSubmittedValue(component, value); 
} 

的更容易,不執行相關的替代方式鑽嘴魚科專用渲染引伸是一個@FacesConverter(forClass=String),順便說一句。

+0

聽起來不錯。 我理解了第二個選項@FacesConverter(forClass = String)。我必須實現一個轉換器並重寫方法getAsObject&getAsString的權利..!。 – uday

+0

Ohh BalusC ..你很棒。 我在這裏找到了解決方案http://stackoverflow.com/questions/8326398/why-does-hinputtext-required-true-allow-blank-spaces – uday