JSF将OutputText和InputText值传递给属性

时间:2012-11-22 13:15:24

标签: java jsf jstl

这是我第二天使用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;

}

我能够递归地显示Key,值对。但是,一旦有人更新h:inputText id="value" value="${property.value}" />并按下写入新值的命令按钮,我想更新具有新值的特定键。在这方面需要帮助。谷歌搜索它让我觉得有太多的方法来做到这一点。需要帮忙。我只是无法弄清楚要传递给${txeConfBean.setProperty('key','value')}的内容如何将InputText和OutPutText的值传递给setProperty?

1 个答案:

答案 0 :(得分:5)

继承自旧JSP的${}无法对属性执行“set”操作。它只能对财产进行“获取”操作。

如果您想在属性上同时支持“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>   

请注意,省略了命令按钮操作。当模型值即将更新时,JSF / EL将“自动”调用地图的put()方法。在这个特定的构造中没有必要。另请注意,在此构造中,提交了整个表单。您可能希望将命令按钮放在表格之外,或者使用<f:ajax>仅提交当前“行”。

另见:


对具体问题

无关:您正在使用getter方法执行业务工作。如果在迭代组件中引用属性,则这是非常低效的。而是在(post)构造函数中执行业务工作。它只会被调用一次。这样你就可以让吸气剂真正成为一个值得一提的吸气剂。

public HashMap<String,String> getListTable() {
    return listTable;
}

另见: