Jsf 如何正确地参数化a4j:commandLink?

Jsf 如何正确地参数化a4j:commandLink?,jsf,richfaces,el,Jsf,Richfaces,El,我有以下问题:我需要从“列表页面”重定向到详细信息页面,但我需要列表中的id。本例中的“record”是rich:dataTable的var属性。首先我想到的是: <a4j:commandLink id="detailsLink" value="show details" execute="@this" action="/customerDetails?faces-redirect=true&amp;cusid=#{record.id}" /> 但我不认为这是发送和接收具有

我有以下问题:我需要从“列表页面”重定向到详细信息页面,但我需要列表中的id。本例中的“record”是rich:dataTable的var属性。首先我想到的是:

<a4j:commandLink id="detailsLink" value="show details" execute="@this" action="/customerDetails?faces-redirect=true&amp;cusid=#{record.id}" />
但我不认为这是发送和接收具有丰富面孔的参数的常用方法。是否有更好的解决方案?

当您需要正常的GET请求时,
会发送一个ajax POST请求。改用

<h:link value="show details" outcome="/customerDetails?cusid=120" />

以下是最好的方法。提供的示例传递2个参数。你可以有不止一个。只需使用assignTo属性和value属性。希望这能回答你的问题

<a4j:commandLink action="#{myBackingBean.myAction}">
    <a4j:param name="jobIdParam" value="#{job.jobNumber}"
        assignTo="#{myBackingBean.jobId}" />
    <a4j:param name="isDisplayedParam" value="true"
        assignTo="#{myBackingBean.displayed}"/>
</a4j:commandLink>


基本上,即使使用EL表达式作为参数,这似乎也能起作用,但存在一些奇怪的行为。在CustomerDetail上,我尝试使用f:metadata属性获取参数,如上所述。当它在单击该链接时第一次重定向到详细信息页面时,元数据属性方法将不会执行。当我切换回列表页面并再次尝试时,它突然起作用。我不知道这有什么问题。听起来像是缓存问题。清理浏览器缓存并重新启动服务器。我认为这与另一个问题有关。但无论如何,这超出了我的问题范围。可以肯定的是,您没有添加
faces redirect=true
,对吗?这在普通的GET请求中是不必要的。顺便说一句,如果参数是包含用户控制的数据的字符串而不是整数,那么应该使用
,以便对其进行XML转义(以防止潜在的XSS攻击)。另见
<a4j:commandLink id="detailsLink" value="show details" execute="@this" action="/customerDetails?faces-redirect=true&amp;cusid=120" />
public String editCustomer(long customerId)
{

    edit(customerId);
    return "/customerDetails?faces-redirect=true";
}
<h:link value="show details" outcome="/customerDetails?cusid=120" />
<a4j:commandLink action="#{myBackingBean.myAction}">
    <a4j:param name="jobIdParam" value="#{job.jobNumber}"
        assignTo="#{myBackingBean.jobId}" />
    <a4j:param name="isDisplayedParam" value="true"
        assignTo="#{myBackingBean.displayed}"/>
</a4j:commandLink>