gpt4 book ai didi

java - 获取用户界面 :param value in Managed bean

转载 作者:行者123 更新时间:2023-12-02 07:14:05 25 4
gpt4 key购买 nike

我有以下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,反之亦然。

View 范围内的托管 bean UserListControlleruserList.xhtml 的支柱。由于它位于 View 范围内,因此它会为所有这两个选项卡实例化一次。

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

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

位于 UserListControlleruserList.xhtml 中,如下:

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,并将其设置为数据模型。同样,当托管 bean 在 View 范围内创建时,datamodel 仅实例化一次。

最佳答案

您可以使用类似的方法来显示活跃用户,

<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>

您也可以使用这种格式的 boolean 表达式

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

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

关于java - 获取用户界面 :param value in Managed bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15175201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com