[英]Cannot inject a request scoped bean as managed property of a session scoped bean
[英]@ManagedProperty - Inject one request scoped bean into another request scoped bean
我有這個SearchBean :
@ManagedBean(name = "searchBean")
@RequestScoped
public class SearchBean implements Serializable
{
private String input = null;
// getter methods
public String getInput() {
return input;
}
// setter method
public void setInput(String input) {
this.input = input;
}
public String Submit() {
return null;
}
}
我可以使用@ManagedProperty將其注入另一個bean。 例如:
@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
@ManagedProperty(value = "#{searchBean}")
private SearchBean searchBean;
@PostConstruct
public void init()
{
System.out.println("Value: " + searchBean.getInput());
}
public SearchBean getSearchBean() {
return searchBean;
}
public void setSearchBean(SearchBean searchBean) {
this.searchBean = searchBean;
}
}
和Facelet(search.xhtml):
<h:form id="formSearch">
<h:commandButton value="Search" action="#{searchBean.Submit}" />
</h:form>
更新 :我通過ui:insert
組件ui:insert
search.xhtml
插入book.xhtml
,如下所示:
<h:form id="formBooks">
<ui:insert name="search">
<ui:include src="/templates/common/search.xhtml"/>
</ui:insert>
</h:form>
上面的searchBean.getInput()
方法應該作為表單提交的結果返回一個值。 上述注射方法是否可行?
我假設SearchBean.input
將綁定到輸入字段 :
public class SearchBean implements Serializable {
private String input = null;
像這樣的東西:
<h:inputText value="#{searchBean.input}" />
如果是這樣,那么這將是null:
@PostConstruct
public void init()
{
System.out.println("Value: " + searchBean.getInput());
}
但是 ,假設已設置一個值,則在調用此方法時它不會為null:
public String Submit() {
return null;
}
圖片來自Richard Hightower的非信徒JSF:JSF應用程序生命周期 。
原因在於JSF生命周期的工作原理:
#{searchBean...}
並發現不存在時:
SearchBean.setInput(String)
SearchBean.Submit()
此過程在JSF規范中定義。
現在,如果直接從參數映射中注入SearchBean.input
,則在@PostConstruct
期間它不會為null:
@ManagedProperty(value = "#{param.someParamName}")
private String input;
但是,這沒有任何真正的優勢 - 您正在跳過任何輸入驗證,並且您不能將SearchBean.input
用作字段綁定,因為它將在Update Model Values階段被覆蓋。
SearchBean.Submit()
方法是執行搜索的應用程序邏輯所在的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.