【问题标题】:Getting ui:param value in Managed bean在托管 bean 中获取 ui:param 值
【发布时间】:2013-02-16 23:38:53
【问题描述】:

我有以下p:tabView

<p:tabView id="tabView" dynamic="true" cache="false" activeIndex="#{navigationController.activeTabIndex}"
    onTabChange="tabChangeCommand([{name:'index', value:index}])">
    <p:tab title="#{adbBundle['nav.manageUser']}" id="manageUserTab">
        <h:panelGroup layout="block">
            <h:form id="manageUserListForm">
                <ui:include src="/WEB-INF/includes/userList.xhtml">
                    <ui:param name="showOnlyActiveUsers" value="#{true}" />
                </ui:include>
            </h:form>
        </h:panelGroup>
    </p:tab>
    <p:tab title="#{adbBundle['nav.manageRole']}" id="manageRoleTab">
        <h:panelGroup layout="block">
            <h:form id="manageRoleListForm">
                <ui:include src="/WEB-INF/includes/userList.xhtml">
                    <ui:param name="manageRole" value="manageRole" />
                    <ui:param name="showOnlyActiveUsers" value="#{false}" />
                </ui:include>
            </h:form>
        </h:panelGroup>
    </p:tab>
</p:tabView>

这两个选项卡都具有相同的包含,即userList.xhtml。在这个userList.xhtml 里面我放置了一个h:outputText 来查看ui:param 的值showOnlyActiveUsers 用于测试目的:

<h:outputText id="showOnlyActiveUsers" value="#{showOnlyActiveUsers}" />

h:outputText 的值在标签更改时从true 更改为false,反之亦然。

视图范围内的托管 bean UserListControlleruserList.xhtml 的主干。由于它在视图范围内,因此它会为所有这两个选项卡实例化一次。

我有一个类 UserDataModel,它扩展了 Primefaces 的 LazyDataModel。此类的一个实例存在于UserListController 中。我正在尝试从h:inputHidden 的getter 方法为UserDataModel 的字段设置一个值:

<h:inputHidden value="#{userListController.showActiveOnly}" />

userList.xhtml 中来自UserListController 为:

public String getShowActiveOnly() {
    ValueExpression expression = getFacesContext().getApplication().getExpressionFactory().createValueExpression(getFaceletContext(), "#{showOnlyActiveUsers}", Boolean.class);
    userDataModel.setShowOnlyActiveUsers(expression.getValue(getFaceletContext());
    return "";
}

但是expression.getValue(getFaceletContext() 生成的值始终是false。我想知道为什么h:outputText 中的值从true 变为false,但ValueExpression 生成的值始终是false

我该如何解决这个问题。任何指针都会对我很有帮助。

编辑

protected final FaceletContext getFaceletContext() {
    return (FaceletContext) getFacesContext().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
}

我想要实现的是将 ui:param 值传递给托管 bean,然后从那里传递给数据模型。

编辑

userList.xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:pe="http://primefaces.org/ui/extensions">

    <h:form id="userListForm">
        <p:panel id="userListPanel" header="#{adbBundle['userList.panel.header']}" toggleable="true">
            <p:dataTable var="user" id="userTable" value="#{userListController.userDataModel}" lazy="true" paginator="true" rows="10"
                paginatorPosition="bottom"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="10,50,100" widgetVar="userDataTable" styleClass="userTable" selectionMode="single">

                <f:facet name="header">
                    <p:outputPanel>
                        <h:panelGroup layout="block" id="resetFiter" styleClass="dataTableResetFilter">
                            <p:outputLabel value="#{adbBundle['filter.resetText']}" />
                            <p:spacer width="10" />
                            <p:commandButton icon="ui-icon-circle-close" actionListener="#{userListController.resetUserTable}"/>
                        </h:panelGroup>
                    </p:outputPanel>
                </f:facet>

                <p:column id="nameColumn" headerText="#{adbBundle['name']}" sortBy="#{user.fullName}" filterBy="#{user.fullName}" styleClass="name">
                    <h:outputText value="#{user.fullName}" />
                </p:column>

                <p:column id="statusColumn" headerText="#{adbBundle['status']}" sortBy="#{user.active}" styleClass="center status" filterBy="#{user.statusText}"
                    filterMatchMode="exact" filterOptions="#{userListController.statusOptions}">
                    <h:outputText value="#{user.statusText}" />
                </p:column>

                <p:column id="manageRoleColumn" headerText="#{adbBundle['role']}" sortBy="#{user.role}" styleClass="center manageRole" filterBy="#{user.role}"
                    filterOptions="#{userListController.roleOptions}" rendered="#{manageRole != null and manageRole != ''}">
                    <h:panelGroup layout="block">
                        <p:selectOneRadio id="roleRadio" value="#{user.role}" styleClass="roleRadio">
                            <f:selectItem itemValue="user" itemLabel="User" />
                            <f:selectItem itemValue="manager" itemLabel="Manager" />

                            <p:ajax listener="#{userListController.changeRole}" />
                            <f:attribute name="user" value="#{user}" />
                        </p:selectOneRadio>
                    </h:panelGroup>
                </p:column>
            </p:dataTable>
        </p:panel>

    </h:form>
</ui:composition>

我想要的是从userList.xhtml 中获取ui:param 的当前值,并通过某个事件将其传递给托管bean 并将其设置为datamodel。同样,datamodel 在创建托管 bean 时仅实例化一次,因为它在视图范围内。

【问题讨论】:

    标签: java jsf jsf-2 facelets


    【解决方案1】:

    你可以使用这样的东西来显示活跃用户,

    <h:form id="userListForm">
        <p:panel id="userListPanel" header="#{adbBundle['userList.panel.header']}" toggleable="true">
            <p:dataTable var="user" id="userTable" value="#{userListController.userDataModel}" lazy="true" paginator="true" rows="10"
                paginatorPosition="bottom"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="10,50,100" widgetVar="userDataTable" styleClass="userTable" selectionMode="single">
    
                <f:facet name="header">
                    <p:outputPanel>
                        <h:panelGroup layout="block" id="resetFiter" styleClass="dataTableResetFilter">
                            <p:outputLabel value="#{adbBundle['filter.resetText']}" />
                            <p:spacer width="10" />
                            <p:commandButton icon="ui-icon-circle-close" actionListener="#{userListController.resetUserTable}"/>
                        </h:panelGroup>
                    </p:outputPanel>
                </f:facet>
                <ui:fragment rendered="#{showOnlyActiveUsers and user.active}">
                <p:column id="nameColumn" headerText="#{adbBundle['name']}" sortBy="#{user.fullName}" filterBy="#{user.fullName}" styleClass="name">
                    <h:outputText value="#{user.fullName}" />
                </p:column>
    
                <p:column id="statusColumn" headerText="#{adbBundle['status']}" sortBy="#{user.active}" styleClass="center status" filterBy="#{user.statusText}"
                    filterMatchMode="exact" filterOptions="#{userListController.statusOptions}">
                    <h:outputText value="#{user.statusText}" />
                </p:column>
    
                <p:column id="manageRoleColumn" headerText="#{adbBundle['role']}" sortBy="#{user.role}" styleClass="center manageRole" filterBy="#{user.role}"
                    filterOptions="#{userListController.roleOptions}" rendered="#{manageRole != null and manageRole != ''}">
                    <h:panelGroup layout="block">
                        <p:selectOneRadio id="roleRadio" value="#{user.role}" styleClass="roleRadio">
                            <f:selectItem itemValue="user" itemLabel="User" />
                            <f:selectItem itemValue="manager" itemLabel="Manager" />
    
                            <p:ajax listener="#{userListController.changeRole}" />
                            <f:attribute name="user" value="#{user}" />
                        </p:selectOneRadio>
                    </h:panelGroup>
                </p:column>
                 </ui:fragment>   
            </p:dataTable>
        </p:panel>
    
    </h:form>
    

    你也可以使用这种格式的布尔表达式

    <ui:param name="showOnlyActiveUsers" value="false" />
    

    其他解决方案可能是将用户列表传递给您的 ui,包括。保留两个方法 'userListController.userList' 和 'userListController.activeUserList' 并将其作为 ui:param 传递给您的 usersList.xhtml

    【讨论】:

    • 感谢您帮助我。但我的问题不在于某些条件渲染。 userList.xhtml 有一个p:dataTable,其值为UserDataModelUserDataModel 扩展 LazyDataModel。现在从这个模型类的load 方法中,我正在获取用户列表。我只需要在第一个选项卡中显示活动用户,在第二个选项卡中显示所有用户,包括活动和非活动用户。托管 bean 在视图范围内,因此它的一个实例(以及模型)可用于两个选项卡。我的目标是通过某些事件或任何其他方式为该模型设置 showOnlyActiveUsers 值。
    • 你为什么要改变你的托管bean,保持你的托管bean与用户列表相同,并保持usersList.xhtml中的逻辑在不同的选项卡中显示或隐藏活动用户,你可以通过使用“showOnlyActiveUsers 和 user.active”,其中一个选项卡的 showOnlyActiveUsers 将为 true,其他选项卡为 false。
    • 其他解决方案可能是将用户列表传递给您的 ui,包括。保留两个方法 'userListController.userList' 和 'userListController.activeUserList' 并将其作为 ui:param 传递给您的 usersList.xhtml跨度>
    • 非常感谢。你的最后一条评论救了我。为什么我没有这样想!您能否添加与上一条评论相同的另一个答案,以便我接受。
    • 是的,你真的帮了我。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2015-10-24
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多