Ответ 1
<h:button>
<h:button>
генерирует HTML <input type="button">
. Сгенерированный элемент использует JavaScript для перехода на страницу, заданную атрибутом outcome
, с использованием запроса HTTP GET.
например.
<h:button value="GET button" outcome="otherpage" />
будет генерировать
<input type="button" onclick="window.location.href='/contextpath/otherpage.xhtml'; return false;" value="GET button" />
Даже если это заканчивается изменением URL-адреса в закладке браузера, это не SEO-дружественный. Поисковые роботы не будут следовать URL-адресу в onclick
. Лучше использовать <h:outputLink>
или <h:link>
, если SEO важен для данного URL. Вы могли бы при необходимости вбросить некоторый CSS в сгенерированный элемент HTML <a>
, чтобы он выглядел как кнопка.
Обратите внимание, что, хотя вы можете поместить выражение EL, ссылаясь на метод в атрибуте outcome
, как показано ниже,
<h:button value="GET button" outcome="#{bean.getOutcome()}" />
при нажатии кнопки будет вызываться not. Вместо этого он уже вызывается, когда страница, содержащая кнопку, отображается с единственной целью, чтобы получить результат навигации, который будет встроен в сгенерированный код onclick
. Если вы когда-либо пытались использовать синтаксис метода действий, как в outcome="#{bean.action}"
, вы уже были бы намечены этой ошибкой/неправильным представлением, столкнувшись с javax.el.ELException: не удалось найти свойство actionMethod в классе com.example.Bean.
Если вы намереваетесь вызывать метод в результате запроса POST, используйте <h:commandButton>
вместо этого, см. ниже. Или если вы намереваетесь вызывать метод в результате запроса GET, перейдите в Invoke JSF managed bean действие при загрузке страницы или если у вас также есть параметры запроса GET через <f:param>
, Как обрабатывать параметры URL-строки строки запроса GET при поддержке bean при загрузке страницы?
<h:commandButton>
<h:commandButton>
генерирует кнопку HTML <input type="submit">
, которая по умолчанию отправляет родительский <h:form>
с использованием метода HTTP POST и вызывает действия прикрепленных к action
, actionListener
и/или <f:ajax listener>
, если они есть. Требуется <h:form>
.
например.
<h:form id="form">
<h:commandButton id="button" value="POST button" action="otherpage" />
</h:form>
будет генерировать
<form id="form" name="form" method="post" action="/contextpath/currentpage.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="form" value="form" />
<input type="submit" name="form:button" value="POST button" />
<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="...." autocomplete="off" />
</form>
Обратите внимание, что он таким образом отправляется на текущую страницу (URL-адрес формы появится в адресной строке браузера). После этого он будет перенаправлен на целевую страницу без изменения URL-адреса в адресной строке браузера. Вы можете добавить параметр ?faces-redirect=true
к значению результата, чтобы вызвать перенаправление после POST (согласно шаблон Post-Redirect-Get), чтобы целевой URL становится доступным для закладок.
<h:commandButton>
обычно используется исключительно для отправки формы POST, а не для перемещения по страницам на страницу. Обычно action
указывает на некоторые бизнес-действия, такие как сохранение данных формы в БД, которая возвращает результат String
.
<h:commandButton ... action="#{bean.save}" />
с
public String save() {
// ...
return "otherpage";
}
Возврат null
или void
приведет вас обратно к тому же самому виду. Возвращаем также пустую строку, но она воссоздает любую область видимости bean. В наши дни, с современными JSF2 и <f:ajax>
, более чем часто действия просто возвращаются к одному и тому же представлению (таким образом, null
или void
), где результаты условно визуализируются с помощью ajax.
public void save() {
// ...
}