h:button和h:commandButton之间的区别


Answers:


108

<h:button>

<h:button>生成一个HTML <input type="button">。生成的元素使用JavaScript通过outcomeHTTP 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友好的。Searchbot不会遵循中的网址onclick。如果在给定的URL上SEO很重要,则最好使用<h:outputLink><h:link>。如有必要,您可以在生成的HTML<a>元素上添加一些CSS,以使其看起来像一个按钮。

请注意,虽然您可以在outcome属性中放置一个引用方法的EL表达式,如下所示,

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

单击按钮时将不会调用它。取而代之的是,仅在呈现包含按钮的页面时才调用它,以获取要嵌入到生成的onclick代码中的导航结果。如果您曾经尝试使用中的操作方法语法outcome="#{bean.action}",那么您将面临javax.el.E​​LException这个错误/错误观念已经提示您:在类com.example.Bean中找不到属性actionMethod

如果您打算通过POST请求来调用方法<h:commandButton>,请改用,请参见下文。或者,如果您打算作为GET请求的结果调用方法,请在页面加载时转到调用JSF托管Bean操作,或者如果您也通过拥有GET请求参数<f:param>,那么如何在页面加载时在后台Bean中处理GET查询字符串URL参数?


<h:commandButton>

所述<h:commandButton>产生一HTML<input type="submit">它提交默认父按钮<h:form>使用HTTP POST方法并调用附接至操作actionactionListener和/或<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指向某些业务操作,例如将表单数据保存在DB中,这将返回String结果。

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

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

返回nullvoid将带您回到相同的视图。还返回一个空字符串,但是它将重新创建任何视图范围的bean。如今,使用现代的JSF2和<f:ajax>,动作通常会返回同一视图(因此,nullvoid),而结果是由ajax有条件地呈现的。

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

也可以看看:


1
action =“ otherpage”如何成为action =“ / contextpath / currentpage.xhtml”?应该不是action =“ / contextpath / otherpage.xhtml”
怪胎

3
这些实际上是无关的。该<h:form>始终生成<form action>指向当前请求的URL。所述<h:commandButton action="otherpage">基本上指示JSF完成POST请求时,一个向前执行给定的视图ID。
BalusC 2012年

“即使这样最终会导致浏览器地址栏中的URL(可标记)发生更改,但这也不是SEO友好的。Searchbot不会在onclick中遵循该URL”为什么如此?
极客

2
Searchbot通常只解释HTML,而忽略JS(和CSS)。尽管Google正在尝试解密JS代码。您应该将搜索机器人视为禁用了JS的用户。
BalusC 2012年

7

h:button-点击h:button问题可添加书签的GET请求。

h:commandbutton-代替GET请求,h:commandbutton发出POST请求,将表单数据发送回服务器。


4

h:commandButton必须包含在ah:form中,并且具有两种导航方式,即通过设置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:button更简单,仅用于静态或基于规则的导航,如下所示

<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" />

1
为h:commandButton生成的代码似乎不正确。生成的操作应该是page.xhtml而不是index.xhtml。
阿伦·古普塔

3

摘自Ed Burns和Chris Schalk的书-The Complete Reference

h:commandButton与h:button

h:commandButton | h:commandLinkh:button | h:link有什么区别?

2.0当与“查看参数”功能一起使用时,引入了后两个组件以启用可添加书签的JSF页面。

h:button | h:linkh:commandButton | h:commandLink之间有3个主要区别。

首先,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之前。


0

这是JSF javadocs必须针对该commandButton action属性说的话:

MethodExpression表示当用户激活此组件时要调用的应用程序操作。该表达式必须求值为不带参数的公共方法,并返回一个对象(将调用该对象的toString()以得出逻辑结果),该对象将传递给此应用程序的NavigationHandler。

如果有人可以解释与此页面上任何答案有关的内容,这对我将很有启发。似乎很清楚,它action指向某个页面的文件名而不是方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.