在JSF 2中,h:button
和之间有什么区别h:commandButton
?
Answers:
<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友好的。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.ELException这个错误/错误观念已经提示您:在类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方法并调用附接至操作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
指向某些业务操作,例如将表单数据保存在DB中,这将返回String
结果。
<h:commandButton ... action="#{bean.save}" />
与
public String save() {
// ...
return "otherpage";
}
返回null
或void
将带您回到相同的视图。还返回一个空字符串,但是它将重新创建任何视图范围的bean。如今,使用现代的JSF2和<f:ajax>
,动作通常会返回同一视图(因此,null
或void
),而结果是由ajax有条件地呈现的。
public void save() {
// ...
}
<h:form>
会始终生成<form action>
指向当前请求的URL。所述<h:commandButton action="otherpage">
基本上指示JSF完成POST请求时,一个向前执行给定的视图ID。
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" />
摘自Ed Burns和Chris Schalk的书-The Complete Reference
h:commandButton与h:button
h:commandButton | h:commandLink和 h:button | h:link有什么区别?
2.0
当与“查看参数”功能一起使用时,引入了后两个组件以启用可添加书签的JSF页面。
h:button | h:link和 h: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之前。
这是JSF javadocs必须针对该commandButton
action
属性说的话:
MethodExpression表示当用户激活此组件时要调用的应用程序操作。该表达式必须求值为不带参数的公共方法,并返回一个对象(将调用该对象的toString()以得出逻辑结果),该对象将传递给此应用程序的NavigationHandler。
如果有人可以解释与此页面上任何答案有关的内容,这对我将很有启发。似乎很清楚,它action
指向某个页面的文件名而不是方法。