74

h:button在 JSF 2 中,和有什么区别h:commandButton

4

5 回答 5

110

<h:button>

<h:button>生成一个<input type="button">HTML 。outcome生成的元素使用 JavaScript使用 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 不友好。搜索机器人不会跟随onclick. <h:outputLink>如果<h:link>SEO 在给定的 URL 上很重要,您最好使用。如有必要,您可以在生成的 HTML<a>元素上添加一些 CSS,使其看起来像一个按钮。

请注意,虽然您可以在outcome属性中放置一个引用方法的 EL 表达式,如下所示,

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

单击按钮时不会调用它。相反,当呈现包含按钮的页面时,它已经被调用,其唯一目的是获取要嵌入到生成的onclick代码中的导航结果。如果您曾经尝试使用 中的操作方法语法outcome="#{bean.action}",那么您已经通过面对javax.el.E​​LException: Could not find property actionMethod in class com.example.Bean被这个错误/误解所暗示。

如果您打算作为 POST 请求的结果调用方法<h:commandButton>,请改用,见下文。或者,如果您打算作为 GET 请求的结果调用方法,请前往Invoke JSF managed bean action on page load或者如果您还具有 GET 请求参数<f:param>如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?


<h:commandButton>

<h:commandButton>生成一个 HTML按钮,<input type="submit">默认情况下使用 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 之后触发重定向(根据Post-Redirect-Get 模式),以便目标 URL 变为可收藏。

<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() {
    // ...
}

也可以看看:

于 2012-10-25T15:29:17.150 回答
7

h:button- 点击一个h:button发出书签的GET请求。

h:commandbutton- 代替 get 请求,h:commandbutton发出 POST 请求,将表单数据发送回服务器。

于 2012-10-25T14:16:26.567 回答
4

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" />
于 2012-10-25T16:11:13.430 回答
3

这摘自本书 - Ed Burns 和 Chris Schalk 的完整参考书

h:commandButton vs h:button

h:commandButton|h:commandLinkh:button|h:link有什么区别?

后两个组件被引入2.0以启用可添加书签的 JSF 页面,当与 View Parameters 功能一起使用时。

h:button|h:linkh: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 之前。

于 2014-12-18T17:05:28.063 回答
0

以下是JSF javadocs关于该commandButton action属性的内容:

MethodExpression 表示用户激活此组件时要调用的应用程序操作。该表达式必须计算为不带参数的公共方法,并返回一个对象(调用其 toString() 以得出逻辑结果),该对象被传递给此应用程序的 NavigationHandler。

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

于 2015-06-27T18:17:10.000 回答