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

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

<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" /> 

即使这最终在浏览器地址栏中的(可collections的)URL更改,这不是search引擎优化。 Searchbots不会按照网页上的url。 如果SEO对给定的URL很重要,最好使用<h:outputLink><h:link> 。 如果需要,可以在生成的HTML <a>元素中添加一些CSS,使其看起来像一个button。

请注意,尽pipe您可以在outcome属性中使用引用方法的ELexpression式,如下所示,

 <h:button value="GET button" outcome="#{bean.getOutcome()}" /> 

当你点击button时它不会被调用。 相反,当包含该button的页面被渲染时,它已经被调用,唯一的目的是获得导航结果被embedded到生成的onclick代码中。 如果您曾尝试使用action outcome="#{bean.action}"的action方法语法,那么面对javax.el.E​​LException时 ,您已经被此错误/误解所暗示:无法在类com中findproperty actionMethod .Bean 。

如果您打算通过POST请求调用方法,请改为使用<h:commandButton> ,如下所示。 或者,如果打算通过GET请求调用方法,请在页面加载时调用JSF托pipebean操作,或者如果通过<f:param>也有GET请求参数,那么如何处理GET查询stringURL参数在页面加载时支持bean?


<h:commandButton>

<h:commandButton>生成一个HTML <input type="submit">button,默认情况下使用HTTP POST方法提交父<h:form>并调用actionactionListener和/或<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之后触发redirect(按照Post-Redirect-Get模式 ),以便目标URL变为可collections的。

<h:commandButton>通常专门用于提交POST表单,而不是执行页面到页面的导航。 通常, action指向某些业务操作,例如将表单数据保存在数据库中,这会返回String结果。

 <h:commandButton ... action="#{bean.save}" /> 

 public String save() { // ... return "otherpage"; } 

返回void将使您回到相同的观点。 还返回一个空string,但它会重新创build任何视图范围的bean。 现在,使用现代的JSF2和<f:ajax> ,通常行为只是返回到相同的视图(因此为nullvoid ),其中结果是由ajax有条件地呈现的。

 public void save() { // ... } 

也可以看看:

  • 如何在JSF中导航? 如何使URL反映当前页面(而不是以前的页面)
  • 什么时候应该使用h:outputLink而不是h:commandLink?
  • action和actionListener之间的区别

h:button – 单击h:button发出可collections的GET请求。

h:commandbutton – 而不是一个get请求, h:commandbutton发出POST请求,将表单数据发送回服务器。

h:commandButton必须包含在ah:form中,并且有两种导航方式,即通过设置action属性来设置静态,通过设置actionListener属性来实现dynamic设置,因此更加先进,如下所示:

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

此代码生成follwing 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 / link之间有什么区别?

后两个组件在2.0中引入,以便与“查看参数”function一起使用时启用可join书签的JSF页面

h:button / h:linkh:commandButton / h:commandLink有三个主要区别。

首先, h:button/h:link会导致浏览器发出一个HTTP GET请求,而h:commandButton/h:commandLink会执行POST的forms。 这意味着在使用h:button/h:link时,页面中任何由用户input值的组件(如文本框,checkbox等)都不会自动提交给服务器。 要使用h:button/h:link提交值,必须使用“查看参数”function执行额外操作。

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

最后,对于完全理解这个特性最重要的是, h:button/h:link组件导致导航系统被要求在页面渲染过程中派生出结果,这个问题的答案被编码在页面的标记。 相反, h:commandButton/h:commandLink组件导致导航系统被要求从页面导出POSTBACK结果。 这是一个时间差异。 渲染始终发生在POSTBACK之前。

以下是JSF javadoc对commandButton action属性的说明:

MethodExpression表示用户激活此组件时要调用的应用程序操作。 expression式必须计算一个不带参数的公共方法,并且返回一个Object(toString()被调用来派生逻辑结果),它被传递给这个应用程序的NavigationHandler。

如果有人能解释这个页面上的任何答案有什么关系,那对我来说是很有启发性的。 这似乎很清楚, action是指一些页面的文件名,而不是一个方法。