【问题标题】:How is a4j:form submitted when a4j:commandButton has no "action" attributea4j:commandButton 没有“action”属性时如何提交 a4j:form
【发布时间】:2012-07-20 09:09:38
【问题描述】:

目前我正在学习 RichFaces 并阅读了一些现场演示,http://livedemo.exadel.com/richfaces-demo/richfaces/commandButton.jsf?c=commandButton&tab=usage

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:a4j="http://richfaces.org/a4j"
  xmlns:rich="http://richfaces.org/rich">

<style>
    .gridhello {
        border-collapse : collapse;
    }
    .gridhellocolumn {
        padding-left : 0;
    }
    .outhello {
        font-weight: bold;
    }
</style>

<a4j:form>
    <h:panelGrid columns="3" styleClass="gridhello" columnClasses="gridhellocolumn">
        <h:outputText value="Name:" />
        <h:inputText value="#{userBean.name}" />
        **<a4j:commandButton value="Say Hello" reRender="out" />**
    </h:panelGrid>
</a4j:form>
<rich:spacer height="7"/>
<br />
<h:panelGroup id="out">
    <h:outputText value="Hello " rendered="#{not empty userBean.name}" styleClass="outhello" />
    <h:outputText value="#{userBean.name}" styleClass="outhello" />
    <h:outputText value="!" rendered="#{not empty userBean.name}" styleClass="outhello" />
</h:panelGroup>

<br />

代码行没有“action”属性,我只是想知道它是如何工作的,在这种情况下调用 back bean 的默认方法是什么,以便更新 userBean.name?

提前致谢!

【问题讨论】:

    标签: jsf richfaces jsf-1.2


    【解决方案1】:

    当您进行提交时,表单数据被发送到托管 bean 的映射属性中。这是UICommands 的默认行为:&lt;h:commandButton&gt;&lt;h:commandLink&gt;&lt;a4j:commandButton&gt;&lt;a4j:commandLink&gt; 和其他类似&lt;a4j:jsFunction&gt; 的行为。即使您没有声明要执行的操作,表单数据也会通过 POST 请求提交到服务器,并且 JSF 生命周期将触发。作为生命周期的一部分,在更新模型阶段,JSF 将从组件绑定的数据设置为托管 bean 属性,然后调用应用程序阶段将执行任何操作(如果可用),最后渲染响应阶段将生成响应并更新视图(JSP、Facelets)。在这种情况下,由于是 ajax 调用,视图将被更新;更准确地说,id 为"out" 的组件将被更新。请注意,"out" 内容在&lt;a4j:form&gt; 之外,此处的值不会发送到服务器,reRender 仍然会使用视图模型值更新它们的值。

    更新:

    &lt;h:inputText value="#{userBean.name}" 行将UserBean 托管bean 的name 属性与&lt;h:inputText&gt; 组件的值绑定。这是来自 JSF 的一个基本概念。请记住,RichFaces 不是 JSF 实现,它扩展了框架并添加了对 RIA 的 ajax 支持等功能。

    这一行

    <h:outputText value="#{userBean.name}" styleClass="outhello" />
    

    意思是:将UserBean托管bean的name属性的值绑定到outputText组件。尽管如此,这还是在表单之外,因此该组件的实际值不会在服务器上发送。

    了解更多 JSF 的一些资源:

    【讨论】:

    • 嗨 Luiggi,感谢您的详细解释!但是,在您的 cmets 之后,还有一件事我在这里不太清楚。 没有 name 属性,也没有绑定到 back bean 的任何字段。 RichFaces/JSF 在提交这个表单时,如何判断这个 inputText 和 back bean 的某个字段之间的联系?如果您向我指出有关此问题的一些文档,那就太好了。我可以自己进一步阅读。提前致谢!
    • @user1540244 答案已编辑。一个建议:在你开始学习 RichFaces(或其他基于 JSF 的框架,如 PrimeFaces 或 OmniFaces)之前,我建议你对普通 JSF 有一个很好的理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2020-03-19
    • 2011-05-14
    • 2010-12-04
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多