h:button
和h: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.ELException而被错误/误解提示:在类com.example.Bean中找不到属性actionMethod。如果要作为POST请求的结果调用方法,请改用<h:commandButton>
,请参见下文。或者,如果您打算作为GET请求的结果来调用方法,请在页面加载时转到调用JSF托管Bean操作,或者如果您也通过<f:param>
拥有GET请求参数,那么如何在页面上支持Bean时处理GET查询字符串URL参数加载?需要<h:commandButton>
。例如,
<h:commandButton>
将生成
<input type="submit">
pre >
请注意,它因此会提交到当前页面(表单操作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
这些实际上是无关的。将始终生成一个
#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
是指某个页面的文件名而不是方法。
评论
我发现此链接更有用和更详细