我正在使用JBoss Seam 2.2.0创建一个Web应用程序,我希望在接收它们之前修剪我的输入,甚至在Hibernate Bean验证阶段之前。这可能吗?
我看到someone使用PhaseListener
来执行相同的功能。这是最好的方法吗?
答案 0 :(得分:9)
我使用转换器。效果很好。
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;
}
}
答案 1 :(得分: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(并且是在1月 2008 !)。
但是,如果您确实不需要支持任何Javascript浏览器,我建议您确实实现PhaseListener解决方案。
<小时/> EDIT2
Damo使用Convertor
提出的解决方案也有效,但您需要为每个输入指定转换器,而PhaseListener
不需要该转换器,即,您需要始终为所有输入添加converter="#{stringTrimConverter}"
。
答案 2 :(得分:2)
也许更好的方法是扩展<h:inputText>
,创建自己的组件与<h:inputText>
几乎相同但默认情况下会削减结果。
在我看来,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>