H: Button 和 h: commandButton 之间的区别

在 JSF2中,h:buttonh:commandButton之间的区别是什么?

123761 次浏览

单击 h:button会发出一个书签 GET请求。

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

<h:button>

<h:button>生成一个 HTML <input type="button">。生成的元素使用 JavaScript 导航到属性 outcome给出的页面,使用 HTTPGET 请求。

例如。

<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中的 URL。如果搜索引擎优化对给定的 URL 很重要,你最好使用 <h:outputLink><h:link>。如果有必要,您可以在生成的 HTML <a>元素上添加一些 CSS,使其看起来像一个按钮。

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

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

当你点击这个按钮时,它将被调用 没有。相反,当包含按钮的页面仅仅为了获得嵌入到生成的 onclick代码中的导航结果而呈现时,已经调用了它。如果您曾经尝试使用 outcome="#{bean.action}"中的操作方法语法,那么在面对 ELException: 在 com.example.Bean 类中找不到属性 actionMethod时,您可能已经被这个错误/误解所暗示。

如果您打算作为 POST 请求的结果调用一个方法,请改用 <h:commandButton>,请参见下文。或者,如果您打算调用方法作为 GET 请求的结果,请转到 在页面加载时调用 JSF 托管 bean 操作,或者如果您还通过 <f:param>如何在页面加载时处理后台 bean 中的 GET 查询字符串 URL 参数?拥有 GET 请求参数


<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 之后触发重定向(按照 后重定向-获取模式) ,这样目标 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() {
// ...
}

参见:

CommandButton 必须包含在 h: 表单中,并且具有两种导航方式,即通过设置 action 属性的 static 和通过设置 actionListener 属性的 Dynamic,因此它更高级,如下所示:

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

这是从书-完整参考文献作者: Ed Burns & Chris Schalk

命令按钮 vs h: 按钮

H: commandButton | h: commandLinkH: 按钮 | h: 链接

后两个组件是在 2.0中引入的,以支持书签 JSF 页面,当与视图参数特性一起使用时。

H: 按钮 | h: 链接H: commandButton | h: commandLink .

首先,h:button|h:link使浏览器发出 HTTPGET 请求,而 h:commandButton|h:commandLink执行表单 POST 表示页中的任何组件具有由 用户,如文本字段,复选框等,不会自动 在使用 h:button|h:link时提交到服务器 值一起提交,额外的操作必须是 使用「检视参数」功能。

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

最后,也是最重要的一点就是要完全理解这一点 功能,h:button|h:link组件导致导航系统 被要求在呈现页面的过程中推导出结果,并且 这个问题的答案被编码在页面的标记中 相反,h:commandButton|h:commandLink组件会导致 将要求导航系统在 POSTBack 上导出结果 从页面。这是一个时间上的差异。渲染总是 发生在回信之前。

下面是 JSF javadocscommandButton action属性的解释:

时要调用的应用程序操作的 MethodExpression 此组件由用户激活。表达式必须计算 转换为不接受任何参数的公共方法,并返回一个 Object (调用 toString ()来获得逻辑结果) 传递给此应用程序的 NavigationHandler。

如果有人能解释一下这和这页上的答案有什么关系的话,我会很有启发性的。很明显,action指的是某个页面的文件名,而不是一个方法。