Когда фактически отправляется f: param? - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть следующее h:commandButton:

<h:commandButton action="#{myBean.myAction}" value="Send">
    <f:param name="myFlag" value="true" />
</h:commandButton>

Я хочу получить доступ к myFlag insinde a Validator , который подключен к другому элементу с f:validator.

К сожалению, когда я хочу получить параметр через FacesContext , я получаю только null возвращено.

Это параметры отправляются только после того, как все валидаторы были вызваны?

1 Ответ

2 голосов
/ 22 ноября 2011

<f:param> внутри <h:commandButton> поддерживается только с JSF 2.0, но вы используете JSF 1.2.<f:param> поддерживается только в <h:commandLink>.

<h:commandLink action="#{myBean.myAction}" value="Send">
    <f:param name="myFlag" value="true" />
</h:commandLink>

Существуют альтернативы, такие как <h:inputHidden> или <f:setPropertyActionListener> или <f:attribute> или в этом случае, возможно, просто обычный <input type="hidden"> (скрытый компонент ввода и слушатель действия будут устанавливать только своизначение во время обновления значений модели, которое является более поздним, чем этап проверки; тег атрибута лучше устанавливать в компоненте, который вызывает валидатор).Поскольку функциональные требования неясны, невозможно предложить лучшую альтернативу.


Обновление в соответствии с комментариями, очевидно, все, что вам нужно знать, это если нажата конкретная кнопкаили нет;в этом случае просто дайте ему и родительской форме фиксированный идентификатор

<h:form id="form">
    <h:commandButton id="send" ...>

таким образом, у него будет фиксированное имя параметра запроса form:send, и вы можете проверить это в валидаторе:

if (externalContext.getRequestParameterMap().containsKey("form:send")) {
    // Send button is pressed.
}

Кстати, вы также можете проверить это в валидаторах required следующим образом:

<h:inputText ... required="#{not empty param['form:send']}" />

См. Также:

...