私は次のものを持っています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>
2 つのタブはどちらも同じインクルード、つまりuserList.xhtml
. この中に、テスト目的での値を確認するためuserList.xhtml
に を配置しました。h:outputText
ui:param
showOnlyActiveUsers
<h:outputText id="showOnlyActiveUsers" value="#{showOnlyActiveUsers}" />
この値は、タブの変更時にh:outputText
からtrue
に変更さfalse
れ、その逆も同様です。
UserListController
ビュー スコープ内にあるマネージド Beanは、 のバックボーンですuserList.xhtml
。これはビュー スコープ内にあるため、これら 2 つのタブすべてに対して 1 回インスタンス化されます。
PrimefacesUserDataModel
を拡張するクラスがあります。LazyDataModel
このクラスのインスタンスは にありますUserListController
。UserDataModel
のゲッターメソッドからのフィールドに値を設定しようとしていますh:inputHidden
:
<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>
私が望むのは、その現在の値を から取得し、ui:param
それuserList.xhtml
を何らかのイベントによってマネージド Bean に渡し、それを に設定することdatamodel
です。datamodel
また、ビュー スコープ内にあるため、マネージド Bean が作成されるときにインスタンス化されるのは 1 回だけであることも事実です。