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

时间:2012-10-25 14:12:09

标签: jsf button jsf-2

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

5 个答案:

答案 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>,并调用附加到actionactionListener的操作和/或<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";
}

返回nullvoid会返回相同的视图。还返回一个空字符串,但它会重新创建任何视图范围的bean。现在,使用现代JSF2和<f:ajax>,操作通常只返回到相同的视图(因此,nullvoid),其中结果由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 javadocscommandButton action属性所说的内容:

  

MethodExpression表示要调用的应用程序操作   该组件由用户激活。表达式必须评估   到不带参数的公共方法,并返回一个Object   (调用toString()以获取逻辑结果)   传递给此应用程序的NavigationHandler。

如果有人能解释与本页面上的任何答案有什么关系,那对我来说会很有启发性。很明显,action指的是某个页面的文件名,而不是方法。