Jsf 如何将所选行传递给dataTable或ui内的commandLink:repeat?
我正在JSF2应用程序中使用Primefaces。我有一个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
,我希望用户能够直接在单个行上执行各种操作,而不是选择行。为此,我在最后一列中有几个
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)}
至于原因,
特定于组件本身(在视图构建时填充),而不是迭代行(在视图渲染时填充)
有几种方法可以达到要求
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放入视图范围
<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();
// ...
}
<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);
...
}