ManagedBean是构建但不应该?

时间:2011-11-05 16:16:53

标签: jsf jsf-2

我在使用JSF 2.0,Netbeans 7.0和Glassfish 3.1的企业应用程序上工作 我有一个ViewScoped托管bean。这是该类的声明:

@ManagedBean(name = "myBean")
@ViewScoped
public class MyMBean implements Serializable {

在@PostConstruct中,它具有以下内容:

String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");    
if (id == null) {
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("home.xhtml");
        FacesContext.getCurrentInstance().responseComplete();
    } catch (Exception e) { }
    return;
}

如果我转到使用此托管bean的页面,并且id为null,则一切正常,我将被重定向到主页。 问题是,当我导航到不使用此托管bean的不同页面时(例如“otherpage.xhtml”),执行PostConstruct方法,它不应该!它变得更糟:由于这个其他页面的url没有“id”参数,bean尝试重定向到主页;我收到IllegalStateException。

在导航到不使用它的页面时,是否构建了视图编组托管bean的任何想法?

修改 如果为了导航到“otherpage.xhtml”,我使用“home.xhtml”中的commandlink,创建了6个额外的bean。 但是,如果不是使用链接,我在浏览器中键入url;它工作正常。没有创建额外的bean。也许我实现链接的方式有问题。这是代码:

<h:form>
    <h:commandLink value="Go to other page" action="otherPage" />
</h:form>

这是faces-config中的导航规则:

 <navigation-rule>
        <from-view-id>*</from-view-id>
        <navigation-case>
            <from-outcome>otherPage</from-outcome>
            <to-view-id>/views/otherPage.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
</navigation-rule>

那里有什么不对吗?

谢谢! 达米安

1 个答案:

答案 0 :(得分:0)

您肯定在视图中的某个位置或其模板/ include / tag / composite文件中有#{myBean},或者视图引用的bean的@ManagedProperty。在(post)构造函数中放置一个断点并调查堆栈跟踪应该给出足够的洞察力/触发了bean的构造。


对于具体问题

无关ExternalContext#redirect()已经隐式调用FacesContext#responseComplete(),您不需要自己调用它。另请参阅method's javadoc


更新<h:commandLink>将其父POST <form>提交到当前页面(从而创建所有相关的bean!)然后根据导航结果,它将转发/重定向到结果页面。您不应该使用命令链接/命令按钮进行纯页面到页面导航。请改用<h:link>

<h:link value="Go to other page" outcome="views/otherPage" />

你最终也可以摆脱<navigation-case>。如果你真的坚持保留导航案例,那么请改用outcome="otherPage"

另见: