Жизненный цикл JSF - выполнение метода управляемого компонента после завершения запроса - PullRequest
0 голосов
/ 27 января 2011

Используя JSF 2.0 и Spring, я использую управляемый компонент @RequestScope.Этот бин хранит информацию о вошедшем в систему пользователе.Он загружает пользователя из БД методом @PostConstruct:

@PostConstruct
public void init() {
    String username = login.getUsername();
    user = userDao.load(username);
}

Зарегистрированный пользователь может запустить действие на странице, которая обновляет пользователя в базе данных (используя другой управляемый компонент).

Однако компонент @RequestScope создается в начале запроса, то есть до вызова действия обновления.В результате, когда страница отображается повторно, переменная User все еще имеет свои старые значения.

Мой вопрос: у меня есть способ запустить мой метод загрузки не в начале запроса, а после запрос был отправлен?Или я имею дело с этим неправильно?

Спасибо за ваше понимание,
Себастьян

1 Ответ

1 голос
/ 27 января 2011

Зарегистрированный пользователь может затем запустить действие на странице, которая обновляет пользователя в базе данных ( с использованием другого управляемого компонента ).

Тот же управляемый компонент , что и , должен был быть обновлен в этот момент. Если по какой-то причине вы не можете повторно использовать один и тот же управляемый bean-компонент, вам следует сделать это вручную, открыв его в методе action и вызвав сеттеры самостоятельно.


Обновление : основываясь на комментариях, вот как компоненты должны быть объявлены, введены и использованы в вашем конкретном требовании:

@ManagedBean(name="#{login}")
@SessionScoped
public class LoginManager {

    private String username;

    // ...
}

@ManagedBean(name="#{user}")
@RequestScoped
public class UserManager {

    @ManagedProperty(value="#{login}")
    private LoginManager login;
    private User current;

    @PostConstruct
    public void init() {
        current = userDAO.find(login.getUsername());
    }

    // ...
}

@ManagedBean(name="#{profile}")
@RequestScoped
public class ProfileManager {

    @ManagedProperty(value="#{user}")
    private UserManager user;

    public void save() {
        userDAO.save(user.getCurrent());
    }

    // ...
}

<h:form>
    <h:inputText value="#{user.current.firstname}" />
    <h:inputText value="#{user.current.lastname}" />
    <h:inputText value="#{user.current.birthdate}" />
    ...
    <h:commandButton value="Save" action="#{profile.save}" />
</h:form>
...