在 Mojarra TextRenderer 中修剪提交的值



我们有很多XHTML页面,每个页面都有一些<h:inputText><h:inputSecret>等输入组件。

我正在尝试找出一种通用方法,在表单提交之前修剪所有这些值。

我实现了一个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>

问题是,一切正常,自定义渲染器修剪值。 但是我们需要 validator & Managed Bean 中的组件值。 这些是在方法TrimInputTextRenderer#encodeBegin()方法调用之前执行的。 因此,在 Validator 和 Managed Bean 中,我们得到了非修剪值。 有没有办法在验证阶段之前执行它, 还是我需要在某个地方实现此逻辑?

此逻辑需要在decode()方法中实现,或者更简单的setSubmittedValue()中实现。

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

顺便说一下,这个Mojarra特定的渲染器扩展的更简单且不依赖于实现的替代方案是一个@FacesConverter(forClass=String)

最新更新