在JSF 2中,h:buttonh:commandButton有什么区别?

评论

我发现此链接更有用和更详细

#1 楼

<h:button>
<h:button>生成HTML <input type="button">。生成的元素使用JavaScript通过HTTP GET请求导航到属性outcome给定的页面。
例如,
 <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在给定的URL上很重要,则最好使用<h:outputLink><h:link>。如有必要,您可以在生成的HTML <a>元素上添加一些CSS,使其看起来像一个按钮。
请注意,尽管您可以将一个引用方法的EL表达式放在outcome属性中,如下所示,
 <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操作,或者如果您也通过<f:param>拥有GET请求参数,那么如何在页面上支持Bean时处理GET查询字符串URL参数加载?需要<h:commandButton>
例如,
 <h:commandButton> 

将生成
 <input type="submit">  
请注意,它因此会提交到当前页面(表单操作URL将显示在浏览器地址栏中)。它将随后前进到目标页面,而浏览器地址栏中的URL不会发生任何更改。您可以在结果值中添加<h:form>参数,以在POST之后触发重定向(按照Post-Redirect-Get模式),从而使目标URL成为可收藏的书签。
action通常专门用于提交POST表单,不执行页面到页面的导航。通常,actionListener指向一些业务操作,例如将表单数据保存在DB中,这将返回<f:ajax listener>结果。
您回到同一视图。还返回一个空字符串,但是它将重新创建任何视图范围的bean。如今,使用现代的JSF2和<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> ),而结果通常由ajax呈现。
<h:commandButton ... action="#{bean.save}" />


另请参见:

如何在JSF中导航?如何使URL反映当前页面(而不是上一页)
何时应使用h:outputLink代替h:commandLink?
action和actionListener之间的区别


评论


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

–极客
2012年10月25日15:44



这些实际上是无关的。 将始终生成一个
指向当前请求的URL。 基本上指示JSF在POST请求完成时执行对给定视图ID的转发。

– BalusC
2012年10月25日15:47

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

–极客
2012年10月25日15:49

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

– BalusC
2012年10月25日15:50



#2 楼

h:button-单击h:button会发出可添加书签的GET请求。

h:commandbutton-h:commandbutton会发出POST请求,而不是获取请求,该请求会将表单数据发送回服务器。

#3 楼

h:commandButton必须包含在ah:form中,并且具有两种导航方式,即通过设置action属性设置为静态,通过设置actionListener属性设置为动态,因此它的导航方式如下: />
此代码生成以下html:

<h:form>
    <h:commandButton action="page.xhtml" value="cmdButton"/>
</h:form>







其中h:按钮更简单,仅用于如下所示的静态或基于规则的导航

<form id="j_idt7" name="j_idt7" method="post" action="/jsf/faces/index.xhtml" enctype="application/x-www-form-urlencoded">


生成的html是

评论


为h:commandButton生成的代码似乎不正确。生成的操作应该是page.xhtml而不是index.xhtml。

–阿伦·古普塔(Arun Gupta)
2015年5月14日,0:04

#4 楼

摘自Ed Burns和Chris Schalk的《完整参考》

h:commandButton与h:button


h:commandButton有什么区别| h:commandLink和
h:button | h:link吗?与“视图参数”功能配合使用。

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


首先,2.0使浏览器发出HTTP GET
请求,而h:button|h:link进行POST形式。这
意味着使用h:commandButton|h:commandLink时,页面中任何具有
用户输入值的组件(例如文本字段,复选框等)都不会自动
提交给服务器。若要使
值与h:button|h:link一起提交,必须使用“查看参数”功能
采取额外的措施。

两种组件之间的第二个主要区别是
h:button|h:link具有结果属性来描述下一步去哪里
,而h:button|h:link为此目的使用了动作属性。这是因为前者在事件系统中不会导致ActionEvent
,而后者在事件系统中会导致。

最后,对于全面理解此功能最重要的是, h:commandButton|h:commandLink组件会导致导航系统在页面呈现期间被要求派生结果,并且该问题的答案被编码在页面的标记中。相比之下,h:button|h:link组件使
导航系统被要求从页面上获取POSTBACK
上的结果。这是时间上的差异。始终渲染
发生在POSTBACK之前。


#5 楼

这是JSF javadocs关于commandButton action属性必须说的:


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


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