アップデート:
Any@ViewScoped
および@SessionScoped
Bean のライフサイクルは、予期されるものではありません。つまり、必要以上に早く終了しています。たとえば、メソッドが void を返す場所で ajax ポストバックが行われた場合、@ViewScoped
または@SessionScoped
Bean は終了する必要がありますが、終了します。
それを私たちの開発環境にデプロイし、他の人がそれをテストした後、それは私のマシンでローカルに実行されたときにのみ発生するようです. 理由はわかりません。tc Server 3.1 が使用されています。
誰かが同様の問題に遭遇した場合に備えて、オリジナルを残しています。
オリジナル:
XML ファイルからデータを読み取り、それに対応する TreeNode オブジェクトを作成する ViewScoped によって生成されるツリーがあります。パフォーマンスはそれほど高速ではないため、ビューで一度作成するのが理想的です。(一部のコードは以下で省略されていますが、機能は動作します)
@ManagedBean
@ViewScoped
public class FundsXmlTreeBuilder implements Serializable {
private TreeNode root;
public FundsXmlTreeBuilder() throws SAXException, IOException, ParserConfigurationException {
root = new DefaultTreeNode("Root", null);
buildTree();
}
public void buildTree() throws SAXException, IOException, ParserConfigurationException {
//reads xml file and adds TreeNodes
}
}
onNodeSelect メソッドで選択されているツリー ノードの ajax イベントを処理するメソッドを持つ別の RequestScoped Bean があります。基本的に、ページの別の部分がどのように表示されるかを決定します。
@ManagedBean
@RequestScoped
public class FundsXmlDisplay implements Serializable{
private Fund fund;
private FundFamily fundFamily;
private FocusedPortfolioModel model;
public TreeNode selectedRoot;
public FundsXmlDisplay() {
fund = null;
fundFamily = null;
model = null;
selectedRoot = null;
}
public void onNodeSelect(NodeSelectEvent event) {
Object data = event.getTreeNode().getData();
fund = null;
fundFamily = null;
model = null;
if (data instanceof Fund) {
fund = (Fund) data;
} else if (data instanceof FundFamily) {
fundFamily = (FundFamily) data;
} else if (data instanceof FocusedPortfolioModel) {
model = (FocusedPortfolioModel) data;
model.createPieModel();
}
}
}
マークアップの主要部分は次のとおりです。
<h:body>
<h:form styleClass="form" id="form1">
*** For Home Office Use Only
<br />
<p:layout id="xmlArea"
style="min-width:400px;min-height:600px;width:95%;">
<p:layoutUnit id="xmlTree" position="west" resizable="false"
closable="false" scrollable="true" size="25%" minSize="40"
maxSize="400" style="padding:.25em;" header="Funds XML Elements">
<p:tree value="#{fundsXmlTreeBuilder.root}" var="node"
dynamic="false" selectionMode="single">
<p:ajax event="select" update=":form1:xmlDisplay"
listener="#{fundsXmlDisplay.onNodeSelect}" />
<p:treeNode>
<h:outputText value="#{node}" style="font-size:small" />
</p:treeNode>
</p:tree>
</p:layoutUnit>
<p:layoutUnit position="center" header="Element Detail" size="75%">
<p:scrollPanel id="xmlDisplay" mode="native"
style="height:100%;">
...
</p:scrollPanel>
</p:layoutUnit>
</p:layout>
</h:form>
</h:body>
私が抱えている問題は、ajax イベントが発生した後、リスナーの前に FundsXmlTreeBuilder が再作成されることです。私が理解していることから、ビューは変更されていないため、まったく再作成されないと予想されます。
xmlDisplay 領域にはかなりの数のレンダリングされた属性があります。それが関連しているかどうかはわかりません。アクション メソッドが null または void を返したときにビューが有効であることは理解していますが、使用されているレンダリングされたメソッドは「アクション メソッド」としてカウントされないと思います。
また興味深いのは、FundsXmlTreebuilder を SessionScoped に変更すると、ノードを選択した後にも再作成されることです。
すべてが明確で、十分な情報が提供されることを願っています。ありがとう!