【问题标题】:JSF2.0 View Scope & RedirectJSF2.0 查看范围和重定向
【发布时间】:2011-02-25 21:56:00
【问题描述】:

JSF2.0 中的新 ViewScope 存在以下问题。

我有一个使用 @PostConstruct 方法注释为视图范围 bean 的类

@ManagedBean(name = "userListController")
@ViewScoped
public class UserListController {

    private String text = "myText";

    @PostConstruct
    public void init() {
       System.out.println("init") ;
    }
}

在主页 (/pages/main.xhtml) 上,有一个按钮可以导航到第二个页面 (/pages/user/list.xhtml),我在该页面中输出 UserListController bean 的属性“文本”。

按钮是:

<h:commandButton value="Manage Users" action="gotoUsers"/>

faces-config.xml 中的 Navigation 案例是:

<navigation-rule>
    <from-view-id>/pages/main.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>gotoUsers</from-outcome>
        <to-view-id>/pages/user/list.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

当我使用 Firefox/Chrome 点击按钮时,我看到 @ViewScoped bean 的 @PostConstruct 方法被调用了两次,而如果我使用 IE8,该方法只被调用了一次。

我看到了一个简单的相位跟踪器(在 FF/Chrome 示例中):

DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - AFTER - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - BEFORE - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - AFTER - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - BEFORE - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - AFTER - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - BEFORE - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - AFTER - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6

我是不是做错了什么?

我从这个论坛看到包含组件绑定时 ViewScope 存在错误,但我的 bean 实际上只是一个字符串(当然问题来自一个非常复杂的示例,我尝试从中加载一些数据@PostConstruct 方法中的 DB,但我已尝试将示例减少到最低限度)

【问题讨论】:

    标签: jsf-2 managed-bean


    【解决方案1】:

    首先,导航规则在 JSF 2.0 中是可选的。我现在正在处理一个相当大的项目,但我还没有使用它们。看看这对你有什么作用。

    <h:commandButton value="Manage Users" action="list?faces-redirect=true"/>
    

    这就是我进行导航的方式,或者只是让一个方法将其作为字符串返回。

    <h:commandButton value="Manage Users" action="#{backingBean.doList}"/>
    
    
      public String doList() {
     return "list?faces-redirect=true";
    }
    

    JSF 中的导航规则还有很多不足之处。如果您真的想要控制,请查看 Spring Web Flow 以及它与 JSF 的集成。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 2013-03-28
      • 2012-03-20
      • 2018-02-22
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多