这是我使用 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>
The 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;
}
我无法递归地显示键值对。但是我想在有人更新 h:inputText id="value"value="${property.value}"/>
后用新值更新特定键并按下命令按钮新值被写入。需要这方面的帮助。谷歌搜索让我觉得有太多方法可以做到这一点。需要帮忙。我只是无法弄清楚要传递给 ${txeConfBean.setProperty('key','value')}
我如何将 InputText 和 OutPutText 的值都传递给 setProperty?
最佳答案
${}
继承自遗留 JSP,无法对属性执行“设置”操作。它只能对属性进行“获取”操作。
如果你想在属性上同时支持“获取”和“设置”,你需要 #{}
.更重要的是,通常在 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>
请注意,省略了命令按钮操作。 JSF/EL 将“自动”调用 map 的 put()
。模型值即将更新时的方法。在这个特定的结构中没有必要。另请注意,在此构造中,提交了整个 表单。您可能想要将命令按钮放在表格外面,或者使用 <f:ajax>
仅提交当前“行”。
另见:
与具体问题无关:您正在使用 getter 方法执行业务工作。如果属性在迭代组件中被引用,这是非常低效的。改为在(后)构造函数中执行业务工作。它只会被调用一次。这样你就可以使 getter 真正成为一个完全值得的 getter。
public HashMap<String,String> getListTable() {
return listTable;
}
另见:
关于java - JSF 将 OutputText 和 InputText 值传递给属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13513528/