@ManagedProperty - Внедрить один bean-объект области действия в другой bean-объект области действия. - PullRequest
3 голосов
/ 13 апреля 2011

У меня есть 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. Например:

@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>

ОБНОВЛЕНИЕ : Я вставил search.xhtml в book.xhtml через ui:insert компонент следующим образом:

<h:form id="formBooks">
   <ui:insert name="search">
      <ui:include src="/templates/common/search.xhtml"/>
   </ui:insert> 
</h:form>

Приведенный выше метод searchBean.getInput() должен возвращать значение в результате отправки формы. Возможен ли вышеуказанный метод введения?

1 Ответ

9 голосов
/ 13 апреля 2011

Я предполагаю, что SearchBean.input будет связан с полем ввода :

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

Примерно так:

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

Если так, то этобудет нулевым:

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

Но , если предполагается, что значение было установлено, при вызове этого метода оно не будет нулевым:

public String Submit() {
    return null;
}

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

Изображение от Ричарда Хайтоуэра JSF для неверующих: жизненный цикл приложения JSF .

Причина заключается в том, как жизненный цикл JSFworks:

  1. Когда #{searchBean...} впервые разрешен и обнаружен, что он не существует:
    • Создается экземпляр компонента
    • Все инъекции зависимостей выполняются (нетлюбой в этом случае)
    • @ метод PostConstruct вызывается
    • Компонент помещается в область действия
  2. Предполагая, что этапы Apply Request Values ​​и Validations пройдены успешно,SearchBean.setInput(String) вызывается на этапе обновления значений модели
  3. SearchBean.Submit() вызывается на этапе вызова приложения

This process определен в спецификации JSF .


Теперь, если SearchBean.input было введено непосредственно из карты параметров, он не будет нулевым во время @PostConstruct:

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

Однако в этом нет никаких реальных преимуществ - вы пропускаете любую проверку ввода и не можете использовать SearchBean.input в качестве привязки поля, поскольку она будет перезаписана на этапе обновления значений модели модели..

Метод SearchBean.Submit() - это то место, куда должна идти логика вашего приложения для выполнения поиска.

...