Командная кнопка в панели группы - PullRequest
1 голос
/ 16 сентября 2011

У меня есть страница, которая принимает параметр 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.

Пожалуйста, помогите, я использовал много часов для решения этой проблемы.

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Атрибут rendered компонента ввода и команды и всех его родителей переоценивается на этапе применения значений запроса формы отправки. Так как ваш bean-компонент является областью запроса, при отправке создается совершенно новый bean-компонент, и поэтому условие атрибута rendered по умолчанию равно false, и, следовательно, кнопка никогда не отображается и, следовательно, также никогда не вызывается.

Ваш боб должен быть помещен в область видимости.

@ManagedBean
@ViewScoped
public class ManageSquareBean

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

Смотри также:

0 голосов
/ 16 сентября 2011

Я уверен, что группа Panel не проблема.

У меня есть 2 предложения для вас:

1) Проверьте, унаследовали ли вы формы.Иногда случается, что элемент формы находится в другой форме с помощью шаблонного подхода.JSF не может обработать это правильно

2) Возможно, вам нужно обернуть метаданные f: тегом define и метаданными имени.

http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/f/metadata.html

<ui:define name="metadata">
<f:metadata>
    <f:viewParam name="squareName" value="#{manageSquareBean.squareName}"/>
    <f:event type="preRenderView" listener="#{manageSquareBean.initialize}"/>
</f:metadata>
</ui:define>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...