如何在两个页面之间传递参数(来自p:commandLink with redirect = true和view scoped beans)?

时间:2014-09-11 22:21:14

标签: jsf primefaces jsf-2.2

我正在尝试将一个参数(来自数据表的用户id)从一个页面传递到我正在使用它的下一个(显示用户的详细信息)。问题是我无法得到它。我错过了什么?我究竟做错了什么?我使用的是PrimeFaces 5和JSF 2.2(也是Hibernate 4)。有没有办法让我可以使用参数@PostConstruct以便我可以立即加载用户的详细信息?

包含数据的第一页

<h:form id="manageUserForm" prependId="false">
    <p:growl id="messages" showDetail="true" life="20000"/>
    <p:dataTable id="usersTable" var="user" value="#{manageUsers.users}">
        <f:facet name="header">
            #{pvtmsg.registeredUsers}
        </f:facet>
        <p:column headerText="ID">
            <h:outputText value="#{user.id}" />
        </p:column>
        <p:column headerText="#{pvtmsg.username}">
            <h:outputText value="#{user.username}" />
        </p:column>
        <p:column headerText="#{pvtmsg.firstname}">
            <h:outputText value="#{user.firstname}" />
        </p:column>
        <p:column headerText="#{pvtmsg.lastname}">
            <h:outputText value="#{user.lastname}" />
        </p:column>
        <p:column headerText="#{pvtmsg.email}">
            <h:outputText value="#{user.email}" />
        </p:column>
        <p:column headerText="#{pvtmsg.status}">
            <h:outputText value="#{user.enabled ? pvtmsg.enabled : pvtmsg.disabled}" />
        </p:column>
        <p:column style="width:32px;text-align: center">
            <p:commandLink action="editUser.xhtml?faces-redirect=true">
                <f:setPropertyActionListener value="#{user.id}" target="#{manageUsers.selectedUser}" />
                <f:param name="userId" value="#{manageUsers.selectedUser}" />
            </p:commandLink>
        </p:column>
    </p:dataTable>
</h:form>

它的支持豆

package beans;

import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import models.User;
import utils.PropertyHelper;

@Named(value = "manageUsers")
@ViewScoped
public class ManageUsers implements Serializable {

    private static final long serialVersionUID = 954672295622776147L;
    private List<User> users = null;
    private String selectedUser = null;

    public ManageUsers() {
        try {
            PropertyHelper helper = new PropertyHelper();
            users = helper.getUsers();
        } catch (Exception ex) {
            Logger.getLogger(ManageUsers.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<User> getUsers() {
        return users;
    }

    public String getSelectedUser() {
        return selectedUser;
    }

    public void setSelectedUser(String selectedUser) {
        this.selectedUser = selectedUser;
    }

}

第二页

<f:metadata>
    <f:viewParam name="userId" value="#{editUserBean.userId}" />
</f:metadata>

<h:form id="editUserForm" prependId="false">
    <p:growl id="messages" showDetail="true" life="20000"/>
    <!--nothing yet-->
</h:form>

它的支持豆

package beans;

import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named(value = "editUserBean")
@ViewScoped
public class EditUserBean implements Serializable {

    private static final long serialVersionUID = 543216875622776147L;
    private String userId;

    public String getUserId() {
        return userId;
    }

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

3 个答案:

答案 0 :(得分:1)

所以我在http://www.oracle.com/technetwork/articles/java/jsf22-1377252.html找到了我的解决方案,过了一段时间,我在这里需要的最后一篇文章http://www.coderanch.com/t/625319/JSF/java/working-viewParam

答案 1 :(得分:0)

你的commandLink在这里没有意义。通常,当您想使用commandLink进行导航时,应该在辅助bean中进行重定向。

如果你想使用结果进行导航,那么这样的事情对你有用:

<h:link outcome="editUser.xhtml">
  <f:param name="userId" value="#{user.id}" />
</h:link>

答案 2 :(得分:0)

在@PostConstruct方法调用期间,您的f:viewParams将不可用。您应该分配一个f:viewAction,因为您正在使用JSF 2.2来处理GET参数的业务处理。

<f:metadata>
    <f:viewParam name="userId" value="#{editUserBean.userId}" />
    <f:viewAction action="#{editUserBean.processUserId}"/>
</f:metadata>

另见:

  1. Read this if using JSF older than 2.2

  2. JSF bean: call @PostConstruct function after ViewParam is set