Jsf 如何在两个页面之间传递参数(来自p:commandLink,redirect=true和view作用域bean)?

Jsf 如何在两个页面之间传递参数(来自p:commandLink,redirect=true和view作用域bean)?,jsf,primefaces,jsf-2.2,Jsf,Primefaces,Jsf 2.2,我试图将参数(数据表中的用户id)从一个页面传递到下一个使用它的页面(显示用户的详细信息)。问题是我拿不到它。我错过了什么?我做错了什么?我使用的是PrimeFaces5和JSF2.2(也是Hibernate4)。是否有任何方法可以使用参数@PostConstruct,以便立即加载用户的详细信息 包含数据表的第一页 <h:form id="manageUserForm" prependId="false"> <p:growl id="messages" showDeta

我试图将参数(数据表中的用户id)从一个页面传递到下一个使用它的页面(显示用户的详细信息)。问题是我拿不到它。我错过了什么?我做错了什么?我使用的是PrimeFaces5和JSF2.2(也是Hibernate4)。是否有任何方法可以使用参数
@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>

你的命令链接在这里没有意义。通常,当您想要使用commandLink导航时,应该在支持bean中执行重定向

如果您希望使用结果导航,那么类似的内容应该适合您:

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

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

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

另请参见:


  • 所以我在这里找到了我的解决方案,过了一段时间,我在这里需要的最后一块

    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;
        }
    }
    
    <h:link outcome="editUser.xhtml">
      <f:param name="userId" value="#{user.id}" />
    </h:link>
    
    <f:metadata>
        <f:viewParam name="userId" value="#{editUserBean.userId}" />
        <f:viewAction action="#{editUserBean.processUserId}"/>
    </f:metadata>