簡體   English   中英

@ManagedProperty - 將一個請求范圍的bean注入另一個請求范圍的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應用程序生命周期

圖片來自Richard Hightower的非信徒JSF:JSF應用程序生命周期

原因在於JSF生命周期的工作原理:

  1. 首次解析#{searchBean...}並發現不存在時:
    • bean被實例化
    • 執行任何依賴注入(在這種情況下沒有任何注入)
    • 調用@PostConstruct方法
    • 將bean放入范圍
  2. 假設Apply Request Values和Validations階段成功,則在Update Model Values階段調用SearchBean.setInput(String)
  3. 在Invoke Application階段調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM