【问题标题】:f:param does not work with p:commandLink or h:commandLink on query stringf:param 不适用于查询字符串上的 p:commandLink 或 h:commandLink
【发布时间】:2013-08-21 02:39:11
【问题描述】:

f:param 适用于 h:link,但不适用于 p:commandLinkh:commandLink

例如,我有两个页面test_first.xhtmltest_second.xhtml,以及一个支持java bean TestBean.java

我开始跑步test_first.xhtml

如果我点击link1,即h:link,页面将重定向到test_second.xhtml。在f:param的帮助下,浏览器的地址栏会显示.../test_second.xhtml?id=1。在该页面上,testBean.userId 被打印出来。

如果我点击link2link3,页面会重定向到test_second.xhtml。但是地址栏只显示.../test_second.xhtml,没有?id=#!并且testBean.userId 不会打印在该页面上。

如何使commandLinkf:param 一起工作?有时我希望链接不要重定向到另一个页面,而是根据数据调用 bean 的一些方法。

test_first.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
<h:form>
    <h:link value="link1" outcome="test_second" >
        <f:param name="id" value="1"/>
    </h:link>
    <br/><br/>
    <h:commandLink value="link2" action="test_second?faces-redirect=true" >
        <f:param name="id" value="2" />
    </h:commandLink>
    <br/><br/>
    <p:commandLink value="link3" action="test_second?faces-redirect=true">
        <f:param name="id" value="3" />
    </p:commandLink>
    <br/><br/>
</h:form>
</h:body>
</html>

test_second.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<f:metadata>
    <f:viewParam name="id" value="#{testBean.userId}" />
</f:metadata>
<h:head/>
<h:body>
<h:form>
    This is the second page.
    <h:outputText value="Selected id is #{testBean.userId}" />
    <h:commandButton value="Print page id" action="#{testBean.print()}" />
</h:form>
</h:body>
</html>

TestBean.java

@ManagedBean
@SessionScoped
public class TestBean implements Serializable{
    private Integer userId;

    public void print() {
        System.out.println(userId);
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }
}

【问题讨论】:

标签: jsf primefaces query-string


【解决方案1】:

您误解了这两个标签的含义,即&lt;h:link&gt;&lt;h:commandLink&gt;,因此,您也误解了两个标签中&lt;f:param&gt; 的含义。无论如何,在提出问题之前阅读文档以获得更多见解是值得的。

&lt;h:link&gt; 呈现 HTML “a” 锚元素。组件的值呈现为锚文本,组件的结果用于确定“href”属性中呈现的目标 URL。 任何子 UIParameter 组件都被附加到 String 以作为“href”属性的值作为查询参数输出在渲染之前......

&lt;h:commandLink&gt; 呈现一个 HTML "a" 锚元素,当被点击时,它就像一个表单提交按钮* ...如果 disabled 属性不存在,或者它的值为 false。它将“#”呈现为“href”属性的值,将组件的当前值呈现为链接文本(如果已指定),*将功能上等同于以下内容的 JavaScript 呈现为“onclick”属性的值:

document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';    
document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE'; 
document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE'; return false;
document.forms['CLIENT_ID'].submit()" 

其中hiddenFieldName 如上所述,CLIENT_ID 是 UICommand 组件的 clientId,PARAM_NAME 和 PARAM_VALUE 分别是任何嵌套 UIParameter 子项的名称和值。

换句话说,在&lt;h:link&gt; 内嵌套&lt;f:param&gt; 的标签最终将作为生成URL 的查询参数,而在&lt;h:commandLink&gt; 内嵌套&lt;f:param&gt; 的标签最终将作为具有给定值的请求参数。

虽然第一个很清楚,但第二个值得更好地阐述。要理解它的作用,请考虑如果我们从细节中抽象出来 &lt;h:commandLink&gt; 发送一个 POST 请求并附加所有嵌套的 &lt;f:param&gt; 标签作为请求参数。但如何处理它们取决于您自己,因为导航完全掌握在您手中

所以,第一个选项是设置一个硬编码的action 属性,哪个用例是可疑的,就像在action="second-page" 中一样,你没有通过任何查询参数。将要做的是发布到同一个视图并转发到第二个而不采取任何操作。相当愚蠢的动作。

第二个选项是指定一个动作方法,如action="#{bean.action}"。在这种情况下,您必须在提供的操作方法中处理导航,即从方法返回 null/void 以进行回发,或者将导航案例结果作为字符串返回以进行转发指定的视图。至于您使用&lt;f:param&gt; 传递的请求参数,它们将可以通过标准JSF 方式获得,例如在请求范围的bean 上的@ManagedProperty("#{param.name}"),或者在任何范围的bean 中调用ExternalContext#getRequestParameterMap(),例如,在动作方法中,如String param = externalContext.getRequestParameterMap().get("name")。因此,现在您有了参数 in action 方法,您可以随意使用,只需遵守 URL 存在的一组规则即可。

还有两件事值得一提。请记住,通过调用命令链接传递的请求参数将仅在同一请求中可用,因为您可能希望它能够在基本上触发另一个请求的faces-redirect=true 中生存。另一个选项是指定 includeviewparams=true 以传递当前视图的参数,如果需要的话,如另一个答案中所述。

【讨论】:

    【解决方案2】:

    您可以通过在操作属性处直接将参数与&amp; 连接来实现:

    <p:commandLink value="link3" action="test_second?faces-redirect=true&id=3"/>
    

    更新 1

    您也可以考虑添加&amp;includeViewParams=true。这样您的目标导航的视图参数将被自动包含在内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2012-01-10
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2016-02-25
      相关资源
      最近更新 更多