Разница между H: button и h: commandButton


в JSF 2, в чем разница между h:button и h:commandButton ?

5 66

5 ответов:

<h:button>

The <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, ссылающееся на метод в ниже

<h:button value="GET button" outcome="#{bean.getOutcome()}" />

это не вызывается при нажатии на кнопку. Вместо этого он уже вызывается, когда страница, содержащая кнопку, отображается с единственной целью: получите результат навигации, который будет встроен в сгенерированный onclick код. Если вы когда-либо пытались использовать синтаксис метода действия, как в outcome="#{bean.action}", вы бы уже намекали на эту ошибку / заблуждение, столкнувшись с javax.Эль.ELException: не удалось найти свойство actionMethod в классе com.образец.В зернах.

если вы собираетесь вызвать метод в результате запроса POST, используйте <h:commandButton> вместо этого смотрите ниже. Или если вы собираетесь вызвать метод в результате GET просьба, направляйтесь к вызовите JSF управляемое бобовое действие при загрузке страницы или если у вас также есть параметры запроса GET через <f:param>,как я могу обработать параметры URL-адреса строки запроса в backing bean при загрузке страницы?


<h:commandButton>

The <h:commandButton> генерирует HTML <input type="submit"> кнопка, которая отправляет по умолчанию Родительский <h:form> С помощью метода HTTP POST и вызывает действия, прикрепленные к action,actionListener и/или <f:ajax listener>, если таковые имеются. Элемент это.

например.

<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-Redirect-Get pattern) так что целевой URL становится заметным.

The <h:commandButton> обычно используется исключительно для отправки формы сообщения, а не для выполнения межстраничной навигации. Обычно,action указывает на некоторые бизнес-действия, такие как сохранение данных формы в БД, которая возвращает a String результат.

<h:commandButton ... action="#{bean.save}" />

С

public String save() {
    // ...
    return "otherpage";
}

возвращение null или void вернет вас к тому же виду. Возвращение пустого string также, но он воссоздаст любой боб с областью видимости. В наши дни, с современными JSF2 и <f:ajax>, чаще всего действия просто возвращаются к одному и тому же виду (таким образом, null или void), где результаты условно отображаются ajax.

public void save() {
    // ...
}

Читайте также:

h:button щелчок на h:button вопросы можно сделать закладку GET запрос.

h:commandbutton - вместо запроса get,h:commandbutton выдает запрос POST, который отправляет данные формы обратно на сервер.

h: commandButton должен быть заключен в форму h:и имеет два способа навигации, т. е. статический, установив атрибут действия и динамический, установив атрибут 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: commandButton vs h: button

в чем разница между h:commandButton/h:commandLink и h:button/h:link ?

последние два компонента были введены в 2.0 чтобы включить bookmarkable Страницы JSF, если они используются совместно с параметрами представления особенность.

есть 3 основные различия между h:button/h:link и h:commandButton/h:commandLink.

первый, h:button|h:link заставляет браузер выдавать HTTP-запрос GET запрос, в то время как h:commandButton|h:commandLink делает сообщение формы. Этот означает, что любые компоненты на странице, которые имеют значения, введенные пользователя, такие как текстовые поля, чекбоксы и т. д. не автоматически быть отправлены на сервер при использовании h:button|h:link. Вызывать ценности быть представленным с h:button|h:link, дополнительное действие должно быть принято, используя функцию "просмотр параметров".

второе основное различие между двумя видами компонентов заключается в том, что h:button|h:link имеет атрибут результата, чтобы описать, куда идти дальше в то время как h:commandButton|h:commandLink используется атрибут действия для этого цель. Это связано с тем, что первый не приводит к событию действия в системе событий, в то время как последний не делает.

наконец, и самое главное для полного понимание этого особенность, то h:button|h:link компоненты заставляют навигационную систему попросите вывести результат во время рендеринга страницы, и ответ на этот вопрос закодирован в разметке страницы. В контраст, то h:commandButton|h:commandLink компоненты вызывают навигационная система должна быть запрошена для получения результата на обратной связи от страницы. Это разница во времени. Рендеринг всегда происходит перед обратной передачей.

здесь JSF javadocs о commandButton:

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

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