マイページには、ui:include経由でインクルードするログインヘッダーが含まれています。インクルードされたページには、p:commandButtonを持つダイアログが含まれています。ユーザーがログインすると、インクルード・ページは、更新属性の@formに従って適切にリフレッシュされます。私はまた、ユーザがログインしているときにボタンを表示する、インクルードされたページの外側のコンポーネントを更新したいと思う。インクルードページがリフレッシュされ、ログインしたユーザの名前が表示される。しかし、メインページのボタンは表示されません。私はページをリフレッシュすると表示されます。私はここで間違っていることを理解できません。誰でも何か考えがあります。JSFコンポーネントがp:commandButtonからレンダリングされません。
ヘッダーページにはcommandLinkコンポーネントも正しく表示されます。しかし、ログアウトリンクをクリックすると、メインページのボタンは削除されません。 commandLinkはajaxを使用しないので、通常のページPOSTが行われたと仮定します。ページ全体を再読み込みする必要があります。これはui:includeで参照されているページからは機能しませんか?
ログインページでは、セッションスコープのバッキングBeanが使用されています。メインページはビュースコープです。
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<div style="width:100%;font-size:12px;line-height:20px;background-color:#b0d9e6;color:white">
<h:form>
<h:message id="top_msg"></h:message>
<h:panelGrid width="100%" columns="3" columnClasses="none,right1,right1">
<h:outputLink rendered="#{!loginController.loggedIn}" styleClass="text-align:right;" value="javascript:void(0)" onclick="PF('dlg').show();" title="login">
<p:outputLabel>Login</p:outputLabel>
</h:outputLink>
<h:commandLink rendered="#{loginController.loggedIn}" action="#{loginController.logout}" styleClass="text-align:right;" >
<h:outputLabel>Logout</h:outputLabel>
</h:commandLink>
<p:growl id="growl" sticky="true" showDetail="true" life="3000" />
<p:dialog header="Login" widgetVar="dlg" resizable="false">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText id="username" value="#{loginController.username}" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.password}" required="true" label="password" />
<f:facet name="footer">
<p:commandButton value="Login"
update="@form :createform:createbutton"
actionListener="#{loginController.login}"
oncomplete="handleLoginRequest(xhr, status, args)" >
</p:commandButton>
</f:facet>
</h:panelGrid>
</p:dialog>
</h:panelGrid>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args)
</script>
</h:form>
</div>
</ui:composition>
...
この1は、以下のメインページに含まれている:あなたは非レンダリングコンポーネントを再描画することはできません
...
<ui:include src="login.xhtml" />
<h:form id="createform">
<h:panelGroup id="createbutton" layout="block">
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
</h:panelGroup>
</h:form>
こんにちはKevkodez。答えをありがとう。しかし、私はレンダリングされたコンポーネントを参照しています。 createbuttonというpanelGroupは常にレンダリングされます。それは他のものでなければならない。 – Pefero