Разница между H: button и h: commandButton
в JSF 2, в чем разница между h:button
и h:commandButton
?
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
указывает на некоторые бизнес-действия, такие как сохранение данных формы в БД, которая возвращает aString
результат.<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
относится к имени файла некоторой страницы, а не к методу.