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

jsf button jsf-2

110956 просмотра

5 ответа

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

Автор: Geek Источник Размещён: 12.11.2019 09:15

Ответы (5)


106 плюса

Решение

<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-управляемому действию bean-компонента при загрузке страницы или если у вас также есть параметры запроса 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-адрес действия формы будет отображаться в адресной строке браузера). После этого он будет перенаправлен на целевую страницу без каких-либо изменений в 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() {
    // ...
}

Смотрите также:

Автор: BalusC Размещён: 25.10.2012 03:29

6 плюса

h:button- щелкнув по h:buttonпроблеме, можно добавить закладку GET.

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

Автор: dsgriffin Размещён: 25.10.2012 02:16

4 плюса

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" />
Автор: ashish Размещён: 25.10.2012 04:11

2 плюса

Это взято из книги - Полный справочник Эд Бернс и Крис Шалк

кнопка h: command против кнопки h:

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

Последние два компонента были введены 2.0для включения закладок JSF-страниц при использовании совместно с функцией View Parameters.

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

Во-первых, h:button|h:linkбраузер выдает HTTP-запрос GET, а h:commandButton|h:commandLinkPOST - форму. Это означает, что любые компоненты на странице, которые имеют значения, введенные пользователем, такие как текстовые поля, флажки и т. Д., Не будут автоматически отправляться на сервер при использовании 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.

Автор: Shirgill Farhan Размещён: 18.12.2014 05:05

0 плюса

Вот что говорят JSF JSF об commandButton actionатрибуте:

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

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

Автор: jordanpg Размещён: 27.06.2015 06:17
Вопросы из категории :
32x32