本地tc Server 3.1实例结束@ViewScoped和@SessionScoped bean
Local tc Server 3.1 instance ends @ViewScoped and @SessionScoped beans
更新:
任何 @ViewScoped
和 @SessionScoped
bean 的生命周期都不是预期的。也就是说,它们结束的比预期的要早。例如,当 ajax 回发完成时 returns void 方法 @ViewScoped
或 @SessionScoped
beans 都不应该结束,但它们确实会结束。
将其部署到我们的开发环境并由其他人对其进行测试后,它似乎只发生在我的机器上并且在本地 运行。不知道为什么。正在使用的是 tc Server 3.1。
我将离开原件,以防有人遇到类似的问题。
原文:
我有一个由 ViewScoped 填充的树,它从 XML 文件读取数据并为其创建 TreeNode 对象。性能不是很快,因此在视图中创建一次是理想的。 (下面省略了一些代码,但功能确实有效)
@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
}
}
还有另一个 RequestScoped bean,它有一个方法可以处理在 onNodeSelect 方法中选择树节点的 ajax 事件。它基本上决定了页面的另一部分将如何显示。
@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>
我遇到的问题是 FundsXmlTreeBuilder 是在 ajax 事件触发之后但在侦听器之前重新创建的。我希望它根本不会被重新创建,因为据我所知,视图没有改变。
xmlDisplay区域中有不少渲染属性。不确定这是否相关。我知道当操作方法 returns 为空或无效时,视图仍然存在,但我不认为使用的渲染方法算作 "action methods".
同样有趣的是,如果我将 FundsXmlTreebuilder 更改为 SessionScoped,它也会在选择一个节点后重新创建,这确实让我很困惑。
希望一切都清楚并提供足够的信息。谢谢!
在web.xml
中,需要注释掉<secure>
标签。所以相应的部分看起来像:
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
<!-- <secure>true</secure> --> <-- Not be set locally -->
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
此标记告诉浏览器仅在 HTTPS t运行smission 上发送 cookie,我认为 运行 在本地时不会出现这种情况。
这是我找到 the explanation 的地方。队友发现了修复。
更新:
任何 @ViewScoped
和 @SessionScoped
bean 的生命周期都不是预期的。也就是说,它们结束的比预期的要早。例如,当 ajax 回发完成时 returns void 方法 @ViewScoped
或 @SessionScoped
beans 都不应该结束,但它们确实会结束。
将其部署到我们的开发环境并由其他人对其进行测试后,它似乎只发生在我的机器上并且在本地 运行。不知道为什么。正在使用的是 tc Server 3.1。
我将离开原件,以防有人遇到类似的问题。
原文:
我有一个由 ViewScoped 填充的树,它从 XML 文件读取数据并为其创建 TreeNode 对象。性能不是很快,因此在视图中创建一次是理想的。 (下面省略了一些代码,但功能确实有效)
@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
}
}
还有另一个 RequestScoped bean,它有一个方法可以处理在 onNodeSelect 方法中选择树节点的 ajax 事件。它基本上决定了页面的另一部分将如何显示。
@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>
我遇到的问题是 FundsXmlTreeBuilder 是在 ajax 事件触发之后但在侦听器之前重新创建的。我希望它根本不会被重新创建,因为据我所知,视图没有改变。
xmlDisplay区域中有不少渲染属性。不确定这是否相关。我知道当操作方法 returns 为空或无效时,视图仍然存在,但我不认为使用的渲染方法算作 "action methods".
同样有趣的是,如果我将 FundsXmlTreebuilder 更改为 SessionScoped,它也会在选择一个节点后重新创建,这确实让我很困惑。
希望一切都清楚并提供足够的信息。谢谢!
在web.xml
中,需要注释掉<secure>
标签。所以相应的部分看起来像:
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
<!-- <secure>true</secure> --> <-- Not be set locally -->
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
此标记告诉浏览器仅在 HTTPS t运行smission 上发送 cookie,我认为 运行 在本地时不会出现这种情况。
这是我找到 the explanation 的地方。队友发现了修复。