- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是我的 ViewScoped
之一bean 在同一 View 中创建了多次。 ViewScopedBean
的构造函数每次我在树中选择一个节点时都会创建。
<h:form>
<p:tree value="#{treeBean.root}" var="node"
selectionMode="single" selection="#{viewScopedBean.selectedNode}">
<p:ajax event="select" update="selectedNode, treeBeanUpdate, otherBeanUpdate, panel" listener="#{treeBean.onNodeSelect}" />
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
Selected Node: <h:outputText value="#{viewScopedBean.selectedNode}" id="selectedNode"/><br/>
Current TreeBean: <h:outputText value="#{treeBean}" id="treeBeanUpdate"/><br/>
Current OtherBean: <h:outputText value="#{viewScopedBean}" id="otherBeanUpdate"/><br/>
<p:outputPanel id="panel">
<ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
</p:outputPanel>
</h:form>
如果我删除这部分(引用复合组件), ViewScopedBean
的构造函数没有被调用:
<p:outputPanel id="panel">
<ag:profileComponent managedBean="#{viewScopedBean.profileBean}"/>
</p:outputPanel>
所有使用的bean都设置为@ViewScoped
.
@ManagedBean
@ViewScoped
public class ViewScopedBean implements Serializable {
private TreeNode selectedNode;
private ProfileBean profileBean;
public ViewScopedBean() {
System.out.println("Constructor of ViewScopedBean " + this);
}
@PostConstruct
public void init() {
System.out.println("ViewScoped init" + this);
profileBean = new ProfileBean();
}
}
这是正确的行为吗?如果不是的话是什么原因造成的?
更新:我尝试使用空复合 Material ,但遇到了同样的问题。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="managedBean" required="true"/>
</composite:interface>
<composite:implementation>
</composite:implementation>
</html>
但是如果我做了managedBean
不需要,没关系。
我不明白的另一件事是,当调用构造函数时,似乎没有使用创建的对象。
启动 View (控制台输出):
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4e1d2b8e
在树上点击 2 次:
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@4eb64f2e
Constructor of ViewScopedBean xxx.bean.ViewScopedBean@66863941
然后我打开调试窗口<ui:debug/>
,viewScopedBean
设置为xxx.bean.ViewScopedBean@4e1d2b8e
最佳答案
当您使用像 <c:if>
这样的 JSTL 标签时, View 作用域 bean 将在来自/到同一 View 的每个请求上重新创建。 , <c:forEach>
在 View 中等等,或者当您使用 binding
将 JSF 组件绑定(bind)为 View 作用域 bean 的属性时属性。这显然就是复合组件中发生的情况。
您需要重写复合组件,使其不使用任何 JSTL 标记。也可以通过多种方式避免将某些 JSF 组件绑定(bind)为 bean 的属性,但如果这确实无法避免,则在 web.xml
中禁用部分状态保存。在大多数情况下应该有效:
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
如果这对您不起作用,那么您确实必须与我们分享您的复合组件实现代码,以便我们可以指出注意事项并提出正确的方法。
关于JSF 2.0 ViewScoped 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914662/
我们正在将我们的项目迁移到针对 JBoss Wildfly 的 Java EE 7。 我们有几十个 @ManagedBean @javax.faces.bean.ViewScoped (旧的非 CDI
引自此 nice article , The new view scope should solve exactly those issues. A @ViewScoped bean will liv
我已经使用 JSF 很多年了,在下一个项目中,我们的目标是使 Web 层尽可能无状态。我正在探索的一种可能性是删除 @ViewScoped bean 类支持@RequestScoped (根据需要加上
这个问题在这里已经有了答案: JSF 2.1 ViewScopedBean @PreDestroy method is not called (2 个回答) 2年前关闭。 我有一个 @ViewScop
我有一个按钮,点击那个按钮我有客户端代码来设置 viewScope 值: var val = 'TEST_VALUE'; "#{javascript: viewScope.testVal =
我正在使用 JSF 构建一个单页应用程序,如下所示: 左侧的菜单是动态生成的,单击其中一个子菜单会创建一个选项卡,我在其中显示 中的内容。 . 菜单和选项卡代码:
在应用程序中,我需要知道 viewScope 变量是否已初始化。创建 viewScope 变量时,该值可能为 null。所以 viewScope.isEmpty("SomeName") 并没有告诉我它
我有一个按钮,点击那个按钮我有客户端代码来设置 viewScope 值: var val = 'TEST_VALUE'; "#{javascript: viewScope.testVal =
我正在使用带有多个和 fileUploadListener 方法的 primefaces fileUpload。每次上传的每个文件都会调用监听器,我想将每个文件存储在 arrayList 中,并在上传
如果我们没有相关页面所需的信息,我在从 View 作用域 bean 进行重定向时遇到问题。 @PostContruct 中的日志条目在与尝试呈现自身而不是遵循我的重定向的 View 相关的 NPE 之
此代码总是抛出 ViewExpiredException @ManagedBean(name = "test") @ViewScoped public class test implements Se
我要将一个参数从一个页面 (Facelet) 传递到范围为 View 范围的托管 Bean。 我试着这样做: import javax.faces.bean.ManagedBean; import j
我正在使用 JSF 2.0 和 Primefaces 3.4.2,我有一个使用延迟加载填充的数据表。 当我查看 managedbean 的范围时,数据表 selectedRow 给出空指针异常。如果我
使用下面的代码,我在 selectOneRadio 上使用监听器重定向到 url 中包含查询字符串的页面。 问题是,当我被重定向时,newsTitle 和 selectedNews 的值为空。为什么是
我已经看到有关调用 bean 构造函数和 ViewScope 的其他问题,但我仍然遇到困难。我看到的问题涉及我的应用程序中的两个特定页面。第一个是数据表(现在它填充了随机生成的数据,但最终会调用数据库
我想知道在两个 ViewScoped bean 之间传递数据(对象)的最佳实践是什么。 由于出色解释的问题,它们需要在 View 范围内here (简而言之:在这两个 View 中,我都在 h:dat
我的 h:commandButton "Login"有问题:当我使用 @ViewScoped 并按下此按钮时,会出现 ViewExpiredException,但是当我使用 @SessionScope
这个问题在这里已经有了答案: @ViewScoped calls @PostConstruct on every postback request (1 个回答) 5年前关闭。 我在 JSF 2.2.
在 Spring 3 和 JSF 2.0 中,当我们想要使用 JSF View 范围时,我们必须引入自定义 ViewScope 实现并指示 Spring 通过 CustomScopeConfigure
我在 jsf facelet 上有一个日历、编辑器、fileUpload 和一个 dataTable primefaces 控件。 代码如下, #{lbl.SSTitle}
我是一名优秀的程序员,十分优秀!