h:button
在 JSF 2 中,和有什么区别h:commandButton
?
5 回答
<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.ELException: 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>
并调用附加到和/或的操作(如果有)。是必需的。action
actionListener
<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";
}
返回null
或void
将带您回到相同的视图。也返回一个空字符串,但它会重新创建任何视图范围的 bean。如今,使用现代 JSF2 和<f:ajax>
,操作往往只是返回到相同的视图(因此,null
或void
),其中结果由 ajax 有条件地呈现。
public void save() {
// ...
}
也可以看看:
h:button
- 点击一个h:button
发出书签的GET
请求。
h:commandbutton
- 代替 get 请求,h:commandbutton
发出 POST 请求,将表单数据发送回服务器。
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" />
这摘自本书 - Ed Burns 和 Chris Schalk 的完整参考书
h:commandButton vs h:button
h:commandButton|h:commandLink和 h:button|h:link有什么区别?
后两个组件被引入2.0
以启用可添加书签的 JSF 页面,当与 View Parameters 功能一起使用时。
h:button|h:link和 h: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 之前。
以下是JSF javadocs关于该commandButton
action
属性的内容:
MethodExpression 表示用户激活此组件时要调用的应用程序操作。该表达式必须计算为不带参数的公共方法,并返回一个对象(调用其 toString() 以得出逻辑结果),该对象被传递给此应用程序的 NavigationHandler。
如果有人能解释这与本页上的任何答案有什么关系,那将对我很有启发。似乎很清楚action
指的是某个页面的文件名而不是方法。