Разница между h:button и h:commandButton
В JSF 2, в чем разница между h:button
а также h:commandButton
?
5 ответов
<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()}" />
онне будет вызываться при нажатии кнопки. Вместо этого он уже вызывается, когда страница, содержащая кнопку, отображается с единственной целью получить результат навигации, который будет встроен в сгенерированный onclick
код. Если вы когда-либо пытались использовать синтаксис метода действия, как вoutcome="#{bean.action}"
, вы уже намекаете на эту ошибку / заблуждение, сталкиваясь с javax.el.ELException: не удалось найти свойство actionMethod в классе com.example.Bean.
Если вы намереваетесь вызвать метод в результате запроса POST, используйте<h:commandButton>
вместо этого смотрите ниже. Или, если вы намереваетесь вызвать метод в результате запроса GET, перейдите к Invoke JSF-действие управляемого компонента при загрузке страницы или если у вас также есть параметры запроса GET через <f:param>
Как мне обработать параметры URL строки запроса GET в бине поддержки при загрузке страницы?
<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-адрес действия формы будет отображаться в адресной строке браузера). После этого он будетперенаправлен на целевую страницу без каких-либо изменений в адресной строке браузера. Вы могли бы добавить ?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() {
// ...
}
Смотрите также:
h:button
- нажав на h:button
выдает закладку GET
запрос.
h:commandbutton
- вместо запроса на получение, h:commandbutton
выдает запрос POST, который отправляет данные формы обратно на сервер.
h:commandButton должен быть заключен в форму ah: и иметь два способа навигации: статический с помощью атрибута action и динамический с помощью атрибута 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" />
Это взято из книги - Полный справочник Эд Бернс и Крис Шалк
Кнопка h:command против кнопки h:
В чем разница между h:commandButton|h:commandLink и h:button|h:link?
Последние два компонента были введены в 2.0
включить закладки страниц JSF, если они используются совместно с функцией просмотра параметров.
Существует 3 основных различия между h:button|h:link иh:commandButton|h: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.
Вот что Javf JSF должен сказать о commandButton
action
атрибут:
MethodExpression, представляющий действие приложения для вызова, когда этот компонент активирован пользователем. Выражение должно вычислять открытый метод, который не принимает параметров и возвращает объект (toString() которого вызывается для получения логического результата), который передается NavigationHandler для этого приложения.
Мне было бы интересно, если бы кто-нибудь мог объяснить, что это имеет отношение к любому из ответов на этой странице. Кажется довольно ясно, что action
ссылается на имя файла какой-либо страницы, а не на метод.