目前我正在开发一些复杂的网络前端并使用:
- JSF 1.2
- Facelets 1.1.15
- RichFaces 3.3.3.Final
我创建了一个自定义 JSF 组件,它可以使用纯 JavaScript 验证 inputText 字段。这个组件只有一个属性:type。此属性负责验证算法,该算法将在用户按下键盘键时应用。
在restoreView
创建初始视图的阶段,此属性由 JSF(实际上由 Facelets)设置。这意味着我有一个带有属性“类型”的 setter 和 getter 的组件类。以及使用 xhtml 文档中指定的值调用的“类型”设置器。
如果我在 reRender 属性中指定它们,则每次在 restoreView 阶段都会重新创建组件对象。但是当它重新创建时,我需要的属性类型没有设置。它只是创建新的组件对象……仅此而已。可能是我不明白某些东西,这是正常行为,但是在这种情况下如何获取属性值?
代码:
简单的测试页面:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:u="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j"
xmlns:r="http://richfaces.org/rich"
xmlns:v="http://nobodyhere.ru/jsf/validation">
<head>
<title>Test Page</title>
</head>
<body>
<h:form id="testForm">
<h:inputText id="textInput" value="test">
<v:keyValidator type="time"/>
</h:inputText>
<a:commandButton value="Make AJAX request" reRender="testForm"/>
</h:form>
</body>
</html>
组件类:
public class KeyValidator extends UIComponentBase
{
public KeyValidator()
{
System.out.println("new KeyValidator");
}
public KeyValidatorType getValidatorType()
{
return type;
}
public String getType()
{
return getValidatorType().toString();
}
public void setType(String type)
{
this.type = KeyValidatorType.valueOf(type.toUpperCase());
}
@Override
public String getFamily()
{
return KeyValidator.class.getName();
}
private KeyValidatorType type;
}
当我按下“发出 AJAX 请求”按钮时,我的组件被重新创建。但是组件中没有设置属性“类型”。
主要问题开始renderView
于组件渲染器的阶段,当encodeBegin
它被调用时它试图获取这个属性,当然它得到null
的是正确的值而不是正确的值。
所以,更精确的问题可能是:
如何在renderView
阶段获取 AJAX 请求的组件属性值?
任何帮助将不胜感激。