【问题标题】:JSF Pass OutputText and InputText value to a propertyJSF 将 OutputText 和 InputText 值传递给属性
【发布时间】:2012-11-10 21:36:41
【问题描述】:

这是我与 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>

豆子如下

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}" /&gt;,我想用新值更新一个特定的键,然后按下新值写入的命令按钮。在这方面需要帮助。谷歌搜索让我觉得有太多方法可以做到这一点。需要帮忙。我只是无法弄清楚要传递给 ${txeConfBean.setProperty('key','value')} 的内容如何将 InputText 和 OutPutText 的值传递给 setProperty?

【问题讨论】:

    标签: java jsf jstl


    【解决方案1】:

    继承自遗留 JSP 的 ${} 无法对属性执行“设置”操作。它只能对属性进行“get”操作。

    如果你想在一个属性上同时支持“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() 方法。在这个特定的结构中是不必要的。另请注意,在此构造中,提交了 整个 表单。您可能希望将命令按钮放在表格之外,或者使用&lt;f:ajax&gt; 仅提交当前“行”。

    另见:


    与具体问题无关:您正在使用 getter 方法进行业务工作。如果在迭代组件中引用该属性,这将是非常低效的。改为在(后)构造函数中执行业务工作。它只会被调用一次。这样,您可以使 getter 真正成为一个完全值得的 getter。

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

    另见:

    【讨论】:

    • 我根据您粘贴的内容进行了转换。甚至我遵循的书籍/教程也说使用 # 而不是在属性方法中提及 set 或 get 。但奇怪的是,这种方式并没有生成表格。 link 这也许是答案。因为我使用 HashMap 这就是为什么。我会试试&lt;f:ajax&gt;
    • 显然您使用的不是 JSF 2.x 和 JSTL 1.2,而是旧版本。我建议升级。 #{} 仅适用于 JSTL 1.2,不适用于 1.1 或更早版本。另请参阅上述答案和我们的 JSTL wiki 页面中有关 EL 差异的链接:stackoverflow.com/tags/jstl/info
    • 三天前我用 GlassFish 下载了最新的 NetBeans。我创建了一个教程示例应用程序,它显示了 #{} 在那里工作的时间,就像你提到的那样,我不必指定 get。但是我创建了这个新项目,而 #{} 现在不起作用。我什至尝试调用一个只返回一个字符串值的测试方法。我还尝试在&lt;ui:repeat&gt; 中显示返回的String[] 仍然无法让它们工作:(。通过查看我的GlassFishServer for JSTL 版本的清单来确认JSTL 为1.2。实现版本:1.2.1 和规范版本: 1.2
    • 有趣的观察 public String getRandomStuff () { return "Bad Times"; } 和 xhtml #{txeConfBean.randomStuff} 不起作用,但 #{txeConfBean.getRandomStuff()} 起作用并在网页上显示“糟糕的时间”。所以这证实了我使用 JSTL 1.2 但有些东西坏了
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 2017-08-14
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多