Разница между клавишами h: и h: commandButton

В JSF 2, в чем разница между h:button и 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 относится к некоторому имени файла страницы, а не к методу.