前兩天我寫了這個問題: How can I retrieve an object on @WindowScoped? 和BalusC回答了一些建議,現在我有一些問題要了解,如果我的問題是WindowScoped中的對象存儲正確或我的代碼檢索它是錯誤的!如何檢查使用@WindowScoped存儲的對象是否正確存儲?
那麼,正如我所說,我有一個對象,我存儲在@WindowScoped註釋,但我可以只在第一次檢索這個對象!爲什麼?
我只是有一個疑問:MyFaces的CODI擴展可以以某種方式配置?或者我可以用它簡單地將jar文件添加到我的項目中?
然而,這些都是我的部分代碼,因爲我不知道問題出在哪裏:
LogicBean.java(我應該retrive對象):
@ManagedBean (name="logicBean")
@WindowScoped
public class LogicBean implements Serializable
{
String pageIncluded;
// getter and setter methods
public String action(String value)
{
setPageIncluded(value);
return "include";
}
}
include.xhtml:
<ui:include src="#{logicBean.pageIncluded}"/>
ProgettiController.java
@ManagedBean(name = "progettiController")
@SessionScoped
public class ProgettiController implements Serializable {
private FacesContext context = FacesContext.getCurrentInstance();
private LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
//getter and setter methods
public void testMethod()
{
logicBean.action("WEB-INF/jsf/page1.xhtml");
}
}
我也試過用@ManagedProperty(「#{} logicBean」),並設置範圍爲WindowScoped但沒有什麼變化......
編輯:後一些新的試驗,我發現一個奇怪的問題,我有.xhtml我添加了#{progettiController.logicBean.getPageIncluded()}和#{logicBean.getPageIncluded()}來檢查這兩個字段嗎?
那麼,當我第一次加載應用程序變量被正確設置,我看到我想要的,第二次第一次變量設置爲新值,但第二次是空的,我沒有看到什麼,但現在來的奇怪的事情......如果我再試一試的應用程序,我應該打開的index.xhtml在那裏我有一些形式是這樣的:
<h:form>
<h:commandLink action="#{logicBean.action('/WEB-INF/jsf/progetti/List.xhtml')}" value="Show All Progetti Items"/>
</h:form>
,哪個是結果? 第一個變量保持設置舊值(錯誤),但第二個設置正確,所以我可以像我一樣查看頁面! 如果有人能幫助我,我會永遠感謝他/她!
@ BalusC:問題是,我使用LogicBean許多方法,所以我想只添加:
上下文= FacesContext.getCurrentInstance() ;
logicBean = context.getApplication()。evaluateExpressionGet(context,「#{logicBean}」,LogicBean.class);
在使用它的方法中,但沒有任何變化......但問題是,xhtml頁面沒有檢索到logicBean! – Filippo1980
你說得對。我完全忽略了CODI是CDI的延伸。您應該通過CDI批註而不是JSF批註來管理您的bean。然後你可以使用CDI'@Inject'來注入另一個bean。這與範圍的差異無關。我編輯了我的答案。 – BalusC
@ BalusC:好的,你說得對,很明顯......現在它的工作原理......控制器中的錯誤也導致了xhtml頁面中的問題......再次感謝! – Filippo1980