f:param не передает параметр или параметр не устанавливается

Я использую h:link с includeViewParams=true перемещаться между списком и страницами просмотра и делать закладки страниц просмотра, но это не работает. Ниже приведена соответствующая часть моего кода:

в 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 и это сработало в обоих случаях.

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>

Таким образом, вы получите идентификатор элемента на странице назначения, но этого недостаточно для изменения URL-адреса в адресной строке. Для достижения этого добавить ?faces-redirect=true к вашему исходу, чтобы форсировать перенаправление.

Смотрите также:

Другие вопросы по тегам