Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?
我正在JSF2应用程序中使用Primefaces。我有一个选项,我希望用户能够直接在单个行上执行各种操作,而不是选择行。为此,我在最后一篇专栏文章中有几句话 我的问题是:如何将行ID传递给由命令链接启动的操作,以便知道要对哪一行执行操作?我试着使用一个: 但是它总是产生0-显然,当属性被渲染时,行变量f不可用。当我使用固定值时,行变量f有效Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?,jsf,jsf-2,datatable,parameter-passing,commandlink,Jsf,Jsf 2,Datatable,Parameter Passing,Commandlink,我正在JSF2应用程序中使用Primefaces。我有一个选项,我希望用户能够直接在单个行上执行各种操作,而不是选择行。为此,我在最后一篇专栏文章中有几句话 我的问题是:如何将行ID传递给由命令链接启动的操作,以便知道要对哪一行执行操作?我试着使用一个: 但是它总是产生0-显然,当属性被渲染时,行变量f不可用。当我使用固定值时,行变量f有效 任何人都有替代方案吗?在JSF 1.2中,这是由命令组件内部完成的。确切地说,在JSF 2.0 EL 2.2中,由于BalusC,可以这样做:action=
任何人都有替代方案吗?在JSF 1.2中,这是由命令组件内部完成的。确切地说,在JSF 2.0 EL 2.2中,由于BalusC,可以这样做:action=${filterList.insertf.id}至于原因,特定于在视图构建期间填充的组件本身,而不是在视图渲染期间填充的迭代行 有几种方法可以达到要求 如果您的servletcontainer至少支持Servlet3.0/EL2.2,那么只需将其作为UICommand组件的action/listener方法或AjaxBehavior标记的参数传递即可。例如
<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
它将仅通过action方法中的属性id可用。这只需要为表单提交请求保留数据模型。最好是通过@ViewScoped将bean放入视图范围
将datatable值绑定到,然后将项目包装到datatable
<h:dataTable value="#{bean.model}" var="item">
这还要求为表单提交请求保留数据模型。最好是通过@ViewScoped将bean放入视图范围
用于以编程方式计算当前{item}
选择哪种方式取决于功能需求以及其中一种方式是否为其他目的提供了更多优势。我个人会继续使用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>
与
从技术上讲,您不能直接传递给方法本身,而是传递给JSF请求参数映射。这个特性不是JSF 2.0特有的,它本身可以在Servlet 2.5容器中运行,而是EL 2.2特有的,它是Servlet 3.0.+1的一部分,不过如果必须支持2.5,我会选择2。谢谢您详尽的回答。不幸的是,我必须报告,1是在过滤的primefaces数据表中唯一起作用的东西,这正是我需要它的场景。所有其他人只在未过滤的桌子上工作。不过,我认为这更多的是primefaces中的一个bug,而不是您的答案中的bug。bean请求或视图的作用域是否已确定?您的意思是“过滤”中的?这些症状表明筛选操作只在客户端进行,而服务器端的模型没有维护。不确定这是否是故意的。你可以随时留下一个问题报告。你的帖子是我读过的最有用的帖子之一。我使用方法5是因为我被迫使用Servlet2.5。我现在的问题是,是否可以像您的示例中那样使用commandLink发送参数,但使用ajax?您遇到的问题与这里的问题不同。您希望为后续请求保留{param}map中的请求参数,而不是传递任意参数。您的问答包含在
<f:viewParam name="id" value="#{bean.id}" required="true" />
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
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);
...
}