我正在尝试做一些“自定义轻量级”JSF 组件绑定。在我的bean(控制一些JSF页面)中,我声明了一个HahsMap,其中跨越我的h:inputText
id(出现在页面中)的键将这些id映射到自定义HInputText<T>
对象(T
在下面给出的示例中是Long)。然后我使用HInputText<T>
对象来保存相应 h:inputText 属性的子集:value
应该是类型T
, rendered
,required
等。在这个方向上,来自HInputText<T>
对象的字段为属性赋予值h:inputText
。
我的问题是,当在h:inputText
内部使用这样的 a时h:form
,不会发生 JSF 验证:我可以在h:inputText
(应该包含 Long 值)中键入字母数字字符,并且我的表单提交时不会显示任何错误。请注意,required
属性rendered
管理正确(因为required
设置为 true,所以当我将该h:inputText
字段留空时出现错误),并且当我尝试h:inputText
使用一些h:outputText
字母数字字符显示页面中的值时。
是否有一些技巧可以使 JSF 验证工作而不必为每个显式定义自定义验证器h:inputText
?
HInputText.class:
public class HInputText<T>
{
private String id;
private boolean rendered;
private boolean required;
private T value;
private Class<T> myClass;
// getters and setters for all fields
public HInputText(Class<T> myClass, String id)
{
this.myClass = myClass;
this.id = id;
this.rendered = true;
this.required = true;
}
}
我的托管 Bean 中的代码片段:
@ManagedBean(name="saisieController")
@SessionScoped
public class SaisieController
{
...
private HashMap<String,HInputText<Long>> htagLongInputTexts;
public HashMap<String, HInputText<Long>> getHtagLongInputTexts()
{
return htagLongInputTexts;
}
public void setHtagLongInputTexts(HashMap<String, HInputText<Long>> hLongInputTexts)
{
this.htagLongInputTexts = hLongInputTexts;
}
public void addHtagLongInputText(HInputText<Long> hLongInputText)
{
getHtagLongInputTexts().put(hLongInputText.getId(), hLongInputText);
}
public HInputText<Long> getHtagLongInputText(String hLongInputTextId)
{
return(getHtagLongInputTexts().get(hLongInputTextId));
}
@PostConstruct
public void init()
{
setHtagLongInputTexts(new HashMap<String, HInputText<Long>>());
addHtagLongInputText(new HInputText<Long>(Long.class, "HIT_LongTestHIT"));
}
public String doNothing()
{
return null;
}
}
最后是我的 jsf 页面的一个片段:
<h:form>
<h:inputText
id = "HIT_LongTestHIT"
value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}"
rendered = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].rendered}"
required = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].required}"
/>
<h:message for = "HIT_LongTestHIT" styleClass = "error-text" />
<h:commandButton value = "submit" action = "#{saisieController.doNothing()}" />
<h:outputText value = "#{saisieController.htagLongInputTexts['HIT_LongTestHIT'].value}" />
</h:form>