Разница между 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 должен сказать о commandButtonaction атрибут:

MethodExpression, представляющий действие приложения для вызова, когда этот компонент активирован пользователем. Выражение должно вычислять открытый метод, который не принимает параметров и возвращает объект (toString() которого вызывается для получения логического результата), который передается NavigationHandler для этого приложения.

Мне было бы интересно, если бы кто-нибудь мог объяснить, что это имеет отношение к любому из ответов на этой странице. Кажется довольно ясно, что action ссылается на имя файла какой-либо страницы, а не на метод.

Другие вопросы по тегам