`
yingfang05
  • 浏览: 122773 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

借助 Ajax 自动保存 JSF 表单之一

    博客分类:
  • jsf
阅读更多
在客户端获取表单数据

本节将给出一个 JSF 表单,其数据通过 JavaScript 和 DOM 在 Web 浏览器中获得。 您可以在自已的 Web 表单应用程序中重用这里介绍的 JavaScript 代码。本节还将解释如何正确地编码表单数据以将它提交给服务器。

构建 JSF 表单

让我们先来看一个典型的 JSF 例子。SupportForm.jsp 这个页面包括一些基本 HTML 的元素,比如输入框、列表、单选按钮、复选框和提交按钮。所有输入组件都将其值绑定到称为 SupportBean 的 JavaBean 属性。这个页面的头部包括一个 <script> 标记,用来导入 AutoSaveScript.js 文件。此 JavaScript 文件包括一个函数,名为 setAutoSaving(),它在 <body> 标记的 onload 属性内调用,以便在 Web 浏览器加载页面后激活表单的自动保存功能。接下来显示了 SupportForm.jsp 页的部分源代码。

包含示例 JSF 表单的 SupportForm.jsp 页
               
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>

<html>
<head>
<title>Support Form</title>
    <script src="AutoSaveScript.js">
    </script>
</head>
<body onload="setAutoSaving(10000)">

<f:view>

    <h1>Support Form</h1>

    <h:form id="supportForm">

        <p><h:outputText value="Name: "/>
        <h:message for="name"/><br>
        <h:inputText id="name" value="#{supportBean.name}"
                size="40" required="true">
        </h:inputText>
        ...
        <p><h:outputText value="Platform: "/>
        <h:message for="platform"/><br>
        <h:selectOneRadio id="platform" value="#{supportBean.platform}"
                layout="lineDirection" required="true">
            <f:selectItem itemValue="Windows" itemLabel="Windows"/>
            <f:selectItem itemValue="Linux" itemLabel="Linux"/>
            <f:selectItem itemValue="Mac" itemLabel="Mac"/>
        </h:selectOneRadio>
        ...
        <p><h:outputText value="Problem: "/>
        <h:message for="problem"/><br>
        <h:inputTextarea id="problem" value="#{supportBean.problem}"
                rows="10" cols="40" required="true"/>

        <p><h:commandButton id="submit" value="Submit"
            action="#{supportBean.submit}"/>

    </h:form>

</f:view>

</body>
</html>

当用户为了打开 JSF 页面而单击一个 JSF 链接或输入一个 URL 时,Web 浏览器会构建 HTTP 请求并把此请求发送至 Web 服务器,服务器识别包含页面的应用程序并会调用 FacesServlet(在 web.xml 内配置)来处理此请求。在进行了某些上下文初始化后,就会执行此页面,而且,JSF 框架还会创建组件树以镜像该 Web 页面所用的 JSF 标记。这些组件的呈现程序生成含有表单元素的 HTML 代码。

SupportForm.jsp 页面生成的 HTML 代码
               
<html>
<head>
<title>Support Form</title>
    <script src="AutoSaveScript.js">
    </script>
</head>
<body onload="setAutoSaving(10000)">

    <h1>Support Form</h1>

    <form id="supportForm" method="post"
        action="/autosave/faces/SupportForm.jsp"
        enctype="application/x-www-form-urlencoded">

        <p>Name: <br>
        <input id="supportForm:name" type="text"
            name="supportForm:name" size="40" />
        ...
        <p>Platform: <br>
        <table id="supportForm:platform">
        <tr>
            <td><label><input type="radio" name="supportForm:platform"
                value="Windows"> Windows</input></label></td>
            <td><label><input type="radio" name="supportForm:platform"
                value="Linux"> Linux</input></label></td>
            <td><label><input type="radio" name="supportForm:platform"
                value="Mac"> Mac</input></label></td>
        </tr>
        </table>
        ...
        <p>Problem: <br>
        <textarea id="supportForm:problem" name="supportForm:problem"
            cols="40" rows="10">
        </textarea>

        <p><input id="supportForm:submit" type="submit"
            name="supportForm:submit" value="Submit" />

        <input type="hidden" name="com.sun.faces.VIEW"
            value="H4sIAA..." />
        <input type="hidden" name="supportForm" value="supportForm" />

    </form>

</body>
</html>

在这个 HTML 表单的结尾,有一些隐藏元素。如果 javax.faces.STATE_SAVING_METHOD 参数在web.xml 文件中被设为 client,那么 JSF 实现会内部使用这些隐藏元素以识别所提交的表单和存储组件树在请求间的状态。从浏览器的角度看,一个 JSF 表单与其他 HTML 表单无异,可以使用 JavaScript 和DOM 在 Web 浏览器中访问表单元素。

获取及编码表单数据

AutoSaveScript.js 文件包含一个称为 getFormData() 的 JavaScript 函数,它获取一个 form 对象并对其元素进行迭代以构建包含名称-值对的字符串。这个字符串遵循标准的 application/x-www-form-urlencoded 格式,用 & 分隔参数,并在每个参数的名称和值之间使用 =。内部函数 addParam() 可以对单一参数进行编码,所使用的是 JavaScript API 提供的 escape() 函数。escape() 函数用 % 后跟被编码字符的两位 16 进制码代替了几乎所有非字母数字的 ASCII 字符。 我之所以说 “几乎所有非字母数字的 ASCII 字符”,是因为除此之外,还有字母数字字符以及无编码的其他一些字符(例如 +)。

例如,如果将字符串 a + b 传递给 escape(),结果将是 a%20+%20b(20 是空格符的 16 进制码)。这是一个符合 RFC 1738 的有效 URL 编码,但如果将这个已编码的字符串提交给服务器端脚本,例如JSP,结果将是一个空格而不是 + 字符。这也是正确的,因为描述 application/x-www-form-urlencoded 格式的RFC 1866 中规定空格符的编码为 +,并且所有非字母数字字符都以一个 % 后跟 16 进制码替代。当服务器对这个字符串进行解码时,任何 + 字符都会被还原成一个空格。

总之,由 escape() 执行的 URL 编码并不完全与 application/x-www-form-urlencoded 一样,因为 escape() 将 + 字符保留,不做编码,而在 application/x-www-form-urlencoded 中,空格则被编码为 + 字符。解决这个问题最简单的方法是将所有 + 字符都编码为 %2B(2B 是 + 的 16 进制代码)。也可以使用replace() 对 escape() 的返回结果执行此操作。在本例中,可以将字符串 a + b 编码为 a%20%2B%20b。下列所示的是 addParam() 内部函数,它将一个编码后的名称-值对添加到 getFormData() 的本地dataString 变量。

对单一请求参数进行编码
               
function getFormData(form) {
    var dataString = "";

    function addParam(name, value) {
        dataString += (dataString.length > 0 ? "&" : "")
            + escape(name).replace(/\+/g, "%2B") + "="
            + escape(value ? value : "").replace(/\+/g, "%2B");
    }
    ...
}

getFormData() 函数获取 form 对象的 elements 数组,并根据每个元素的类型调用 addParam()。单个名称-值会针对每个文本框、密码和隐藏字段添加。只有当对应的表单元素被选中时,复选框和单选按钮的值才会被编码。如果是列表,单个名称-值对会针对每个选中项添加。之后,getFormData() 会返回包含表单编码数据的字符串。

function getFormData(form) {
    ...
    var elemArray = form.elements;
    for (var i = 0; i < elemArray.length; i++) {
        var element = elemArray[i];
        var elemType = element.type.toUpperCase();
        var elemName = element.name;
        if (elemName) {
            if (elemType == "TEXT"
                    || elemType == "TEXTAREA"
                    || elemType == "PASSWORD"
                    || elemType == "HIDDEN")
                addParam(elemName, element.value);
            else if (elemType == "CHECKBOX" && element.checked)
                addParam(elemName,
                    element.value ? element.value : "On");
            else if (elemType == "RADIO" && element.checked)
                addParam(elemName, element.value);
            else if (elemType.indexOf("SELECT") != -1)
                for (var j = 0; j < element.options.length; j++) {
                    var option = element.options[j];
                    if (option.selected)
                        addParam(elemName,
                            option.value ? option.value : option.text);
                }
        }
    }
    return dataString;
}
分享到:
评论

相关推荐

    ajax4jsf实例

    - **与ICEfaces对比**:ICEfaces提供了完整的端到端Ajax解决方案,包括自动Ajax化JSF组件,但在某些情况下可能不如Ajax4JSF灵活。 ### 6. 总结 Ajax4JSF是JSF应用中实现Ajax功能的一个便捷工具,它简化了Ajax集成...

    ajax4jsf.zip

    Ajax4JSF(Ajax for JavaServer Faces)是JavaServer Faces(JSF)框架的一个扩展,旨在提供一个简单且强大的方式来整合Ajax功能于JSF应用之中。它允许开发者在不离开JSF生命周期的情况下,利用Ajax进行页面的异步...

    ajax4jsf使用中文手册

    Ajax4JSF(全称是Ajax for JavaServer Faces)是一种集成在JavaServer Faces(JSF)框架中的Ajax库,它允许开发者在JSF应用程序中轻松实现异步数据更新,提供更流畅的用户体验。这份中文手册详细介绍了如何将Ajax...

    ajax4jsf-demo

    **Ajax4JSF-Demo 知识点详解**...综上所述,"ajax4jsf-demo"项目为学习和掌握Ajax4JSF库提供了一个实用的起点,通过深入研究和实践,开发者可以将Ajax4JSF的强大力量应用到自己的JSF项目中,提升应用的用户体验和效率。

    jboss-ajax4jsf-1.1.1-src

    【标题】"jboss-ajax4jsf-1.1.1-src" 是一个开源项目,主要涉及Ajax4jsf框架的源代码版本,版本号为1.1.1。Ajax4jsf是针对JavaServer Faces (JSF) 技术的一个扩展,它允许开发者在JSF应用中无缝集成Ajax功能,提升...

    Ajax4jsf 用户手册

    **Ajax4jsf 用户手册** 是一份详细的指南,旨在帮助开发者了解如何在JavaServer Faces (JSF)项目中集成和使用Ajax4jsf框架。该框架使得在JSF环境中实现Ajax功能变得更加简单,无需编写JavaScript代码,而是通过一组...

    JSF全套(JSF入门教+ LIB+ Ajax4JSF使用手册 )

    这个部分将教你如何配置JSF环境,创建第一个JSF应用,理解JSF生命周期,以及认识JSF的核心组件如输入字段、按钮、表单等。通过这个教程,你可以快速掌握JSF的基础操作。 2. **JSF标签**:JSF的UI组件是以标签的形式...

    ajax4jsf jar

    ajax4jsf jar ajax4jsf jar

    AJAX4JSF級聯

    AJAX4JSF級聯,實現省份與城市,只是一個簡單的Demo,沒有詳細省市資料.

    seam+jsf+richfaces+ajax4jsf 电子书

    例如,Seam可以自动处理RichFaces和Ajax4jsf组件之间的通信,提供统一的依赖注入和事务管理。通过Seam,开发者可以更专注于业务逻辑,而不是底层技术细节。 在学习这些技术时,电子书中可能会涵盖以下主题: - ...

    ajax 4jsf用户指南中文版

    - **简介**:Ajax4JSF是一款开源框架,其主要目标是为JavaServer Faces(JSF)项目添加Ajax功能,无需编写JavaScript代码。 - **特点**: - 充分利用JSF框架的优点,如生命周期管理、验证和转换等。 - 提供高度可...

    ajax4jsf教程

    后来,Ajax4JSF被并入到了RichFaces中,成为其核心组件之一。因此,学习Ajax4JSF也意味着掌握了RichFaces的部分功能。 总结来说,Ajax4JSF为JavaServer Faces开发提供了强大的AJAX支持,通过简单的配置和组件使用,...

    ajax4jsf-1.1.0.jar

    ajax4jsf.jar是在jsf中封装应用ajax功能的包,其优点是不用编写ajax的代码

    ajax4jsf中文用户指南

    Ajax4JSF(Ajax for JavaServer Faces)是一个开源框架,专为JavaServer Faces(JSF)应用程序添加Ajax功能。这个框架使得开发者无需编写JavaScript代码就能实现丰富的用户界面和交互性。Ajax4JSF充分利用JSF的优势...

    ajax4jsf.jar

    ajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jarajax4jsf.jar

    jsf+facelets+ajax4jsf的全部jar包

    6. **开发实践**:在实际开发中,开发者可以通过JSF的Managed Beans定义业务逻辑,使用Facelets创建视图,并借助Ajax4jsf实现实时的用户交互。例如,通过Ajax4jsf的AjaxBehavior事件,可以在用户触发某个操作时仅...

    ajax4jsf-1.1.1.jar.zip

    Ajax4JSF(Ajax for JavaServer Faces)是JavaServer Faces(JSF)框架的一个扩展,它为开发者提供了在JSF应用程序中集成Ajax功能的能力。这个开源项目旨在简化开发过程,使开发者能够在不离开JSF环境的情况下创建...

    Jboss ajax4jsf bin

    **AJAX4JSF** 是一个开源项目,由Red Hat开发并维护,旨在为JSF提供强大的AJAX支持。AJAX(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据并...

    ajax4jsf使用手册

    - **Ajax 请求触发**:通过在JSF组件上添加Ajax4JSF的行为,如`&lt;a4j:commandButton execute="@form" render="@form"&gt;`,可以触发一个Ajax请求,并更新整个表单。 - **局部更新**:使用`render`属性指定需要更新的...

    ajax4jsf中文教程

    发送一个AJAX 请求 决定发送什么 决定改变什么 4. Ajax4JSF 组件库 a4j:ajaxListener a4j:region a4j:page a4j:support a4j:commandLink a4j:commandButton a4j:outputPanel a4j:actionparam a4j:status ...

Global site tag (gtag.js) - Google Analytics