我在使用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>
那里有什么不对吗?
谢谢! 达米安
答案 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"
。