Передача параметров с помощью h: commandButton - или эквивалентного - PullRequest
2 голосов
/ 09 сентября 2011

Я читал в других темах, что это не работает:

<h:commandButton value="Create New Account" 
                action="#{acctBean.doCreate}" >
   <f:param name="acctName" value="#{acctBean.handle}" />
   <f:param name="acctNo" value="#{acctBean.id}" />
</h:commandButton>

Метод doCreate() вернет переход на страницу "поздравления", если он создаст учетную запись. Целевая страница может затем разрешить #{param.handle} и #{param.id}.

Я знаю, что это будет работать, если я буду использовать h:commandLink, но мне нужна кнопка, а не ссылка. Есть ли общепринятый способ сделать это?

UPDATE:

Основываясь на первом ответе @BalusC, я создал следующий тестовый код:

<h:commandButton value="Push Me" action="goAcctCreated" >
    <f:param name="acctName" value="This Is Account Name" />
    <f:param name="acctNo" value="1234" />
</h:commandButton>
<h:button value="Push Me #2" outcome="newAcct" >
    <f:param name="acctName" value="This Is Account Name" />
    <f:param name="acctNo" value="1234" />
</h:button>

И на целевой странице у меня есть:

<p>You may now log in with the account you just created: <b>#{param['acctName']}</b>.</p>
<p>This is account number <b>#{param['acctNo']}</b>.</p>

Как и прежде, h:commandButton не работает с транзакцией POST, и, как сказал BalusC, h:button выполняет GET и работает.

Интересно, что на POST, который h:commandbutton делает, имеет закодированные параметры, как видно из Firebug:

acctName    This Is Account Name
acctNo  1234
javax.faces.ViewState   8642267042811824055:-4937858692781722161
testForm    testForm
testForm:j_idt55    testForm:j_idt55

Таким образом, теги f:param, по крайней мере, выполняют свою работу, но целевая страница не разрешает выражения EL #{param[xxx]}. Они также не отображаются в отчете по переменным в области видимости (ctrl-shift-D). Есть ли что-то, что я должен сделать на целевой странице?

1 Ответ

6 голосов
/ 09 сентября 2011

Это должно прекрасно работать на JSF 2.x. Вы когда-нибудь пробовали это сами? Если это не работает, то вы либо на самом деле используете JSF 1.x, либо отправляете перенаправление после POST.

Другие потоки, на которые вы ссылаетесь, несомненно, говорили о JSF 1.x, когда <f:param> действительно не поддерживалось на <h:commandButton>. В JSF 1.x вы бы использовали <f:setPropertyActionListener> вместо этого или какой-нибудь снимок CSS, чтобы стиль <h:commandLink> выглядел как кнопка.

Е.Г.

<h:commandLink styleClass="button" ...>

с

a.button {
    display: inline-block;
    background: lightgray;
    border: 1px outset lightgray;
    outline: none;
    color: black;
    text-decoration: none;
    cursor: default;
}
a.button:active {
    border-style: inset;
}

Обратите внимание, что в JSF 2.x у вас также есть возможность использовать новый <h:button>, который запускает запрос GET вместо запроса POST. Это лучше, если вам не нужно выполнять какое-либо действие bean-компонента (т.е. ваше текущее действие просто возвращает результат простого случая навигации) и хотите, чтобы запрос был идемпотентным.

<h:button value="Create New Account" outcome="create">
    <f:param name="acctName" value="#{acctBean.handle}" />
    <f:param name="acctNo" value="#{acctBean.id}" />
</h:button>

Это приведет к create.xhtml с указанными параметрами в URL запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...