Почему навигация работает правильно только тогда, когда компонент поддержки имеет сессионную область? - PullRequest
0 голосов
/ 14 июня 2011

Рассмотрим следующую страницу (заголовок и материал для краткости опущены):

<h:body>
    <h:form>
        <h:inputText 
            id="theInput"
            value="#{theBean.text}">
            <f:ajax render="theButton" />
        </h:inputText>
        <h:commandButton 
            id="theButton" 
            value="Result" 
            disabled="#{theBean.disabled}"
            action="result" />
    </h:form>
</h:body>

TheBean выглядит так:

@Named
@RequestScoped
public class TheBean {
    String text;

    public TheBean() {
        this.text = "test";
    }

    public String getText() {
        return this.text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public boolean isDisabled() {
        return this.text.equals("test");
    }
}

result.xhtml - это заполнитель, отображающий некоторыестатический текст.

Идея состоит в том, чтобы включить кнопку только в том случае, если введенный текст действителен (в этом случае отличается от значения по умолчанию).Это работает, и кнопка правильно включена, если я ввожу что-то отличное от test, но когда я нажимаю на кнопку, она не переходит на result.Однако, это работает, если я делаю одно из следующего:

  1. Я делаю кнопку всегда включенной.Это сбивает с толку меня, потому что в примере выше кнопка правильно включена, она только не переходит на следующую страницу.Почему это изменится, если я оставлю его включенным все время?
  2. Я изменяю область действия TheBean на @SessionScoped.Я тоже этого не понимаю.Как может область действия компонента поддержки влиять на навигацию по страницам?Все остальное в примере, кажется, работает точно так же с @RequestScoped.

Я бы действительно хотел оставить TheBean в области запроса.Есть ли способ заставить навигацию работать, не ограничивая сессию?

1 Ответ

2 голосов
/ 14 июня 2011

Ваш бин имеет область действия запроса, что означает, что каждый отдельный HTTP-запрос (также ajax-запросы!) Создает новый бин. Когда вы изменяете входные данные, тогда запрос ajax создает новый компонент и устанавливает значение. Когда вы нажимаете кнопку, тогда обычный запрос создает новый бин (таким образом, значение, установленное ajax, теряется!) И определяет, может ли кнопка быть вызвана, а не - и таким образом не будет вызывать действие.

Область видимости предназначена для решения именно таких проблем. Поместите боб в область видимости.

@ManagedBean
@ViewScoped
public class TheBean {

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

Извините, я не знаю, с какой точки зрения, что такое правильная декларация CDI. По крайней мере, это называется «область разговора».

...