【问题标题】:f:param does not pass parameter or the parameter does not get setf:param 未传递参数或未设置参数
【发布时间】:2014-02-15 12:42:24
【问题描述】:

我使用 h:linkincludeViewParams=true 在我的列表和查看页面之间导航,并使查看页面 URL 可收藏,但它不起作用。 以下是我的代码的相关部分:

在 layout.xhtml(我的模板)中:

<f:view locale="#{localeBean.lang}">
    <ui:insert name="metadata"/>

在 Articles.xhtml(我的列表页面)中:

<h:form>
    <p:datagrid var="item" value="articleController.items">
        <p:column>
            <h:link outcome="View_Articles?faces-redirect=true&amp;includeViewParams=true" styleClass="view-details">
               <h:outputText value="#{item.title}"/>     
               <f:param name="id" value="#{item.articleId}"/>
            </h:link>
        </p:column>
    </p:datagrid>
</h:form>

在 View_Article.xhtml(我的查看详情页面)中:

<ui:composition template="./WEB-INF/templates/layout.xhtml"> 
     <ui:define name="metadata">
         <f:metadata>
             <f:viewParam name="id" value="#{articleController.id}" />
             <f:viewParam name="id" value="#{articleLclController.id}"/>
         </f:metadata>
</ui:define>

更多信息: 我使用 JSF 2.2、ocpsoft 重写过滤器、primefaces 库,并且ArticleController.java 是会话范围的。

我尝试了以下方法:

1- 我用h:commandLink;有了这个,导航工作,但 URL 不包含视图参数

Articles.xhtml:

<h:commandLink id="viewArticleDetails" action="#{articleController.viewArticleByID()}" styleClass="view-details">
    <h:outputText value="View Details"/>
    <f:setPropertyActionListener target="#{articleController.id}" value="#{item.articleId}"/>
    <f:setPropertyActionListener target="#{articleLclController.id}" value="#{item.articleId}"/>
</h:commandLink>

ArticleController.java: ...

private Long id;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
    current = ejbFacade.find(id);
}

public String viewArticleByID(){                      
    return "View_Article?faces-redirect=true&amp;includeViewParams=true";
}

...

我希望 URL 是 http://localhost:8080/testApp/en/View_Article?id=1,但它就像 `http://localhost:8080/testApp/en/View_Article

2- 我插入了http://localhost:8080/testApp/en/View_Article?id=1,它在两种情况下都有效。

【问题讨论】:

    标签: jsf jsf-2.2 viewparams


    【解决方案1】:

    includeViewParams 参数仅适用于给定视图中已经存在的视图参数(在您的情况下,Articles.xhtml您没有任何参数强>)。只需将它们传递为f:param。当你想执行一个普通的 GET 请求时,你最好使用h:link

    <h:link outcome="View_Articles" styleClass="view-details">
       <h:outputText value="#{item.title}"/>     
       <f:param name="id" value="#{item.id}" />
    </h:link>
    

    这样您将在目标页面获得项目的 id,但不足以在地址栏中更改 url。要实现这一点,请在结果中添加 ?faces-redirect=true 以强制重定向。

    另请参阅:

    【讨论】:

    • 我将 Articles.xhtml 中的代码更改为 &lt;h:link outcome="View_Article?faces-redirect=true&amp;amp;includeViewParams=true" styleClass="view-details"&gt; &lt;h:outputText value="View Details"/&gt; &lt;f:param name="id" value="#{item.articleId}"/&gt; &lt;/h:link&gt;,但仍然无法正常工作。顺便说一句,我的 bean 是会话范围的。
    • 这种方式适用于视图范围。为什么要使用会话范围来处理视图细节?
    • 我更改了我的 bean 以查看范围并通过此搜索到现在,但它仍然无法正常工作。我认为的问题是f:param 没有将item.articleId 设置为id,因此它返回null。或者可能是f:viewParam 没有设置id,因为我注意到setId 从未被调用。
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多