【问题标题】:jsf 2.x use a similar <c:set> behavior inside a <h:datatable>jsf 2.x 在 <h:datatable> 中使用类似的 <c:set> 行为
【发布时间】:2013-09-04 16:46:57
【问题描述】:

我正在尝试 jsf 2.x 并且我需要其中的 行为。这是我的代码,

<h:column id="passCol">
    <f:facet id="passFct" name="header">Password</f:facet>
    <h:inputText value="#{tech.password}" rendered="#{(tech.id).trim() == (technicianBean.technicianId).trim()}"/>
    <h:outputText value="#{tech.password}" rendered="#{(tech.id).trim() != (technicianBean.technicianId).trim()}"/>
</h:column>

我伪装的应该如下,

<h:column id="passCol">
    <f:facet id="passFct" name="header">Password</f:facet>
            <c:set property="inputField" target="#{myBean}" value="#{tech.password}" />
    <h:inputText value="#{myBean.inputField}" rendered="#{(tech.id).trim() == (technicianBean.technicianId).trim()}"/>
    <h:outputText value="#{tech.password}" rendered="#{(tech.id).trim() != (technicianBean.technicianId).trim()}"/>
</h:column>

正在技术数据表中的 var 设置。通过这种方式,我可以将 tech.password 捕获到我的输入字段中,让我可以使用它(例如:更新)。

我怎样才能实现这种行为?

谢谢。

【问题讨论】:

  • 直接在h:inputText 中设置#{tech.password} 有什么问题?
  • #{tech.password} 不是 bean 的字段,所以我无法处理它。这是我想捕捉到 myBean.inputField 的值,是的,让我在 myBean 中处理。
  • 等一下,#{tech.password} 是我想你的 POJO 实体之一的字段?如果您在发送时在表单中显示您的数据表,那么 POJO 应该获取您在 inputText...中指定的值...
  • 是的,就是这样,问题是如何使用 h:inputText 将此值传递给我的 bean?
  • 你误解了这个概念。看看我的回答。

标签: jsf-2 datatable


【解决方案1】:

JSF 已经拥有它正在迭代的元素集合的引用。所以有这种情况:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">

<h:head />
<h:body>

    <h:form>
        <h:dataTable value="#{bean.itemsList}" var="item">

            <h:column>
                <h:inputText value="#{item.value}" />
            </h:column>

        </h:dataTable>

        <h:commandButton action="#{bean.update}" value="submit" />
    </h:form>


</h:body>

即使#{item.value} 也不是直接引用托管bean,它是一个输入组件,所以JSF 知道在哪里写入它的值。如果您将它与此托管 bean 一起使用,您会在单击“提交”时注意到表引用的值列表正在更新。实际上,当您单击按钮时,此代码将打印出列表的更新值。

@ManagedBean
@ViewScoped
public class Bean {

    public class Item {

        private String value;

        public Item(String val) {
            value = val;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Item [value=" + value + "]";
        }

    }

    private List<Item> itemsList = Arrays.asList(new Item("value1"), new Item(
            "value2"));

    public List<Item> getItemsList() {
        return itemsList;
    }

    public void update() {
        System.out.println(itemsList);
    }

}

【讨论】:

  • 非常感谢 Xtreme Biker,我正在考虑类似您的答案,但正如您所做的那样是比我更好的解决方案。
  • 很高兴看到它对您有所帮助!请记住,您可以单击答案左侧的复选标记 (✓) 将答案标记为正确。 ;-)
猜你喜欢
  • 2014-01-03
  • 2023-03-13
  • 2013-04-23
  • 2010-11-12
  • 2012-06-24
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多