计算表单数据

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

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

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

  • 用户访问名为StartLoan.html的HTML页,该页用作Web应用程序的开始页。 此页调用名为GetLoanForm的Java Servlet。
  • GetLoanForm servlet呈现贷款表单。 此表单包含一个脚本、交互字段、一个计算按钮和一个提交按钮。
  • 用户在表单的字段中输入值,然后单击“计算”按钮。 表单将发送到执行脚本的CalculateData Java Servlet。 表单将发回给用户,并且计算结果显示在表单中。
  • 用户继续输入和计算值,直到显示满意的结果。 当用户满意后,单击“提交”按钮以处理表单。 表单将发送到另一个名为ProcessForm的Java Servlet,该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. A名为NumericField2的 C. A名为NumericField3的字段

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

     NumericField3 = NumericField2 + NumericField1

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

注意

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

注意

有关Forms服务的详细信息,请参阅AEM Forms的服务参考。

步骤的摘要

要计算表单任务,请执行以下操作:

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

包括项目文件

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

创建Forms Client API对象

在以编程方式执行Forms服务客户端API操作之前,必须创建Forms服务客户端。 如果您使用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. 包括项目文件

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

  2. 创建Forms Client 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 Client 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

On this page

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now