gpt4 book ai didi

jsf - @ManagedProperty - 将一个请求范围的 bean 注入(inject)另一个请求范围的 bean

转载 作者:行者123 更新时间:2023-12-04 13:54:03 24 4
gpt4 key购买 nike

我有这个 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 将它注入(inject)到另一个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>

UPDATE:我通过 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() 方法应该返回一个值作为表单提交的结果。上面的注入(inject)方法可以吗?

最佳答案

我假设 SearchBean.input 将绑定(bind)到 input field :

public class SearchBean implements Serializable {
private String input = null;

类似这样的:

<h:inputText value="#{searchBean.input}" />

如果是这样,那么这将为空:

@PostConstruct
public void init()
{
System.out.println("Value: " + searchBean.getInput());
}

但是,假设已经设置了一个值,调用这个方法时它不会为null:

public String Submit() {
return null;
}

Image from Richard Hightower's JSF for nonbelievers: The JSF application lifecycle

图片来自 Richard Hightower 的 JSF for nonbelievers: The JSF application lifecycle .

原因在于 JSF 生命周期的工作方式:

  1. #{searchBean...} 第一次被解析发现不存在时:
    • bean 被实例化
    • 执行任何依赖注入(inject)(在这种情况下没有)
    • @PostConstruct 方法被调用
    • bean 被放入作用域
  2. 假设应用请求值和验证阶段成功,则在更新模型值阶段调用 SearchBean.setInput(String)
  3. SearchBean.Submit() 在 Invoke Application 阶段被调用

此过程在 JSF specification 中定义.


现在,如果 SearchBean.input 直接从参数映射中注入(inject),则在 @PostConstruct 期间它不会为空:

@ManagedProperty(value = "#{param.someParamName}")
private String input;

但是,这样做并没有任何真正的优势 - 您正在跳过任何输入验证,并且您不能使用 SearchBean.input 作为字段绑定(bind),因为它将在更新中被覆盖模型值(value)阶段。

SearchBean.Submit() 方法是执行搜索的应用程序逻辑所在。

关于jsf - @ManagedProperty - 将一个请求范围的 bean 注入(inject)另一个请求范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com