Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?_Jsf_Jsf 2_Datatable_Parameter Passing_Commandlink - Fatal编程技术网

Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?

Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?,jsf,jsf-2,datatable,parameter-passing,commandlink,Jsf,Jsf 2,Datatable,Parameter Passing,Commandlink,我正在JSF2应用程序中使用Primefaces。我有一个,我希望用户能够直接在单个行上执行各种操作,而不是选择行。为此,我在最后一列中有几个s 我的问题是:如何将行ID传递给由命令链接启动的操作,以便知道要对哪一行执行操作?我尝试使用: <p:dataTable value="#{bean.items}" var="item"> ... <p:column> <p:commandLink actionListener="#{bean

我正在JSF2应用程序中使用Primefaces。我有一个
,我希望用户能够直接在单个行上执行各种操作,而不是选择行。为此,我在最后一列中有几个
s

我的问题是:如何将行ID传递给由命令链接启动的操作,以便知道要对哪一行执行操作?我尝试使用

<p:dataTable value="#{bean.items}" var="item">
    ...
    <p:column>
        <p:commandLink actionListener="#{bean.insert}" value="insert">
            <f:attribute name="id" value="#{item.id}" />
        </p:commandLink>
    </p:column>
</p:dataTable>

...
但是它总是产生0-显然,当呈现属性时,行变量
f
不可用(当我使用固定值时,它工作)


有人有替代方案吗?

在JSF 1.2中,这是由
(在命令组件中)完成的。在JSF2.0中(准确地说是EL 2.2,感谢BalusC),可以这样做:
action=“${filterList.insert(f.id)}

至于原因,
特定于组件本身(在视图构建时填充),而不是迭代行(在视图渲染时填充)

有几种方法可以达到要求

  • 如果您的servletcontainer至少支持Servlet 3.0/EL 2.2,那么只需将其作为
    UICommand
    组件或
    AjaxBehavior
    标记的action/listener方法的参数传递即可

     <h:commandLink action="#{bean.insert(item.id)}" value="insert" />
    
    这只需要为表单提交请求保留数据模型。最好是通过
    @ViewScoped
    将bean放入视图范围

    您甚至可以传递整个项目对象:

     <h:commandLink action="#{bean.insert(item)}" value="insert" />
    
    在Servlet2.5容器上,如果您提供支持此功能的EL实现(如JBoss EL),也可以实现此功能


  • UICommand
    组件中使用。它添加一个请求参数

     <h:commandLink action="#{bean.insert}" value="insert">
         <f:param name="id" value="#{item.id}" />
     </h:commandLink>
    
    或者,如果您的bean的范围更广,或者您想要更细粒度的验证/转换,请在目标视图上使用,另请参见:

    结合

     private Long id; // +setter
    
    它仅通过属性
    id
    in-action方法可用。这只需要为表单提交请求保留数据模型。最好是通过
    @ViewScoped
    将bean放入视图范围


  • 将datatable值绑定到,然后将项目包装到datatable

     <h:dataTable value="#{bean.model}" var="item">
    
    这还要求为表单提交请求保留数据模型。最好是通过
    @ViewScoped
    将bean放入视图范围


  • 用于以编程方式计算当前的
    #{item}

     public void insert() {
         FacesContext context = FacesContext.getCurrentInstance();
         Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
         Long id = item.getId();
         // ...
     }
    

  • 选择哪种方式取决于功能需求以及其中一种方式是否能为其他目的提供更多优势。我个人会继续使用#1,或者,如果您也想支持servlet 2.5容器,可以使用#2。

    在我的查看页面中:

    <p:dataTable  ...>
    <p:column>
    <p:commandLink actionListener="#{inquirySOController.viewDetail}" 
                   process="@this" update=":mainform:dialog_content"
               oncomplete="dlg2.show()">
        <h:graphicImage library="images" name="view.png"/>
        <f:param name="trxNo" value="#{item.map['trxNo']}"/>
    </p:commandLink>
    </p:column>
    </p:dataTable>
    
    多亏了,实际上对我们传递参数起作用的唯一解决方案是

    <h:commandLink action="#{user.editAction}">
        <f:param name="myId" value="#{param.id}" />
    </h:commandLink>
    
    
    

    publicstringeditaction(){
    映射参数=
    FacesContext.getExternalContext().getRequestParameterMap();
    字符串idString=params.get(“myId”);
    long id=long.parseLong(idString);
    ...
    }
    

    从技术上讲,您不能直接传递到方法本身,而是传递到
    JSF请求参数映射

    这个特性不是JSF2.0(它本身可以在Servlet2.5容器中运行)特有的,而是EL 2.2(它是Servlet3.0的一部分)。+1,尽管我更喜欢使用#2(如果必须支持2.5的话)。谢谢你详尽的回答。不幸的是,我必须报告,1是过滤后的primefaces数据表中唯一有效的东西(这正是我需要它的场景)。所有其他的都只在未过滤的表中有效。不过,我认为这更多的是primefaces中的一个bug,而不是在你的回答中。bean请求或视图的作用域是吗?带“过滤“你的意思是像我一样?这些症状表明筛选操作只在客户端进行,而服务器端的模型没有维护。不确定这是否是故意的。你可以随时留下一个问题报告。你的帖子是我读过的最有用的帖子之一。我使用方法5是因为我被迫使用Servlet2.5。我现在的问题是,是否可以使用commandLink(如您的示例中)发送参数,但使用ajax?您遇到的问题与这里的问题不同。您希望为后续请求保留
    #{param}
    映射中的请求参数,而不是传递任意参数。您的问答包含在
     private Long id; // +setter
    
     <h:dataTable value="#{bean.model}" var="item">
    
     private transient DataModel<Item> model;
    
     public DataModel<Item> getModel() {
         if (model == null) {
             model = new ListDataModel<Item>(items);
         }
         return model;
     }
    
     public void insert() {
         Item item = model.getRowData();
         Long id = item.getId();
         // ...
     }
    
     public void insert() {
         FacesContext context = FacesContext.getCurrentInstance();
         Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
         Long id = item.getId();
         // ...
     }
    
    <p:dataTable  ...>
    <p:column>
    <p:commandLink actionListener="#{inquirySOController.viewDetail}" 
                   process="@this" update=":mainform:dialog_content"
               oncomplete="dlg2.show()">
        <h:graphicImage library="images" name="view.png"/>
        <f:param name="trxNo" value="#{item.map['trxNo']}"/>
    </p:commandLink>
    </p:column>
    </p:dataTable>
    
     public void viewDetail(ActionEvent e) {
    
        String trxNo = getFacesContext().getRequestParameterMap().get("trxNo");
    
        for (DTO item : list) {
            if (item.get("trxNo").toString().equals(trxNo)) {
                System.out.println(trxNo);
                setSelectedItem(item);
                break;
            }
        }
    }
    
    <h:commandLink action="#{user.editAction}">
        <f:param name="myId" value="#{param.id}" />
    </h:commandLink>
    
    public String editAction() {
    
      Map<String,String> params = 
                FacesContext.getExternalContext().getRequestParameterMap();
      String idString = params.get("myId");
      long id = Long.parseLong(idString);
      ...
    }