FormsをレンダリングするWebアプリケーションの作成

FormsをレンダリングするWebアプリケーションの作成

Javaサーブレットを使用してFormsサービスを呼び出し、フォームをレンダリングするWebベースのアプリケーションを作成できます。 Java™サーブレットを使用する利点の1つは、クライアントWebブラウザーにプロセスの戻り値を書き込める点です。 つまり、フォームを返すFormsサービスとクライアントWebブラウザーの間のリンクとしてJavaサーブレットを使用できます。

メモ

ここでは、Formsサービスを呼び出し、フラグメントに基づいてフォームをレンダリングするJavaサーブレットを使用するWebベースのアプリケーションを作成する方法について説明します。 (フラグメントに基づくFormsのレンダリングを参照)。

Javaサーブレットを使用して、顧客がフォームにデータを表示して入力できるように、フォームをクライアントWebブラウザーに書き込むことができます。 フォームにデータを入力した後、Webユーザーはフォーム上の送信ボタンをクリックして、データを取得して処理できるJavaサーブレットに情報を送り返します。 例えば、データを別のプロセスに送信できます。

この節では、次の図に示すように、米国ベースのフォームデータとカナダベースのフォームデータのどちらかを選択できるWebベースのアプリケーションを作成する方法について説明します。

cw_cw_fragmentwebclient

レンダリングされるフォームは、フラグメントに基づくフォームです。 つまり、ユーザーが米国のデータを選択すると、返されるフォームは米国のデータに基づくフラグメントを使用します。 例えば、次の図に示すように、フォームのフッターには米国の住所が含まれています。

cw_cw_fragmentformfooter

同様に、ユーザーがカナダのデータを選択した場合、返されるフォームには、次の図に示すように、カナダの住所が含まれます。

cw_cw_fragmentformfootercnd

メモ

フラグメントに基づくフォームデザインの作成について詳しくは、Forms Designerを参照してください。

サンプルファイル

この節では、次の場所にあるサンプルファイルを使用します。

<>Forms Designerのインストールディレクトリ​>/Samples/Forms/発注/フォームフラグメント

ここで、<install directory​はインストールパスです。 クライアントアプリケーションの目的で、Purchase Order Dynamic.xdpファイルがこのインストール場所からコピーされ、Applications/FormsApplication​という名前のFormsアプリケーションにデプロイされました。 発注書のDynamic.xdpファイルは、FormsFolderという名前のフォルダーに配置されます。 同様に、次の図に示すように、フラグメントはFragmentsという名前のフォルダーに配置されます。

cw_cw_fragmentsrepository

発注書のDynamic.xdpフォームデザインにアクセスするには、フォーム名(renderPDFFormメソッドに渡される最初のパラメーター)としてApplications/FormsApplication/1.0/FormsFolder/Purchase Order Dynamic.xdpを指定し、コンテンツルートURI値としてrepository:///を指定します。

Webアプリケーションで使用されるXMLデータファイルが、DataフォルダーからC:\Adobe(AEM FormsをホストするJ2EEアプリケーションサーバーに属するファイルシステム)に移動されました。 ファイル名はPurchase Order Canada.xml​とPurchase Order US.xml​です。

メモ

Workbenchを使用したFormsアプリケーションの作成について詳しくは、workbenchヘルプを参照してください。

手順の概要

フラグメントに基づいてフォームをレンダリングするWebベースのアプリケーションを作成するには、次の手順を実行します。

  1. 新しいWebプロジェクトを作成します。
  2. Javaサーブレットを表すJavaアプリケーションロジックを作成します。
  3. Webアプリケーション用のWebページを作成します。
  4. WebアプリケーションをWARファイルにパッケージ化します。
  5. J2EEアプリケーションサーバーにWARファイルをデプロイします。
  6. Webアプリケーションをテストします。
メモ

これらの手順の一部は、AEM Formsのデプロイ先のJ2EEアプリケーションに依存します。 例えば、WARファイルのデプロイ方法は、使用しているJ2EEアプリケーションサーバーによって異なります。 この節では、AEM FormsがJBoss®にデプロイされていることを前提としています。

Webプロジェクトの作成

Formsサービスを呼び出すJavaサーブレットを含むWebアプリケーションを作成する最初の手順は、新しいWebプロジェクトを作成することです。 このドキュメントの基になるJava IDEはEclipse 3.3です。Eclipse IDEを使用して、Webプロジェクトを作成し、必要なJARファイルをプロジェクトに追加します。 最後に、index.html​という名前のHTMLページとJavaサーブレットをプロジェクトに追加します。

次のリストは、Webプロジェクトに追加する必要があるJARファイルを指定します。

  • adobe-forms-client.jar
  • adobe-livecycle-client.jar
  • adobe-usermanager-client.jar
  • adobe-utilities.jar

これらのJARファイルの場所については、「AEM Forms Javaライブラリファイルを含める」を参照してください。

Webプロジェクトを作成するには:

  1. Eclipseを起動し、File > New Project​をクリックします。
  2. 新しいプロジェクト​ダイアログボックスで、Web/動的Webプロジェクト​を選択します。
  3. プロジェクト名に「FragmentsWebApplication」と入力し、「完了」をクリックします。

必要なJARファイルをプロジェクトに追加するには:

  1. 「プロジェクトエクスプローラ」ウィンドウでFragmentsWebApplicationプロジェクトを右クリックし、「プロパティ」を選択します。
  2. Javaビルドパス」をクリックし、「ライブラリ」タブをクリックします。
  3. 外部JARを追加」ボタンをクリックし、含めるJARファイルを参照します。

Javaサーブレットをプロジェクトに追加するには:

  1. 「プロジェクトエクスプローラ」ウィンドウで、FragmentsWebApplicationプロジェクトを右クリックし、新規/その他​を選択します。
  2. Web​フォルダーを展開し、「Servlet」を選択して、「次へ」をクリックします。
  3. 「サーブレットを作成」ダイアログで、サーブレットの名前に「RenderFormFragment」と入力し、「完了」をクリックします。

プロジェクトにHTMLページを追加するには:

  1. 「プロジェクトエクスプローラ」ウィンドウで、FragmentsWebApplicationプロジェクトを右クリックし、新規/その他​を選択します。
  2. Web​フォルダーを展開し、「HTML」を選択して、「次へ」をクリックします。
  3. 新しいHTMLダイアログボックスで、ファイル名にindex.htmlと入力し、「完了」をクリックします。
メモ

RenderFormFragment Javaサーブレットを呼び出すHTMLページの作成について詳しくは、Webページの作成を参照してください。

サーブレットのJavaアプリケーションロジックの作成

Javaサーブレット内からFormsサービスを呼び出すJavaアプリケーションロジックを作成します。 次のコードは、RenderFormFragment Javaサーブレットの構文を示しています。

     public class RenderFormFragment extends HttpServlet implements Servlet { 
         public void doGet(HttpServletRequest req, HttpServletResponse resp 
         throws ServletException, IOException { 
         doPost(req,resp); 
          
         } 
         public void doPost(HttpServletRequest req, HttpServletResponse resp 
         throws ServletException, IOException { 
             //Add code here to invoke the Forms service 
             }

通常、クライアントコードはJavaサーブレットのdoGetまたはdoPostメソッド内に配置しません。 より良いプログラミング方法は、このコードを別のクラスに配置し、doPostメソッド(またはdoGetメソッド)内からクラスをインスタンス化して、適切なメソッドを呼び出すことです。 ただし、コードを簡潔にするために、この節のコード例は最小限に抑え、コード例はdoPostメソッドに配置します。

FormsサービスAPIを使用してフラグメントに基づいてフォームをレンダリングするには、次のタスクを実行します。

  1. Javaプロジェクトのクラスパスに、adobe-forms-client.jarなどのクライアントJARファイルを含めます。 これらのファイルの場所については、AEM Forms Java ライブラリファイルを含めるを参照してください。

  2. HTMLフォームから送信されるラジオボタンの値を取得し、米国データとカナダデータのどちらを使用するかを指定します。 Americanが送信された場合は、Purchase Order US.xml​にあるデータを保存するcom.adobe.idp.Documentを作成します。 同様に、カナダ人の場合は、 Purchase Order Canada.xml​ファイルにあるデータを保存するcom.adobe.idp.Documentを作成します。

  3. 接続プロパティを含む ServiceClientFactory オブジェクトを作成します。(接続プロパティの設定を参照。)

  4. コンストラクターを使用してFormsServiceClientオブジェクトを渡し、ServiceClientFactoryオブジェクトを作成します。

  5. コンストラクターを使用して、URI値を格納するURLSpecオブジェクトを作成します。

  6. URLSpecオブジェクトのsetApplicationWebRootメソッドを呼び出して、アプリケーションのWebルートを表す文字列値を渡します。

  7. URLSpecオブジェクトのsetContentRootURIメソッドを呼び出し、コンテンツルートURI値を指定する文字列値を渡します。 フォームデザインとフラグメントがコンテンツルートURIに配置されていることを確認します。 そうでない場合、Formsサービスは例外をスローします。 AEM Formsリポジトリを参照するには、repository://を指定します。

  8. URLSpecオブジェクトのsetTargetURLメソッドを呼び出し、フォームデータの投稿先となるターゲットURL値を指定する文字列値を渡します。 フォームデザインでターゲットURLを定義する場合は、空の文字列を渡すことができます。 演算を実行するためのフォームの送信先URLを指定することもできます。

  9. FormsServiceClientオブジェクトのrenderPDFFormメソッドを呼び出し、次の値を渡します。

    • ファイル名拡張子を含むフォームデザイン名を指定するstring値。
    • フォームとマージするデータを含むcom.adobe.idp.Documentオブジェクト(手順2で作成)。
    • 実行時オプションを格納するPDFFormRenderSpecオブジェクト。 詳しくは、「AEM Forms APIリファレンス」を参照してください。
    • フラグメントに基づいてフォームをレンダリングするためにFormsサービスで必要なURI値を含むURLSpecオブジェクト。
    • 添付ファイルを格納するjava.util.HashMapオブジェクト。 これはオプションのパラメーターで、フォームにファイルを添付しない場合はnullを指定できます。

    renderPDFFormメソッドは、クライアントのWebブラウザーに書き込む必要があるフォームデータストリームを含むFormsResultオブジェクトを返します。

  10. FormsResultオブジェクトのgetOutputContentメソッドを呼び出して、com.adobe.idp.Documentオブジェクトを作成します。

  11. getContentTypeメソッドを呼び出して、com.adobe.idp.Documentオブジェクトのコンテンツタイプを取得します。

  12. setContentTypeメソッドを呼び出し、com.adobe.idp.Documentオブジェクトのコンテンツタイプを渡すことで、javax.servlet.http.HttpServletResponseオブジェクトのコンテンツタイプを設定します。

  13. javax.servlet.http.HttpServletResponseオブジェクトのgetOutputStreamメソッドを呼び出して、フォームデータストリームをクライアントWebブラウザーに書き込むためのjavax.servlet.ServletOutputStreamオブジェクトを作成します。

  14. com.adobe.idp.DocumentオブジェクトのgetInputStreamメソッドを呼び出して、java.io.InputStreamオブジェクトを作成します。

  15. InputStreamオブジェクトのreadメソッドを呼び出し、バイト配列を引数として渡すことで、バイト配列にフォームデータストリームを入力します。

  16. javax.servlet.ServletOutputStreamオブジェクトのwriteメソッドを呼び出して、フォームデータストリームをクライアントWebブラウザーに送信します。 writeメソッドにバイト配列を渡します。

次のコード例は、Formsサービスを呼び出し、フラグメントに基づいてフォームをレンダリングするJavaサーブレットを表しています。

 /* 
     * This Java Quick Start uses the following JAR files 
     * 1. adobe-forms-client.jar 
     * 2. adobe-livecycle-client.jar 
     * 3. adobe-usermanager-client.jar 
     * 
     * (Because Forms quick starts are implemented as Java servlets, it is  
     * not necessary to include J2EE specific JAR files - the Java project 
     * that contains this quick start is exported as a WAR file which 
     * is deployed to the J2EE application server) 
     * 
     * These JAR files are located in the following path: 
     * <install directory>/sdk/client-libs 
     * 
     * For complete details about the location of these JAR files,  
     * see "Including AEM Forms library files" in Programming with AEM forms 
     */ 
 import java.io.File; 
 import java.io.FileInputStream; 
 import java.io.IOException; 
 import java.io.PrintWriter; 
  
 import javax.servlet.Servlet; 
 import javax.servlet.ServletException; 
 import javax.servlet.ServletOutputStream; 
 import javax.servlet.http.HttpServlet; 
 import javax.servlet.http.HttpServletRequest; 
 import javax.servlet.http.HttpServletResponse; 
 import com.adobe.livecycle.formsservice.client.*; 
 import java.util.*; 
 import java.io.InputStream; 
 import java.net.URL; 
  
 import com.adobe.idp.Document; 
 import com.adobe.idp.dsc.clientsdk.ServiceClientFactory; 
 import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties; 
  
 public class RenderFormFragment extends HttpServlet implements Servlet { 
      
     public void doGet(HttpServletRequest req, HttpServletResponse resp) 
         throws ServletException, IOException { 
             doPost(req,resp);  
  
     } 
     public void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
          
          
              
         try{ 
             //Set connection properties required to invoke AEM Forms                                 
             Properties connectionProps = new Properties(); 
             connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "https://[server]:[port]"); 
             connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);           
             connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss"); 
             connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator"); 
             connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password"); 
              
             //Get the value of selected radio button 
             String radioValue = req.getParameter("radio"); 
              
             //Create an Document object to store form data 
             Document oInputData = null;  
              
             //The value of the radio button determines the form data to use 
             //which determines which fragments used in the form 
             if (radioValue.compareTo("AMERICAN") == 0)            { 
                 FileInputStream myData = new FileInputStream("C:\\Adobe\Purchase Order US.xml"); 
                 oInputData = new Document(myData);  
             } 
             else if (radioValue.compareTo("CANADIAN") == 0)            { 
                 FileInputStream myData = new FileInputStream("C:\\Adobe\Purchase Order Canada.xml"); 
                 oInputData = new Document(myData);  
             } 
                      
             //Create a ServiceClientFactory object 
             ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps); 
                  
             //Create a FormsServiceClient object 
             FormsServiceClient formsClient = new FormsServiceClient(myFactory);  
          
             //Set the parameter values for the renderPDFForm method 
             String formName = "Applications/FormsApplication/1.0/FormsFolder/Purchase Order Dynamic.xdp";   
                                      
             //Cache the PDF form 
             PDFFormRenderSpec pdfFormRenderSpec = new PDFFormRenderSpec(); 
             pdfFormRenderSpec.setCacheEnabled(new Boolean(true)); 
          
             //Specify URI values that are required to render a form 
             //design based on fragments 
             URLSpec uriValues = new URLSpec();  
             uriValues.setApplicationWebRoot("https://[server]:[port]/RenderFormFragment"); 
             uriValues.setContentRootURI("repository:///"); 
             uriValues.setTargetURL("https://[server]:[port]/FormsServiceClientApp/HandleData"); 
                      
             //Invoke the renderPDFForm method and write the  
             //results to a client web browser 
             FormsResult formOut = formsClient.renderPDFForm( 
                         formName,               //formQuery 
                         oInputData,             //inDataDoc 
                         pdfFormRenderSpec,      //PDFFormRenderSpec 
                         uriValues,                //urlSpec 
                         null                    //attachments 
                         ); 
          
             //Create a Document object that stores form data 
             Document myData = formOut.getOutputContent(); 
          
             //Get the content type of the response and 
             //set the HttpServletResponse object’s content type 
             String contentType = myData.getContentType();  
             resp.setContentType(contentType); 
          
             //Create a ServletOutputStream object 
             ServletOutputStream oOutput = resp.getOutputStream(); 
          
             //Create an InputStream object 
             InputStream inputStream = myData.getInputStream(); 
          
             //Write the data stream to the web browser 
             byte[] data = new byte[4096]; 
             int bytesRead = 0; 
             while ((bytesRead = inputStream.read(data)) > 0) 
             { 
                 oOutput.write(data, 0, bytesRead); 
             } 
      
         }catch (Exception e) { 
              System.out.println("The following exception occurred: "+e.getMessage()); 
       } 
     } 
 }

Webページの作成

index.html Webページは、Javaサーブレットへのエントリポイントを提供し、Formsサービスを呼び出します。 このWebページは、2つのラジオボタンと1つの送信ボタンを含む基本的なHTMLフォームです。 ラジオボタンの名前はradioです。 ユーザーが「送信」ボタンをクリックすると、フォームデータがRenderFormFragment Javaサーブレットに送信されます。

Javaサーブレットは、次のJavaコードを使用して、HTMLページから投稿されるデータをキャプチャします。

             Document oInputData = null;  
              
             //Get the value of selected radio button 
             String radioValue = req.getParameter("radio"); 
                          
             //The value of the radio button determines the form data to use 
             //which determines which fragments used in the form 
             if (radioValue.compareTo("AMERICAN") == 0)            { 
                 FileInputStream myData = new FileInputStream("C:\\Adobe\Purchase Order US.xml"); 
                 oInputData = new Document(myData);  
             } 
             else if (radioValue.compareTo("CANADIAN") == 0)            { 
                 FileInputStream myData = new FileInputStream("C:\\Adobe\Purchase Order Canada.xml"); 
                 oInputData = new Document(myData);  
             }

次のHTMLコードは、開発環境のセットアップ中に作成されたindex.htmlファイルに含まれています。 (Webプロジェクトの作成を参照)。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 <html xmlns="https://www.w3.org/1999/xhtml"> 
 <head> 
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 <title>Untitled Document</title> 
 </head> 
  
 <body> 
 <form name="myform" action="https://[server]:[port]/FragmentsWebApplication/RenderFormFragment" method="post"> 
      <table> 
      <tr> 
        <th>Forms Fragment Web Client</th> 
      </tr> 
      <tr> 
        <td> 
          <label> 
          <input type="radio" name="radio" id="radio_Data" value="CANADIAN" /> 
          Canadian data<br /> 
          </label> 
          <p> 
            <label> 
            <input type="radio" name="radio" id="radio_Data" value="AMERICAN" checked/> 
            American data</label> 
          </p> 
        </td> 
      </tr> 
      <tr> 
      <td> 
        <label> 
          <input type="submit" name="button_Submit" id="button_Submit" value="Submit" /> 
            </label> 
            </td> 
         </tr> 
        </table> 
      </form>     
 </body> 
 </html>

Webアプリケーションのパッケージ化

Formsサービスを呼び出すJavaサーブレットをデプロイするには、WebアプリケーションをWARファイルにパッケージ化します。 コンポーネントのビジネスロジックが依存する外部JARファイル( adobe-livecycle-client.jarやadobe-forms-client.jarなど)もWARファイルに含めてください。

WebアプリケーションをWARファイルにパッケージ化するには:

  1. プロジェクトエクスプローラー​ウィンドウで、FragmentsWebApplicationプロジェクトを右クリックし、エクスポート/WARファイル​を選択します。
  2. Web module」テキストボックスに、Javaプロジェクトの名前としてFragmentsWebApplicationと入力します。
  3. 宛先」テキストボックスに、ファイル名にFragmentsWebApplication.war​と入力し、WARファイルの場所を指定して、「完了」をクリックします。

J2EEアプリケーションサーバーへのWARファイルのデプロイ

WARファイルは、AEM FormsがデプロイされているJ2EEアプリケーションサーバーにデプロイできます。 WARファイルをデプロイしたら、Webブラウザーを使用してHTML Webページにアクセスできます。

J2EEアプリケーションサーバーにWARファイルをデプロイするには:

  • 書き出しパスのWARファイルを​[Forms Install]\Adobe\Adobe Experience Manager Forms\jboss\server\all\deployにコピーします。

Webアプリケーションのテスト

Webアプリケーションをデプロイした後は、Webブラウザーを使用してテストできます。 AEM Formsをホストするコンピューターを使用している場合は、次のURLを指定できます。

  • http://localhost:8080/FragmentsWebApplication/index.html

    ラジオボタンを選択し、「送信」ボタンをクリックします。 フラグメントに基づくフォームがWebブラウザーに表示されます。 問題が発生した場合は、J2EEアプリケーションサーバーのログファイルを参照してください。

このページ