您好我正在学习JSF / Primefaces。每当用户点击链接时,它应该转发到包含信息的编辑页面,但它是空的。
我尝试调试,发生以下流程:
我找到this但我现在只使用jsf注释来管理视图bean
QuoteStatusList.java
@ManagedBean
@RequestScope
public class QuoteStatusList extends BasePage implements Serializable {
@PostConstruct
public void init(){
log.debug("initing...");
}
...
}
QuoteStatusForm.java
@ManagedBean
@ViewScope
public class QuoteStatusForm extends BasePage implements Serializable {
@PostConstruct
public void init(){
log.debug("initing...");
}
public String edit() {
log.debug("editing..");
if (idQuoteStatus != null && idQuoteStatus != 0) {
quoteStatus = quoteStatusManager.get(idQuoteStatus);
} else {
quoteStatus = new QuoteStatus();
}
return "edit";
}
}
BasePage.java
@ManagedBean
@RequestScoped
public class BasePage {
//nothing is injected
//no other @postConstruct function
}
QuoteStatusList.xhtml
<h:commandLink action="#{quoteStatusForm.edit}" value="#{quoteStatus.idQuoteStatus}">
<f:param name="idQuoteStatus" value="#{quoteStatus.idQuoteStatus}"/>
</h:commandLink>
faces-config.xml中
<navigation-rule>
<from-view-id>/quoteStatusList.xhtml</from-view-id>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/quoteStatusForm.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/quoteStatusForm.xhtml</from-view-id>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/quoteStatusForm.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
答案 0 :(得分:1)
@RequestScoped
和@ViewScoped
bean您正在经历的适当行为。
@RequestScoped
- 此范围内的Bean无法在重定向/转发到另一个页面后继续存在。这意味着,如果您在由此作用域的bean支持的页面上,每当您发出新的HTTP请求(ajax,完整页面刷新或重定向)时,该bean的实例都是&# 39;重新工作是被毁坏,无效,不再存在。连同其所有成员变量
@ViewScoped
- 此范围内的Bean也无法在完全重定向/转发后继续存在。然而,他们将在页面刷新和ajax中存活下来。这意味着,只要您停留在同一页面(由@ViewScoped
bean支持),不返回任何导航案例,您就可以保证使用相同的实例的豆子。
这些bean应该如何进行通信?如果离开一个页面意味着你丢失了支持bean所包含的所有内容,那么你的选择是什么(你应该问)?好吧,JSF bean可以通过多种方式进行通信。仔细阅读the gospel on inter-bean communication
那么您的案例中发生了什么
QuoteStatusList
列表将被销毁。这也意味着当你回来时,你正在处理该bean的全新实例(以及为什么init
被调用两次)
QuoteStatusForm
已被销毁,因为您从该bean返回edit
,导致您正在使用的实例在页面加载时被销毁并重新创建
该怎么做:
为避免销毁QuoteStatusForm
,您只需从null
edit
即可