这是我与JSF合作的第二天.以前没有Java背景,已经使用Flex和C++很长一段时间了.一些历史,以便每个人都知道我来自哪里.对于"匆忙"项目,我遇到了一个问题
<h:panelGroup id="txeTab" layout="block" class="txeTab">
<h1>TXE</h1>
<h:form id="txeForm">
<h:panelGrid columns="3">
<c:forEach items="${txeConfBean.getListTable()}" var="property">
<h:outputLabel id="key" value="${property.key}"/>
<h:inputText id="value" value="${property.value}" />
<h:commandButton value="Change" action='${txeConfBean.setProperty('key','value')}'/>
</c:forEach>
</h:panelGrid>
</h:form>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
和Bean如下
public HashMap <String,String> getListTable ()
{
String[] keys = new String[super.keyData.size()];
HashMap <String,String> retKeys = new HashMap <String, String>();
super.keyData.toArray(keys);
for (int i=0;i<keys.length;i++)
{
if(!keys[i].isEmpty())
{
retKeys.put(keys[i],getProperty(keys[i]));
}
}
return retKeys;
}
Run Code Online (Sandbox Code Playgroud)
我能够递归地显示Key,值对.但是我想更新一个具有新值的特定键,一旦有人更新h:inputText id="value" value="${property.value}" />并按下命令按钮,新值将被写入.在这方面需要帮助.谷歌搜索它让我觉得有太多的方法来做到这一点.需要帮忙.我只是无法弄清楚要传递给什么${txeConfBean.setProperty('key','value')}如何将InputText和OutPutText的值传递给setProperty?
的${},这是从传统的JSP继承,不能做上的属性"设置"操作.它只能对物业进行"获取"操作.
如果你想在一个属性上支持"get"和"set",你需要#{}.更常见的是,在JSF中,你不应该再使用${}了.此外,为了通过输入组件获取/设置映射值,您必须使用括号表示法通过其键引用映射值#{bean.map[key]}.
<h:form id="txeForm">
<h:panelGrid columns="3">
<c:forEach items="#{txeConfBean.listTable}" var="property">
<h:outputLabel id="key" value="#{property.key}"/>
<h:inputText id="value" value="#{txeConfBean.listTable[property.key]}" />
<h:commandButton value="Change" />
</c:forEach>
</h:panelGrid>
</h:form>
Run Code Online (Sandbox Code Playgroud)
请注意,省略了命令按钮操作.put()当模型值即将更新时,JSF/EL将"自动"调用地图的方法.在这个特定的构造中没有必要.另请注意,在此构造中,将提交整个表单.您可能希望将命令按钮放在表格外部,或者<f:ajax>仅用于提交当前"行".
与具体问题无关:您正在使用getter方法执行业务工作.如果在迭代组件中引用属性,则这是非常低效的.而是在(post)构造函数中执行业务工作.它只会被调用一次.这样你就可以让吸气剂真正成为一个值得一提的吸气剂.
public HashMap<String,String> getListTable() {
return listTable;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2598 次 |
| 最近记录: |