在 JSF2中,h:button和 h:commandButton之间的区别是什么?
h:button
h:commandButton
单击 h:button会发出一个书签 GET请求。
GET
h:commandbutton不发出 get 请求,而是发出 POST 请求,将表单数据发送回服务器。
h:commandbutton
<h:button>
<h:button>生成一个 HTML <input type="button">。生成的元素使用 JavaScript 导航到属性 outcome给出的页面,使用 HTTPGET 请求。
<input type="button">
outcome
例如。
<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,使其看起来像一个按钮。
onclick
<h:outputLink>
<h:link>
<a>
请注意,虽然您可以在 outcome属性中放置引用方法的 EL 表达式,
<h:button value="GET button" outcome="#{bean.getOutcome()}" />
当你点击这个按钮时,它将被调用 没有。相反,当包含按钮的页面仅仅为了获得嵌入到生成的 onclick代码中的导航结果而呈现时,已经调用了它。如果您曾经尝试使用 outcome="#{bean.action}"中的操作方法语法,那么在面对 ELException: 在 com.example.Bean 类中找不到属性 actionMethod时,您可能已经被这个错误/误解所暗示。
outcome="#{bean.action}"
如果您打算作为 POST 请求的结果调用一个方法,请改用 <h:commandButton>,请参见下文。或者,如果您打算调用方法作为 GET 请求的结果,请转到 在页面加载时调用 JSF 托管 bean 操作,或者如果您还通过 <f:param>,如何在页面加载时处理后台 bean 中的 GET 查询字符串 URL 参数?拥有 GET 请求参数
<h:commandButton>
<f:param>
<h:commandButton>生成一个 HTML <input type="submit">按钮,该按钮默认使用 HTTP POST 方法提交父 <h:form>,并调用附加到 action、 actionListener和/或 <f:ajax listener>(如果有的话)的操作。<h:form>是必需的。
<input type="submit">
<h:form>
action
actionListener
<f:ajax listener>
<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 就变成可书签的。
?faces-redirect=true
<h:commandButton>通常专门用于提交 POST 表单,而不是执行页到页导航。通常,action指向一些业务操作,例如将表单数据保存到 DB 中,这将返回 String结果。
String
<h:commandButton ... action="#{bean.save}" />
和
public String save() { // ... return "otherpage"; }
返回 null或 void将使您回到相同的视图。也返回一个空字符串,但它将重新创建任何视图范围内的 bean。现在,使用现代 JSF2和 <f:ajax>,动作通常只返回到相同的视图(因此,null或 void) ,其中结果是由 ajax 有条件地呈现的。
null
void
<f: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: commandLink和 H: 按钮 | h: 链接 ?
后两个组件是在 2.0中引入的,以支持书签 JSF 页面,当与视图参数特性一起使用时。
2.0
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 上导出结果 从页面。这是一个时间上的差异。渲染总是 发生在回信之前。
首先,h:button|h:link使浏览器发出 HTTPGET 请求,而 h:commandButton|h:commandLink执行表单 POST 表示页中的任何组件具有由 用户,如文本字段,复选框等,不会自动 在使用 h:button|h:link时提交到服务器 值一起提交,额外的操作必须是 使用「检视参数」功能。
h:button|h:link
h:commandButton|h:commandLink
这两种组件之间的第二个主要区别是 h:button|h:link有一个 result 属性来描述接下来要去哪里 而 h:commandButton|h:commandLink为此使用一个 action 属性 这是因为前者不会导致 ActionEvent 在事件系统中,而后者。
最后,也是最重要的一点就是要完全理解这一点 功能,h:button|h:link组件导致导航系统 被要求在呈现页面的过程中推导出结果,并且 这个问题的答案被编码在页面的标记中 相反,h:commandButton|h:commandLink组件会导致 将要求导航系统在 POSTBack 上导出结果 从页面。这是一个时间上的差异。渲染总是 发生在回信之前。
下面是 JSF javadocs对 commandButton action属性的解释:
commandButton
时要调用的应用程序操作的 MethodExpression 此组件由用户激活。表达式必须计算 转换为不接受任何参数的公共方法,并返回一个 Object (调用 toString ()来获得逻辑结果) 传递给此应用程序的 NavigationHandler。
如果有人能解释一下这和这页上的答案有什么关系的话,我会很有启发性的。很明显,action指的是某个页面的文件名,而不是一个方法。