В JSF 2, в чем разница между h:button
и h:commandButton
?
Разница между клавишами h: и h: commandButton
Ответ 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() {
// ...
}
См. также:
Ответ 2
h:button
- нажатие на h:button
вызывает запрос на закладку GET
.
h:commandbutton
- вместо запроса на получение h:commandbutton
выдает запрос POST, который отправляет данные формы обратно на сервер.
Ответ 3
h: commandButton должен быть заключен в форму h: и имеет два способа навигации, то есть статический, установив атрибут action и dynamic, установив атрибут actionListener, следовательно, он более продвинут следующим образом:
<h:form>
<h:commandButton action="page.xhtml" value="cmdButton"/>
</h:form>
этот код генерирует следующий html:
<form id="j_idt7" name="j_idt7" method="post" action="/jsf/faces/index.xhtml" enctype="application/x-www-form-urlencoded">
тогда как кнопка h: проще и просто используется для навигации на основе статического или правила, как показано ниже.
<h:button outcome="page.xhtml" value="button"/>
сгенерированный html равен
<title>Facelet Title</title></head><body><input type="button" onclick="window.location.href='/jsf/faces/page.xhtml'; return false;" value="button" />
Ответ 4
Вклад от книги Эда Бернса и Криса Шалька Полная ссылка
Сравнение h: commandButton и h: button
В чем разница между h: commandButton/h: commandLink и h: кнопка/ссылка?
Последние два компонента были введены в 2.0, чтобы включить bookmarkable JSF, когда используется совместно с функцией "Просмотр параметров" .
Существует 3 основных различия между h: button/h: link и ч: CommandButton/ч:. CommandLink
Во-первых,
h:button/h:link
заставляет браузер выдавать HTTP GET запрос, в то время какh:commandButton/h:commandLink
выполняет форму POST. Эта означает, что любые компоненты на странице, которые имеют значения, введенные пользователь, такой как текстовые поля, флажки и т.д., не будет автоматически быть отправлен на сервер при использованииh:button/h:link
. Вызывать значения, которые должны быть представлены с помощьюh:button/h:link
, дополнительное действие должно быть, используя функцию "Просмотр параметров".Второе основное отличие между двумя типами компонентов заключается в том, что
h:button/ h:link
имеет атрибут исхода, чтобы описать, куда идти дальше аh:commandButton/ h:commandLink
использует атрибут действия для этого цель. Это связано с тем, что первое не приводит к ActionEvent в системе событий, в то время как последняя делает.Наконец, и самое главное для полного понимания этого, компоненты
h:button/h:link
приводят к тому, что навигационная система попросить получить результат во время рендеринга страницы и ответ на этот вопрос закодирован в разметке страницы. В контраста, компонентыh:commandButton/h:commandLink
вызывают навигационной системы, которая будет предложена для получения результатов на POSTBACK со страницы. Это разница в сроках. Оказание всегда происходит до POSTBACK.
Ответ 5
Вот что javadocs jSF должно сказать об атрибуте commandButton
action
:
MethodExpression, представляющий действие приложения для вызова, когда этот компонент активируется пользователем. Выражение должно оцениваться к общедоступному методу, который не принимает параметров и возвращает объект (toString() которого вызван для получения логического результата) который передается в NavigationHandler для этого приложения.
Было бы интересно, если кто-нибудь сможет объяснить, что это касается любого из ответов на этой странице. Кажется довольно ясным, что action
относится к некоторому имени файла страницы, а не к методу.