在JSF 2中,h:button
和h:commandButton
之间有什么区别?
答案 0 :(得分:105)
<h:button>
<h:button>
生成HTML <input type="button">
。生成的元素使用JavaScript使用HTTP GET请求导航到属性outcome
给出的页面。
E.g。
<h:button value="GET button" outcome="otherpage" />
将生成
<input type="button" onclick="window.location.href='/contextpath/otherpage.xhtml'; return false;" value="GET button" />
即使这最终导致浏览器地址栏中的(可收藏的)URL更改,这也不是SEO友好的。 Searchbots不会关注onclick
中的网址。如果SEO对给定的URL很重要,最好使用<h:outputLink>
或<h:link>
。如果需要,您可以在生成的HTML <a>
元素上添加一些CSS,使其看起来像一个按钮。
请注意,虽然您可以在outcome
属性中引用EL表达式,但如下所示
<h:button value="GET button" outcome="#{bean.getOutcome()}" />
单击按钮时, 将被调用。相反,当呈现包含按钮的页面时,它已被调用,其唯一目的是获取嵌入在生成的onclick
代码中的导航结果。如果您曾尝试使用outcome="#{bean.action}"
中的操作方法语法,那么您可能会因为这个错误/误解而面临javax.el.ELException: Could not find property actionMethod in class com.example.Bean的暗示。
如果您打算根据POST请求调用方法,请改用<h:commandButton>
,请参阅下文。或者,如果您打算根据GET请求调用方法,请转到Invoke JSF managed bean action on page load,或者如果您还通过<f:param>
获得GET请求参数,How do I process GET query string URL parameters in backing bean on page load?
<h:commandButton>
<h:commandButton>
生成一个HTML <input type="submit">
按钮,默认情况下使用HTTP POST方法提交父<h:form>
,并调用附加到action
,actionListener
的操作和/或<f:ajax listener>
,如果有的话。 <h:form>
是必需的。
E.g。
<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 pattern),以便目标网址变为可收藏。
<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() {
// ...
}
答案 1 :(得分:6)
h:button
- 点击h:button
发出可收藏的GET
请求。
h:commandbutton
- h:commandbutton
发出POST请求而不是get请求,该请求将表单数据发送回服务器。
答案 2 :(得分:4)
h:commandButton必须用h:形式包含,并且有两种导航方式,即通过设置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" />
答案 3 :(得分:2)
这取自本书 - Ed Burns的完整参考文献&amp; Chris Schalk
h:commandButton vs h:button
h:commandButton | h:commandLink 和之间有什么区别? h:按钮| h:链接?
后两个组件在2.0
中引入以启用可收藏
JSF页面与视图参数功能一起使用时。
h:button | h:link 和。之间有3个主要区别 的 H:的commandButton | H:commandLink 强>
首先,
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之前。
答案 4 :(得分:0)
以下是JSF javadocs对commandButton
action
属性所说的内容:
MethodExpression表示要调用的应用程序操作 该组件由用户激活。表达式必须评估 到不带参数的公共方法,并返回一个Object (调用toString()以获取逻辑结果) 传递给此应用程序的NavigationHandler。
如果有人能解释与本页面上的任何答案有什么关系,那对我来说会很有启发性。很明显,action
指的是某个页面的文件名,而不是方法。