计算表单数据

Forms服务可以计算用户在表单中输入的值并显示结果。 要计算表单数据,必须执行两项任务。 首先,创建用于计算表单数据的表单设计脚本。 表单设计支持三种类型的脚本。 一种脚本类型在客户端上运行,另一种脚本类型在服务器上运行,第三种脚本类型在服务器和客户端上都运行。 本主题中讨论的脚本类型在服务器上运行。 HTML、PDF和表单指南(已弃用)转换支持服务器端计算。

在表单设计过程中,您可以利用计算和脚本来提供更丰富的用户体验。 计算和脚本可以添加到大多数表单字段和对象中。 您必须创建一个表单设计脚本,以对用户输入到交互式表单中的数据执行计算操作。

用户在表单中输入值并单击“计算”按钮以查看结果。 以下过程描述了一个允许用户计算数据的示例应用程序:

  • 用户访问名为StartLoan.html的HTML页面,该页面用作Web应用程序的起始页。 本页将调用名为GetLoanForm的Java Servlet。
  • GetLoanForm servlet会呈现贷款表单。 此表单包含脚本、交互字段、计算按钮和提交按钮。
  • 用户在表单的字段中输入值并单击“计算”按钮。 表单会发送到执行脚本的CalculateData Java Servlet。 表单会发送回用户,并且计算结果会显示在表单中。
  • 用户继续输入和计算值,直到显示满意的结果。 当用户满意后,单击“提交”按钮以处理表单。 表单会发送到另一个名为ProcessForm的Java Servlet,该Java Servlet负责检索已提交的数据。 (请参阅处理已提交的Forms。)

下图显示了应用程序的逻辑流程。

cf_cf_finsrv_loancalcapp_v1

下表介绍了此图中的步骤。

步骤

描述

1

从HTML开始页调用GetLoanForm Java Servlet。

2

GetLoanForm Java Servlet使用Forms服务客户端API将贷款表单呈现给客户端Web浏览器。 呈现包含配置为在服务器上运行的脚本的表单与呈现不包含脚本的表单之间的区别在于,您必须指定用于执行脚本的目标位置。 如果未指定目标位置,则不会执行配置为在服务器上运行的脚本。 例如,请考虑此部分中引入的应用程序。 CalculateData Java Servlet是执行脚本的目标位置。

3

用户将数据输入到交互字段中并单击“计算”按钮。 表单会发送到CalculateData Java Servlet,并在其中执行脚本。

4

表单会呈现回Web浏览器,并且计算结果会显示在表单中。

5

当值满意时,用户单击“提交”按钮。 表单将被发送到名为ProcessForm的另一个Java Servlet。

通常,作为PDF内容提交的表单包含在客户端上执行的脚本。 但是,也可以执行服务器端计算。 “提交”按钮不能用于计算脚本。 在这种情况下,不会执行计算,因为Forms服务认为交互已完成。

为了说明表单设计脚本的用法,本节将检查一个简单的交互式表单,该表单包含一个配置为在服务器上运行的脚本。 下图显示了一个表单设计,其中包含一个脚本,该脚本可添加用户在前两个字段中输入的值,并在第三个字段中显示结果。

cf_cf_caldata

A. 名为NumericField1的 字段B. 名为NumericField2的字 段C. A名为NumericField3的字段

位于此表单设计中的脚本的语法如下所示:

     NumericField3 = NumericField2 + NumericField1

在此表单设计中,“计算”按钮是一个命令按钮,脚本位于此按钮的Click事件中。 当用户在前两个字段(NumericField1和NumericField2)中输入值并单击“计算”按钮时,表单将被发送到Forms服务,并在该服务中执行脚本。 Forms服务将表单呈现回客户端设备,其计算结果显示在NumericField3字段中。

注意

有关创建表单设计脚本的信息,请参阅Forms Designer

注意

有关Forms服务的更多信息,请参阅AEM Forms的服务参考

步骤的摘要

要计算表单数据,请执行以下任务:

  1. 包括项目文件。
  2. 创建Forms客户端API对象。
  3. 检索包含计算脚本的表单。
  4. 将表单数据流写回客户端Web浏览器

包含项目文件

在开发项目中包含必需的文件。 如果您使用Java创建客户端应用程序,请包含必需的JAR文件。 如果您使用的是Web服务,请确保包含代理文件。

创建Forms客户端API对象

您必须先创建Forms服务客户端,然后才能以编程方式执行Forms服务客户端API操作。 如果您使用的是Java API,请创建一个FormsServiceClient对象。 如果您使用的是Forms Web服务API,请创建一个FormsServiceService对象。

检索包含计算脚本的表单

您可以使用Forms服务客户端API创建应用程序逻辑,以处理包含配置为在服务器上运行的脚本的表单。 该过程与处理提交的表单类似。 (请参阅处理已提交的Forms。)

验证与提交的表单关联的处理状态是1 (Calculate),这表示Forms服务正在对表单数据执行计算操作,结果必须写回给用户。 在这种情况下,将自动执行配置为在服务器上运行的脚本。

将表单数据流写回客户端Web浏览器

验证与提交的表单关联的处理状态为1后,必须将结果写回客户端Web浏览器。 显示表单时,计算值将显示在相应的字段中。

另请参阅

包括AEM Forms Java库文件

设置连接属性

Forms Service API快速入门

呈现交互式PDF forms

创建可渲染Forms的Web应用程序

使用Java API计算表单数据

使用Forms API(Java)计算表单数据:

  1. 包含项目文件

    将客户端JAR文件(如Java项目的类路径中的adobe-forms-client.jar)包含在内。

  2. 创建Forms客户端API对象

    • 创建包含连接属性的ServiceClientFactory对象。
    • 使用其构造函数创建FormsServiceClient对象,并传递ServiceClientFactory对象。
  3. 检索包含计算脚本的表单

    • 要检索包含计算脚本的表单数据,请使用其构造函数创建com.adobe.idp.Document对象,并从构造函数中调用javax.servlet.http.HttpServletResponse对象的getInputStream方法。

    • 调用FormsServiceClient对象的processFormSubmission方法并传递以下值:

      • 包含表单数据的com.adobe.idp.Document对象。
      • 一个字符串值,用于指定包括所有相关HTTP头的环境变量。 必须通过为CONTENT_TYPE环境变量指定一个或多个值来指定要处理的内容类型。 例如,要处理XML和PDF数据,请为此参数指定以下字符串值:CONTENT_TYPE=application/xml&CONTENT_TYPE=application/pdf
      • 指定HTTP_USER_AGENT标头值的字符串值;例如,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
      • 存储运行时选项的RenderOptionsSpec对象。

      processFormSubmission方法返回一个FormsResult对象,其中包含表单提交的结果。

    • 通过调用FormsResult对象的getAction方法,验证与提交的表单关联的处理状态是否为1。 如果此方法返回值1,则会执行计算,并且数据可以写回客户端Web浏览器。

  4. 将表单数据流写回客户端Web浏览器

    • 创建一个javax.servlet.ServletOutputStream对象,用于将表单数据流发送到客户端Web浏览器。
    • 通过调用FormsResult对象“s getOutputContent”方法创建com.adobe.idp.Document对象。
    • 通过调用com.adobe.idp.Document对象的getInputStream方法创建java.io.InputStream对象。
    • 通过调用InputStream对象的read方法并将字节数组作为参数传递,创建一个字节数组并用表单数据流填充该数组。
    • 调用javax.servlet.ServletOutputStream对象的write方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递到write方法。

另请参阅

包括AEM Forms Java库文件

设置连接属性

使用Web服务API计算表单数据

使用Forms API(Web服务)计算表单数据:

  1. 包含项目文件

    • 创建使用Forms服务WSDL的Java代理类。
    • 将Java代理类包含到类路径中。
  2. 创建Forms客户端API对象

    创建FormsService对象并设置身份验证值。

  3. 检索包含计算脚本的表单

    • 要检索发布到Java Servlet的表单数据,请使用其构造函数创建BLOB对象。

    • 使用javax.servlet.http.HttpServletResponse对象的getInputStream方法创建java.io.InputStream对象。

    • 使用java.io.ByteArrayOutputStream对象的构造函数并传递java.io.InputStream对象的长度,以创建该对象。

    • java.io.InputStream对象的内容复制到java.io.ByteArrayOutputStream对象中。

    • 通过调用java.io.ByteArrayOutputStream对象的toByteArray方法创建字节数组。

    • 通过调用setBinaryData方法并将字节数组作为参数进行传递来填充BLOB对象。

    • 使用RenderOptionsSpec对象的构造函数创建对象。 通过调用RenderOptionsSpec对象的setLocale方法并传递指定区域设置值的字符串值来设置区域设置值。

    • 调用FormsServiceClient对象的processFormSubmission方法并传递以下值:

      • 包含表单数据的BLOB对象。
      • 一个字符串值,用于指定包含所有相关HTTP头的环境变量。 例如,您可以指定以下字符串值:HTTP_REFERER=referrer&HTTP_CONNECTION=keep-alive&CONTENT_TYPE=application/xml
      • 指定HTTP_USER_AGENT标头值的字符串值;例如,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
      • 存储运行时选项的RenderOptionsSpec对象。 有关更多信息,请参阅。
      • 由方法填充的空BLOBHolder对象。
      • 由方法填充的空javax.xml.rpc.holders.StringHolder对象。
      • 由方法填充的空BLOBHolder对象。
      • 由方法填充的空BLOBHolder对象。
      • 由方法填充的空javax.xml.rpc.holders.ShortHolder对象。
      • 由方法填充的空MyArrayOf_xsd_anyTypeHolder对象。 此参数用于存储随表单一起提交的文件附件。
      • 由方法使用提交的表单填充的空FormsResultHolder对象。

      processFormSubmission方法使用表单提交结果填充FormsResultHolder参数。 processFormSubmission方法返回一个FormsResult对象,其中包含表单提交的结果。

    • 通过调用FormsResult对象的getAction方法,验证与提交的表单关联的处理状态是否为1。 如果此方法返回值1,则会执行计算,并且数据可以写回客户端Web浏览器。

  4. 将表单数据流写回客户端Web浏览器

    • 创建一个javax.servlet.ServletOutputStream对象,用于将表单数据流发送到客户端Web浏览器。
    • 通过调用FormsResult对象的getOutputContent方法,创建包含表单数据的BLOB对象。
    • 创建一个字节数组,并通过调用BLOB对象的getBinaryData方法来填充该数组。 此任务将FormsResult对象的内容分配给字节数组。
    • 调用javax.servlet.http.HttpServletResponse对象的write方法,将表单数据流发送到客户端Web浏览器。 将字节数组传递到write方法。

另请参阅

使用Base64编码调用AEM Forms

在此页面上