繁体   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