JSF2.0 как вы передаете viewParam в компонент поддержки с областью запроса при использовании commandButton?

У меня есть следующая страница:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:thehub="http://java.sun.com/jsf/composite/components/thehub"
    template="/templates/masterTemplate.xhtml">
    <f:metadata>
        <f:viewParam
            id="returnToViewParam"
            name="returnTo"
            value="#{loginMB.returnTo}"
            required="true" />
        <f:viewParam
            id="oauth_verifierViewParam"
            name="oauth_verifier"
            value="#{loginMB.oauth_verifier}" />
        <f:viewParam
            id="oauth_tokenViewParam"
            name="oauth_token"
            value="#{loginMB.oauth_token}" />
        <f:event
            type="preRenderView"
            listener="#{loginMB.preRenderView()}" />
    </f:metadata>

    <ui:define name="body">
        <o:form
            id="loginForm"
            includeViewParams="true">
            <div class="form-vertical well">
                <h4>New Users</h4>
                <h5>
                    <h:link outcome="signup">Click here to create an account</h:link>
                </h5>
                <hr />
                <h4>Existing Users</h4>
                <h:commandButton
                    id="googleLoginCommandLink"
                    styleClass="btn"
                    action="#{loginMB.redirect()}"
                    value="Google">
                    <f:param
                        name="returnTo"
                        value="#{param.returnTo}" />
                </h:commandButton>
                <div class="clearfix"></div>
            </div>
        </o:form>
    </ui:define>
</ui:composition>

И следующий бин:

@ManagedBean
@RequestScoped
public class LoginMB implements Serializable {
private static final long serialVersionUID = 1L;

private String returnTo;

public void redirect() {
    log.debug("redirect() returnTo:{}", returnTo);

......getter/setters
}

Независимо от того, что я делаю, я не могу связать returnTo после нажатия кнопки commandButton. Поскольку это страница входа в систему, я бы не хотел, чтобы LoginMB был bean-компонентом @ViewScoped.

Совет? Есть ли лучший способ справиться с этим сценарием?

РЕДАКТИРОВАТЬ:

  • Я запускаю это на сервере TomEE+ v1.5.1, который обслуживается MyFaces 2.1.10.
  • Добавлена ​​полная страница
  • Уточнил проблему: внутри функции redirect() returnTo имеет значение null

person Jonathan S. Fisher    schedule 14.03.2013    source источник
comment
Это должно работать нормально. Более того, <f:param> совершенно не нужен, если вы используете <o:form includeViewParams="true">. Вам это нужно только в том случае, если вы не используете <o:form>. Чтобы быть уверенным, я даже попробовал это локально, и это работает просто отлично. Ваша конкретная проблема, вероятно, вызвана чем-то еще, что не видно в предоставленной информации. Какую реализацию/версию JSF вы используете? Правильно ли объявлен <f:metadata> внутри композиции шаблона (и, следовательно, не снаружи)?   -  person BalusC    schedule 15.03.2013
comment
У вас есть методы получения и установки для returnTo?   -  person Xtreme Biker    schedule 15.03.2013
comment
да, есть геттеры/сеттеры   -  person Jonathan S. Fisher    schedule 15.03.2013
comment
@BalusC Я добавил всю страницу...   -  person Jonathan S. Fisher    schedule 15.03.2013
comment
Насколько я знаю, MyFaces не поддерживает <f:metadata> внутри <ui:composition>. Вместо этого попробуйте следующее: место для элемента fmetadata"> stackoverflow.com/questions/9856847/   -  person BalusC    schedule 15.03.2013
comment
@BalusC Что забавно, так это то, что o: viewParams отлично работает на страницах ViewScoped, как есть. Однако я попробовал подход метаданных ui:define, и он не сработал.   -  person Jonathan S. Fisher    schedule 15.03.2013
comment
Все стало еще веселее ... Я скопировал / вставил метаданные f: в masterTemplate, и все заработало, как и ожидалось. Вздох...   -  person Jonathan S. Fisher    schedule 15.03.2013
comment
о, хват... Н/м. У меня все работает с метаданными. Не знаю, что я сделал не так, но теперь это работает. Спасибо!   -  person Jonathan S. Fisher    schedule 15.03.2013


Ответы (1)


Ваш <f:metadata> находится за пределами <ui:define> и поэтому полностью игнорируется. Добавьте <ui:insert name="metadata"> в основной шаблон и поместите <f:metadata> в <ui:define name="metadata"> клиента шаблона.

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


Как только вы это исправите, вы можете безопасно удалить <f:param> из командной кнопки. Эту работу уже выполнил <o:form includeViewParams="true">. Если бы у вас его не было, то <f:param> действительно был бы обязательным, и вам нужно было бы скопировать его по всем командным ссылкам и кнопкам в той же форме.

person BalusC    schedule 14.03.2013