Sammanfattning av steg

Så här skapar du ett webbaserat program som återger formulär baserat på fragment:

  1. Skapa ett webbprojekt.
  2. Skapa Java-programlogik som representerar Java-servleten.
  3. Skapa webbsidan för webbprogrammet.
  4. Paketera webbprogrammet i en WAR-fil.
  5. Distribuera WAR-filen till J2EE-programservern.
  6. Testa webbprogrammet.
OBSERVERA
Vissa av dessa steg är beroende av J2EE-programmet som AEM Forms är distribuerat till. Vilken metod du använder för att distribuera en WAR-fil beror till exempel på vilken J2EE-programserver du använder. I det här avsnittet antas att AEM Forms distribueras på JBoss®.

Skapa ett webbprojekt

Det första steget för att skapa ett webbprogram som innehåller en Java-server som kan anropa Forms-tjänsten är att skapa ett webbprojekt. Den Java-IDE som det här dokumentet är baserat på är Eclipse 3.3. Med Eclipse IDE skapar du ett webbprojekt och lägger till de JAR-filer som behövs i projektet. Lägg slutligen till en HTML-sida med namnet index.html och en Java-servlet i ditt projekt.

I följande lista anges de JAR-filer som du måste lägga till i ditt webbprojekt:

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

Information om var dessa JAR-filer finns i Inkludera AEM Forms Java-biblioteksfiler.

Så här skapar du ett webbprojekt:

  1. Starta Eclipse och klicka på Arkiv > Nytt projekt.
  2. I dialogrutan Nytt projekt väljer du Webb > Dynamiskt webbprojekt.
  3. Skriv FragmentsWebApplication som namn på ditt projekt och klicka sedan på Slutför.

Så här lägger du till nödvändiga JAR-filer i ditt projekt:

  1. Högerklicka på FragmentsWebApplication-projektet i projektutforskarfönstret och välj Egenskaper.
  2. Klicka på Java build path och sedan på fliken Libraries .
  3. Klicka på knappen Lägg till externa JAR och bläddra till de JAR-filer som ska inkluderas.

Så här lägger du till en Java-servlet i ditt projekt:

  1. Högerklicka på FragmentsWebApplication-projektet i projektutforskarfönstret och välj Nytt > Annat.
  2. Expandera mappen Webb, markera Servlet och klicka sedan på Nästa.
  3. Skriv RenderFormFragment som namn på servern i dialogrutan Skapa server och klicka sedan på Slutför.

Så här lägger du till en HTML-sida i ditt projekt:

  1. Högerklicka på FragmentsWebApplication-projektet i projektutforskarfönstret och välj Nytt > Annat.
  2. Utöka mappen Webb, markera HTML och klicka på Nästa.
  3. Skriv index.html som filnamn i dialogrutan Nytt HTML och klicka sedan på Slutför.
OBSERVERA
Mer information om hur du skapar den HTML-sida som anropar Java-servern RenderFormFragment finns i Skapa webbsidan.

Skapa Java-programlogik för serverleten

Du skapar Java-programlogik som anropar Forms-tjänsten inifrån Java-servern. I följande kod visas syntaxen för Java-servern RenderFormFragment:

     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
             }

Normalt placerar du inte klientkod i en Java-serverds doGet- eller doPost-metod. En bättre programmeringspraxis är att placera den här koden i en separat klass, instansiera klassen inifrån metoden doPost (eller metoden doGet) och anropa lämpliga metoder. För kodrasteri begränsas dock kodexemplen i det här avsnittet till ett minimum och kodexempel placeras i metoden doPost.

Så här återger du ett formulär baserat på fragment med hjälp av Forms tjänst-API:

  1. Inkludera JAR-klientfiler, t.ex. adobe-forms-client.jar, i Java-projektets klassökväg. Mer information om platsen för dessa filer finns i Inkludera AEM Forms Java-biblioteksfiler.

  2. Hämta värdet för alternativknappen som skickas från formuläret HTML och ange om amerikansk eller kanadensisk information ska användas. Om USA skickas skapar du en com.adobe.idp.Document som lagrar data i Purchase Order US.xml. Om du har en kanadensisk version skapar du en com.adobe.idp.Document som lagrar data i filen Purchase Order Canada.xml .

  3. Skapa ett ServiceClientFactory-objekt som innehåller anslutningsegenskaper. (Se Ange anslutningsegenskaper.)

  4. Skapa ett FormsServiceClient-objekt med hjälp av dess konstruktor och skicka ServiceClientFactory-objektet.

  5. Skapa ett URLSpec-objekt som lagrar URI-värden med hjälp av dess konstruktor.

  6. Anropa URLSpec-objektets setApplicationWebRoot-metod och skicka ett strängvärde som representerar programmets webbrot.

  7. Anropa URLSpec-objektets setContentRootURI-metod och skicka ett strängvärde som anger innehållets rot-URI-värde. Kontrollera att formulärdesignen och fragmenten finns i innehållets rot-URI. Annars genereras ett undantag. Om du vill referera till AEM Forms-databasen anger du repository://.

  8. Anropa URLSpec-objektets setTargetURL-metod och skicka ett strängvärde som anger mål-URL-värdet som formulärdata skickas till. Om du definierar mål-URL:en i formulärdesignen kan du skicka en tom sträng. Du kan också ange den URL dit ett formulär ska skickas för att utföra beräkningar.

  9. Anropa FormsServiceClient-objektets renderPDFForm-metod och skicka följande värden:

    • Ett strängvärde som anger formulärdesignens namn, inklusive filnamnstillägget.
    • Ett com.adobe.idp.Document-objekt som innehåller data som ska sammanfogas med formuläret (skapat i steg 2).
    • Ett PDFFormRenderSpec-objekt som lagrar körningsalternativ. Mer information finns i AEM Forms API Reference.
    • Ett URLSpec-objekt som innehåller URI-värden som krävs av Forms-tjänsten för att återge ett formulär baserat på fragment.
    • Ett java.util.HashMap-objekt som lagrar bifogade filer. Det här är en valfri parameter och du kan ange null om du inte vill bifoga filer till formuläret.

    Metoden renderPDFForm returnerar ett FormsResult-objekt som innehåller en formulärdataström som måste skrivas till klientens webbläsare.

  10. Skapa ett com.adobe.idp.Document-objekt genom att anropa FormsResult-objektets getOutputContent-metod.

  11. Hämta innehållstypen för objektet com.adobe.idp.Document genom att anropa dess getContentType-metod.

  12. Ange innehållstypen för objektet javax.servlet.http.HttpServletResponse genom att anropa dess setContentType-metod och skicka innehållstypen för objektet com.adobe.idp.Document.

  13. Skapa ett javax.servlet.ServletOutputStream-objekt som används för att skriva formulärdataströmmen till klientwebbläsaren genom att anropa javax.servlet.http.HttpServletResponse-objektets getOutputStream-metod.

  14. Skapa ett java.io.InputStream-objekt genom att anropa com.adobe.idp.Document-objektets getInputStream-metod.

  15. Skapa en bytearray som fyller i den med formulärdataströmmen genom att anropa InputStream-objektets read-metod och skicka bytearrayen som ett argument.

  16. Anropa javax.servlet.ServletOutputStream-objektets write-metod för att skicka formulärdataströmmen till klientens webbläsare. Skicka bytearrayen till metoden write.

Följande kodexempel representerar den Java-server som anropar Forms-tjänsten och återger ett formulär baserat på fragment.

 /*
     * 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 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());
       }
     }
 }

Skapa webbsidan

På webbsidan index.html finns en startpunkt för Java-servleten och Forms-tjänsten anropas. Den här webbsidan är ett grundläggande formulär i HTML som innehåller två alternativknappar och en skicka-knapp. Alternativknapparnas namn är radio. När användaren klickar på skicka-knappen skickas formulärdata till Java-servern RenderFormFragment.

Java-servleten hämtar data som har skickats från HTML-sidan med följande Java-kod:

             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);
             }

Följande HTML-kod finns i filen index.html som skapades under installationen av utvecklingsmiljön. (Se Skapa ett webbprojekt.)

 <!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>

Paketera webbprogrammet

Om du vill distribuera den Java-server som anropar Forms-tjänsten paketerar du webbprogrammet i en WAR-fil. Se till att externa JAR-filer som komponentens affärslogik är beroende av, t.ex. adobe-livecycle-client.jar och adobe-forms-client.jar, också inkluderas i WAR-filen.

Så här paketerar du ett webbprogram till en WAR-fil:

  1. I fönstret Projektutforskaren högerklickar du på projektet FragmentsWebApplication och väljer Exportera > WAR-fil.
  2. Skriv FragmentsWebApplication som namn på Java-projektet i textrutan Webbmodul.
  3. I textrutan Mål skriver du FragmentsWebApplication.warsom filnamn, anger platsen för WAR-filen och klickar sedan på Slutför.

Distribuera WAR-filen till J2EE-programservern

Du kan distribuera WAR-filen till J2EE-programservern som AEM Forms distribueras på. När WAR-filen har distribuerats kan du komma åt HTML-webbsidan via en webbläsare.

Så här distribuerar du WAR-filen till J2EE-programservern:

  • Kopiera WAR-filen från exportsökvägen till [Forms Install]\Adobe\Adobe Experience Manager Forms\jboss\server\all\deploy.

Testa ditt webbprogram

När du har distribuerat webbprogrammet kan du testa det med en webbläsare. Om du använder samma dator som är värd för AEM Forms kan du ange följande URL:

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

    Markera en alternativknapp och klicka på knappen Skicka. Ett formulär som är baserat på fragment visas i webbläsaren. Om det uppstår problem läser du loggfilen för J2EE-programservern.

Experience Manager