考虑以下HtmlBasicRenderer
类的片段:
Map<String, String> requestMap =
context.getExternalContext().getRequestParameterMap();
// Don't overwrite the value unless you have to!
String newValue = requestMap.get(clientId);
if (newValue != null) {
setSubmittedValue(component, newValue);
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE,
"new value after decoding {0}",
newValue);
}
}
该片段在decode(FacesContext context, UIComponent component)
方法中出现,该方法负责提取请求参数并在应用请求阶段将其分配给组件。
我的问题是关于如何生成此请求参数?如果我们在其中有简单的html
- 形式和标准html input
,那就是:
<form method="POST">
<input name="name" value="value" />
</form>
我们将获得name=value
参数对。
因此,我们为我们正在编写的组件指定请求参数 key 的唯一方法是指定name
属性它的渲染器encode
方法中的元素。一旦我们这样做,我们就可以从解码方法访问相应的参数。
更新: 我正在编写一个继承自UISelectOne
的组件,但所选项目可能包含更多的一个输入字段(两个在特定情况下) 。它的声明看起来像下面的内容(细节似乎并不重要):
<stcomutil:selectOne key="#{myBean.key}" value="#{myBean.value}">
<stcomutil:selectOneItem />
<stcomutil:selectOneItem />
<stcomutil:selectOneItem />
</stcomutil:selectOne>
将<stcomutil:selectOneItem />
呈现为两个input type="text"
:
^ ^
| |
| |
the key field the value field
所以,实际上我将有3行这样的输入,我需要处理唯一的行用户类型。再次,我省略了禁用输入的细节等等。
我想学习:要处理额外的值输入(转换,验证,更新等),我只需要为该附加输入指定name属性,然后在Apply请求阶段提取它,对吧?此外,在更新模型阶段,我必须使用ValueExpression
展示为该绑定提取getValueExpression
对象,并使用setValue
方法为其分配值。