「userId」と「name」という 2 つの変数があります。たとえば、「SHOW USERID」ボタンをクリックすると、正常に機能し、「renderUserId = true」が設定され、「render」で表示されますが、他の「SHOW」ボタンをクリックすると、Bean が再構築され、失われます「renderUserId=true」と「false」と「renderName=true」になるので、OKと表示されますが、USERIDは隠されています。
私の質問は、xhtml をレンダリングするときに Bean の値が失われないようにするにはどうすればよいですか?
これは私のコードの簡単なシミュレーションです。
注:「h:commandButton」で「f:setPropertyActionListener」の代わりに「actionListener」を使用すると、同じ結果が得られ、Bean が再構築されます。
example.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface componentType="com.bean.ExampleBean">
<cc:attribute name="userId" type="java.lang.Integer"/>
<cc:attribute name="name" type="java.lang.String"/>
</cc:interface>
<cc:implementation>
<h:panelGrid id="example_panel" columns="1" width="100%">
<h:outputText value="USERID: #{cc.attrs.userId}" rendered="#{!cc.attrs.renderUserId}"/>
<a4j:commandButton value="SHOW USERID" render="example_panel"
rendered="#{!cc.attrs.renderUserId}">
<f:setPropertyActionListener value="#{true}"
target="#{cc.attrs.renderUserId}"/>
</a4j:commandButton>
<a4j:commandButton value="HIDE USERID" render="example_panel"
rendered="#{cc.attrs.renderUserId}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderUserId}"/>
</a4j:commandButton>
<h:outputText value="NAME: #{cc.attrs.name}" rendered="#{!cc.attrs.renderName}"/>
<a4j:commandButton value="SHOW NAME" render="example_panel"
rendered="#{!cc.attrs.renderName}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderName}"/>
</a4j:commandButton>
<a4j:commandButton value="HIDE NAME" render="example_panel"
rendered="#{cc.attrs.renderName}">
<f:setPropertyActionListener value="#{false}"
target="#{cc.attrs.renderName}"/>
</a4j:commandButton>
</h:panelGrid>
</cc:implementation>
</ui:composition>
ExampleBean.java
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;
@FacesComponent("com.bean.ExampleBean")
public class ExampleBean extends UINamingContainer {
private Integer userId;
private String name;
private boolean renderUserId;
private boolean renderName;
}