У меня есть страница, которая принимает параметр GET, например: /manageSquare.xhtml?squareName=foobar
.У этой страницы есть компонент поддержки, который является областью запроса.Чтобы правильно инициализировать компонент поддержки, компонент содержит метод initialize
, который будет вызываться, поскольку страница содержит <f:metadata>
с <f:viewParam>
и <f:event type="preRenderView ...>
.Иногда квадрат не существует, и отображается специальное сообщение об ошибке.Поэтому существует элемент <h:panelGroup rendered="#{squareBean.squareExist}">
.
Теперь - проблема в том, что если у меня есть элемент <h:commandButton>
внутри такого <h:panelGroup>
, то при отправке формы происходит только навигация, но метод действияникогда не называется!Как это может быть?
Вот какой-то концептуальный код (свёрнутый)
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
template="../template.xhtml">
<ui:param name="title" value="Square"/>
<f:metadata>
<f:viewParam name="squareName" value="#{manageSquareBean.squareName}"/>
<f:event type="preRenderView" listener="#{manageSquareBean.initialize}"/>
</f:metadata>
<ui:define name="content">
<h1>Manage square <h:outputText escape="true" value="#{manageSquareBean.squareName}"/></h1>
<h:panelGroup rendered="#{!manageSquareBean.squareExists}">
<span class="error">Square does not exist</span>
</h:panelGroup>
<h:panelGroup rendered="#{manageSquareBean.squareExists}">
<h:form>
<h:commandButton action="#{manageSquareBean.addUsersToSquare}" value="Add users">
<f:param name="squareName" value="#{manageSquareBean.squareName}"/>
</h:commandButton>
</h:form>
</h:panelGroup>
</ui:define>
</ui:composition>
, а здесь - управляемый компонент:
@RequestScoped
@ManagedBean
public class ManageSquareBean
{
private String squareName;
private boolean squareExists;
private List<String> usersToAdd;
public void initialize()
{
// Find out if squareName exists
squareExists = squareExists(squareName);
}
public String addUsersToSquare()
{
// Do something
}
// Getters and setters
}
Я действительно не понимаюпочему это происходит.Снятие <panelGroup>
и все нормально.Кроме того, кажется, что параметр squareName не отправляется вперед при нажатии клавиши command.
Здесь - человек с такой же проблемой.Он решил это, используя JSTL вместо <panelGroup>
, но JSTL будет запускаться во время сборки, то есть до вызова метода initialize
.
Пожалуйста, помогите, я использовал много часов для решения этой проблемы.