JSF commandButton «странное» поведение - PullRequest
1 голос
/ 21 декабря 2011

Я буду очень рад получить достойное объяснение для следующего случая.

Вот простой JSF с двумя формами и выводом текста:

<h:body>
<h:form>
<h:commandButton value="Go" action="#{wierdBean.doWierdStuff}"/>
</h:form>

<h:form>
<h:dataTable value="#{wierdBean.pages}" var="page">
<h:column>
<h:commandButton value="the same go action?" action="#{wierdBean.doWierdStuff}"/>
</h:column>
</h:dataTable>
</h:form>
</h:body>

<h:dataTable value="#{wierdBean.pages}" var="page">
<h:column>
<h:outputText value="#{page}"/>
</h:column>
</h:dataTable>

Кнопка «Перейти» вверх должен делать то же самое, что и «тот же ход»?кнопки.

Поддержка WierdBean:

public class WierdBean implements Serializable {

private int buttonsCount;

public WierdBean() {
System.out.println("WierdBean()");
}

@PostConstruct
public void postConstruct() {
System.out.println("postConstruct()");
}

public Integer[] getPages() {
System.out.print("getPages() buttonsCount(): " + buttonsCount);
Integer[] pages = new Integer[buttonsCount];
for (int i = 0; i < pages.length; i++) {
pages[i] = new Integer(i);
}
return pages;
}

public String doWierdStuff() {
System.out.println("doWierdStuff()");
buttonsCount = 2;
return "wierd";
}
}

При входе на страницу я получаю:

INFO: WierdBean()
INFO: postConstruct()
INFO: getPages() buttonsCount(): 0 (16 times)

, и я вижу только кнопку «Перейти».Это понятно.

После нажатия кнопки «Перейти» я получаю:

INFO: WierdBean() 
INFO: postConstruct() 
INFO: getPages() buttonsCount(): 0 (19 times) 
INFO: doWierdStuff() 
INFO: getPages() buttonsCount(): 2 (16 times)

Хорошо, вызывается doWierdStuff, а затем я получаю 2 кнопки «одно и то же действие» и 2 текстовых вывода.Это нормально.

Однако, когда я нажимаю любую из кнопок «то же действие», которые должны делать то же самое, что и кнопка «Перейти» - вызов метода doWierdStuff - я получаю:

INFO: WierdBean() 
INFO: postConstruct() 
INFO: getPages() buttonsCount(): 0 (44 times)

Видна только кнопка «Перейти».

Почему это так?

1 Ответ

0 голосов
/ 21 декабря 2011

Ваша конкретная проблема имеет две стороны: бин явно ограничен запросом, а не областью просмотра, и вы выполняете бизнес-работу в методе получения вместо конструктора (post) или метода прослушивания (action).

Бин с областью запроса создается заново при каждом отдельном запросе и не используется повторно при последующих запросах в том же представлении.Все свойства, такие как buttonsCount, повторно инициализируются по умолчанию.При щелчке по ссылке / кнопке команды в таблице данных необходимо убедиться, что точно такая же модель данных была сохранена, как и в первоначальном запросе.Если вы этого не сделаете, JSF не сможет найти действие, которое будет вызвано.Боб должен жить до тех пор, пока вы взаимодействуете с одним и тем же представлением, возвращая null или void.Это может быть достигнуто путем помещения компонента в область видимости с помощью @ViewScoped (или когда вы все еще используете устаревший JSF 1.x с помощью компонента <t:saveState> Томагавка).

Метод получения вспомогательного компонента долженвозвращать только те данные, которые уже подготовлены заранее, а не готовить сами данные.Предполагается, что метод получения является исключительно точкой доступа к данным.Это связано с тем, что метод получения может вызываться несколько раз в течение цикла запрос-ответ, особенно если на него ссылается компонент UIData и / или атрибут rendered.

См. Также:

...