Erstellen von Data Management-Anwendungen durch manuelles Anlegen von Java-Serverklassen

Vorausgesetzte Kenntnisse

Dieser Entwicklerartikel ist für Java- und ActionScript-Entwickler gedacht, die Anwendungen für LiveCycle Data Services erstellen möchten.

Anwenderebene

Fortgeschr.

Sie können eine LiveCycle Data Services-Anwendung programmgesteuert erstellen, um Daten in einer relationalen Datenbank zu verwalten. Der Adobe LiveCycle Data Services Data Management-Dienst automatisiert die Datensynchronisierung zwischen einer Adobe Flex-Clientanwendung und einer mittleren Ebene. Sie können Anwendungen erstellen, die eine Datensynchronisierung, On-Demand-Datenpaging und gelegentlich verbundene Anwendungsdienste bereitstellen. Darüber hinaus können Sie große Datensammlungen und verschachtelte Datenbeziehungen verwalten, z. B. Eins-zu-Eins- und Viele-zu-Eins-Verbindungen.

Die in diesem Artikel entwickelte Anwendung legt die Java-Serverklassen manuell an. Klassen wie die Assembler-Klasse werden also mit einer Java-IDE angelegt und dann auf dem Anwendungsserver bereitgestellt, auf dem LiveCycle Data Services gehostet ist. Anstatt Serverklassen manuell zu erstellen, können Sie die Adobe-Modellierungstechnik verwenden. Bei Verwendung der Adobe-Modellierungstechnik werden die Java-Serverklassen angelegt, ohne dass dies manuell mit einer Java-IDE geschehen muss. Die erzeugten Java-Klassen basieren auf dem Modell. Ein Vorteil der Modellierungstechnik besteht darin, dass dadurch die erforderliche Java-Programmierung reduziert wird. Der Vorteil beim manuellen Anlegen einer Data Management-Anwendung besteht auch darin, dass Sie die Serverklassen genauer steuern können. Sie können beispielsweise die vorhandene benutzerdefinierte Java DAO-Anwendungslogik nutzen.

Sie können nicht nur Java-Serverklassen anlegen, sondern auch Anwendungslogiken für den Clientanwendungs-Build mit Flash Builder 4 erstellen. Die folgende Abbildung zeigt die Java-Serverklassen und die Clientanwendung, die mit Flash Builder angelegt wurden.

Data Services

Die folgende Tabelle beschreibt die Schritte dieser Abbildung.

Schritt Beschreibung
1 Eine Clientanwendung, die mit Flash Builder erstellt wurde, nutzt Abläufe, die von der Assembler-Klasse bereitgestellt werden. Beispielsweise gibt die Fill-Funktion der Assembler-Klasse alle Daten in einer bestimmten Tabelle zurück. Die Daten können in einer Steuerung wie Data Grid angezeigt werden. (Eine Abbildung dieser Clientanwendung wird nach dieser Tabelle gezeigt.)
2 Java-Serverklassen werden auf dem Anwendungsserver bereitgestellt, der als Host für die LiveCycle Data Services dient. Sie können die Data Service-Klassen, die auf dem Server bereitgestellt werden, der als Host für Data Services dient, manuell anlegen.
3 Die Java-Serverklassen führen Datenbankoperationen in einer relationalen Datenbank durch. Beispielsweise können Daten abgerufen und an alle Clientanwendungen gesendet werden.

Die in diesem Artikel verwendete Datenbank basiert auf der Produkttabelle. Diese Tabelle befindet sich in der mit LiveCycle Data Services aufrufbaren Beispieldatenbank. Die Produkttabelle enthält die folgenden Felder:

  • PRODUKT_ID: Legt eine eindeutige Kennung für dieses Element fest (dieses Feld dient als PK)
  • NAME: Gibt den Produktnamen an
  • KATEGORIE: Gibt die Kategorie an, der das Produkt angehört
  • PREIS: Speichert den Preis des Artikels
  • BILD: Gibt eine Grafikdatei für den Artikel an
  • BESCHREIBUNG: Gibt eine Beschreibung des Elements an
  • LAGERMENGE: Gibt die Anzahl der auf Lager befindlichen Artikel an

Die folgende Abbildung zeigt eine Clientanwendung, die mithilfe von Flash Builder erstellt wurde und Datensätze aus der Produkttabelle anzeigt. Dieser Entwicklerartikel enthält eine schrittweise Beschreibung, wie diese Clientanwendung erstellt wird.

Daten abrufen

So erstellen Sie eine LiveCycle Data Service-Anwendung durch manuelles Anlegen von Java-Serverklassen:

  1. Legen Sie die Java-Serverklassen an.

  2. Stellen Sie die Java-Serverklassen bereit.

  3. Konfigurieren Sie LiveCycle Data Services für die Verwendung der Serverklassen.

  4. Starten Sie den J2EE-Anwendungsserver, auf dem LiveCycle Data Services gehostet wird.

  5. Erstellen Sie die Clientanwendung mit Flash Builder 4.

Anlegen von Java-Serverklassen

So legen Sie Java-Serverklassen mit einer Java-IDE wie Eclipse an. Fügen Sie die .jar-Dateien des LiveCycle-Datendienstes dem Projektklassenpfad hinzu. Schließen Sie die flex-messaging-*.jar-Dateien ein, die sich im folgenden Ordner befinden:

[Install Directory]/lcds/tomcat/webapps/lcds-samples/WEB-INF/lib

wobei [Install Directory] der LiveCycle Data Services-Installationsort ist. Die folgenden Java-Serverklassen werden angelegt:

  • Product: Stellt die Daten dar, die sich in der Produkttabelle befinden
  • ProductAssembler: Stellt die Assembler-Klasse dar, die eine erforderliche LiveCycle Data Service-Klasse ist
  • Connection: Stellt eine Verbindung zur Datenbank her
  • DAOException: Stellt eine Ausnahme dar, die beim Auftreten eines Datenbankfehlers ausgelöst wird
  • ProductDAO: Stellt die Anwendungslogik dar, die die Datenbankoperationen ausführt.

Hinweis:

Alle diese Klassen werden in diesem Entwicklerartikel angelegt und auf dem Server bereitgestellt, auf dem LiveCycle Data Services gehostet ist.

Erstellen der Produktklasse

Die Produktklasse stellt die Daten in der Produkttabelle dar. Die Produktklasse enthält ein Datenelement für jedes Feld der Produkttabelle. Der Datenwert eines Datenelements stimmt mit dem Datentyp des Felds überein. Das Beschreibungsfeld, dessen Datentyp VarChar ist, ist dafür ein gutes Beispiel.

Der Datentyp des Beschreibungsdatenelements in der Produktklasse ist eine Zeichenfolge, wie im folgenden Beispiel gezeigt.

private String description;

Der Rest der Produktklasse besteht aus Zugriffsfunktionen für jedes Datenelement. Die Produktklasse implementiert

java.io.Serializable

Das folgende Codebeispiel stellt die Produktklasse dar.

package flex.samples.product;
import java.io.Serializable;
 
public class Product implements Serializable {
 
  static final long serialVersionUID = 103844514947365244L;
    
  private int productId;
  private String name;
  private String description;
  private String image;
  private String category;
  private double price;
  private int qtyInStock;
    
  public Product() {
                              
  }
    
  public Product(int productId, String name, String description,
    String image, String category, double price, int qtyInStock) {
      this.productId = productId;
      this.name = name;
      this.description = description;
      this.image = image;
      this.category = category;
      this.price = price;
      this.qtyInStock = qtyInStock;
  }
 
  public String getCategory()
  {
    return category;
  }
  public void setCategory(String category) {
    this.category = category;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public String getImage() {
    return image;
  }
  public void setImage(String image) {
    this.image = image;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public double getPrice() {
    return price;
  }
  public void setPrice(double price) {
    this.price = price;
  }
  public int getProductId() {
    return productId;
  }
  public void setProductId(int productId) {
    this.productId = productId;
  }
  public int getQtyInStock() {
    return qtyInStock;
  }
  public void setQtyInStock(int qtyInStock) {
    this.qtyInStock = qtyInStock;
  }
}

Anlegen der ProductAssembler-Klasse

Die ProductAssembler-Klasse erweitert die flex.data.assemblers.AbstractAssembler-Klasse und enthält Funktionen, die von der Clientanwendung genutzt werden. Die Assembler-Klasse enthält mindestens die Fill-Funktion. Diese Funktion implementiert Abfragen, von denen jede eine Sammlung von Objekten an die Clientanwendung zurückgibt. Wenn Ihre Clientanwendung Objekte aktualisiert, muss Ihre Assembler-Klasse eine Synchronisierungsfunktion oder einzelne Funktionen zum Anlegen, Aktualisieren und Löschen enthalten.

Die im Entwicklerartikel erstellte Clientanwendung ruft die Fill-Funktion auf, die sich in der ProductAssembler-Klasse befindet. Beachten Sie, dass die Fill-Funktion eine java.util.Listinstance als Eingabeparameter akzeptiert. Es wird eine java.util.Collection zurückgegeben, die die Daten in der Produkttabelle darstellt.

In der Regel ist es nicht erforderlich, eine Funktion direkt in der Assembler-Klasse aufzurufen. Die Fill-Funktion stellt jedoch eine Ausnahme dar. Das bedeutet, dass eine Clientanwendung diese Funktion aufruft. Sie können zwar eine Anlegen-, Aktualisieren- oder Löschen-Funktion in diese Klasse aufrufen, sie ist jedoch nicht erforderlich, da LiveCycle Data Services die Artikelsammlung verwaltet. Das heißt, Sie können die Artikel in einer Sammlung bearbeiten, indem Sie eine Aktualisierung durchführen. Die Änderungen werden entweder automatisch übernommen (bei autoCommit=true als Standardeinstellung) oder beim Aufruf der Übertragen-Funktion an den Server gesendet.

LiveCycle Data Services verfolgt Änderungen an den Artikeln in der Sammlung. Die Änderungen werden an den Server übertragen oder als Reaktion auf die Funktion revertChanges rückgängig gemacht. Diese Aktion hängt von der Einstellung der autoCommit-Markierung ab (standardmäßig auf „true“).

Das folgende Codebeispiel stellt die ProductAssembler-Klasse dar.

package flex.samples.product;
 
import java.util.List;
import java.util.Map;
import java.util.Collection;
 
import flex.data.DataSyncException;
import flex.data.assemblers.AbstractAssembler;
 
public class ProductAssembler extends AbstractAssembler {
 
  public Collection fill(List fillArgs, PropertySpecifier ps) {
    try
    {
      ProductDAO service = new ProductDAO();
      return service.getProducts();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }                           
    return null; 
  }
                              
  public Object getItem(Map identity) {
    ProductDAO service = new ProductDAO();
    return service.getProduct(((Integer) identity.get("productId")).intValue());
  }
 
  public void createItem(Object item) {
    ProductDAO service = new ProductDAO();
    service.create((Product) item);
  }
 
  public void updateItem(Object newVersion, Object prevVersion,
    List changes) {
    ProductDAO service = new ProductDAO();
    boolean success = service.update((Product) newVersion);
    if (!success) {
      int productId = ((Product) newVersion).getProductId();
      throw new DataSyncException(service.getProduct(productId), changes);
    }
  }
 
  public void deleteItem(Object item) {
    ProductDAO service = new ProductDAO();
    boolean success = service.delete((Product) item);
    if (!success) {
      int productId = ((Product) item).getProductId();
      throw new DataSyncException(service.getProduct(productId), null);
    }
  }
}

Anlegen der Connection-Klasse

Die Connection-Klasse stellt eine Verbindung zur Datenbank her. Diese Klasse verwendet Java-Klassen, die sich im java.sql.*-Paket befinden. Der folgende Code stellt die Connection-Klasse dar. Beachten Sie, dass sich diese Klasse in einem Paket mit dem Namen flex.samples befindet. Eine Instanz dieser Klasse wird in der ProductDAO-Klasse angelegt, um eine Verbindung zur Datenbank herzustellen.

package flex.samples;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class ConnectionHelper
{
  private String url;
  private static ConnectionHelper instance;
  private ConnectionHelper()
  {
    try {
      Class.forName("org.hsqldb.jdbcDriver");
      url = "jdbc:hsqldb:hsql://localhost:9002/flexdemodb";
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static Connection getConnection() throws SQLException {
    if (instance == null) {
      instance = new ConnectionHelper();
    }
    try {
      return DriverManager.getConnection(instance.url);
    }
    catch (SQLException e) {
      throw e;
    }
  }
  public static void close(Connection connection)
  {
    try {
      if (connection != null) {
      connection.close();
   }
  }
    catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

Anlegen der DAOException-Klasse

Die DAOException-Klasse stellt eine Ausnahme dar, die bei Auftreten eines Fehlers ausgelöst wird. Beachten Sie, dass sich diese Klasse in einem Paket mit dem Namen flex.samples befindet. Der folgende Java-Code stellt die DAOException-Klasse dar.

package flex.samples;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class ConnectionHelper
{
  private String url;
  private static ConnectionHelper instance;
                              
  private ConnectionHelper()
  {
    try {
      Class.forName("org.hsqldb.jdbcDriver");
      url = "jdbc:hsqldb:hsql://localhost:9002/flexdemodb";
    }
    catch (Exception e) {
      e.printStackTrace();
    }

Anlegen der ProductDAO-Klasse

Die ProductDAO-Klasse enthält eine Java-Anwendungslogik, die Datenbankoperationen ausführt. Funktionen aus der Assembler-Klasse rufen Funktionen in dieser Klasse auf, um die Vorgänge auszuführen. Sie können in dieser Klasse SQL-Befehle verwenden, um Datenbankoperationen auszuführen. Beispielsweise stellt die folgende Java-Anwendungslogik eine Funktion namens getProducts dar, die Daten aus der Produkttabelle abruft.

public List getProducts() throws DAOException {
  List list = new ArrayList();
  Connection c = null;
  try {
    c = ConnectionHelper.getConnection();
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery("SELECT * FROM product ORDER
      BY name");
    while (rs.next()) {
      list.add(new Product(rs.getInt("product_id"),
      rs.getString("name"),
      rs.getString("description"),
      rs.getString("image"), 
      rs.getString("category"), 
      rs.getDouble("price"),
      rs.getInt("qty_in_stock")));
    }
  }
  catch (SQLException e) {
    e.printStackTrace();
    throw new DAOException(e);
  }
  finally {
    ConnectionHelper.close(c);
  }
 return list;

Die Funktion ConnectionHelper.getConnection gibt eine Instanz von Connection zurück, die eine Verbindung zur Datenbank darstellt. Beachten Sie, dass eine SQL-Anweisung zum Abrufen aller Felder aus der Produkttabelle genutzt wird. Die Datensätze werden nach Namen geordnet, und die Ergebnisse werden in einer java.util.Listinstance angeordnet. Die Fill-Funktion in der ProductAssembler-Klasse ruft die getProducts-Funktion auf.

Die ProductDAO-Klasse enthält die folgenden Funktionen:

  • getProducts: Gibt Daten zurück, die sich in der Produkttabelle befinden.
  • getProductsByName: Gibt Daten basierend auf dem Namen eines Artikels zurück.
  • getProduct: Gibt Daten basierend auf der eindeutigen Kennung des Artikels zurück.
  • create: Legt einen Datensatz an.
  • update: Aktualisiert einen vorhandenen Datensatz.
  • remove: Entfernt einen Artikel aus der Datenbank.

Das folgende Codebeispiel stellt die ProductDAO-Klasse dar.

package flex.samples.product;
 
import java.util.ArrayList;
import java.util.List;
import java.sql.*;
 
import flex.samples.ConnectionHelper;
import flex.samples.DAOException;
 
public class ProductDAO {
 
  public List getProducts() throws DAOException {
    List list = new ArrayList();
    Connection c = null;
    try {
      c = ConnectionHelper.getConnection();
      Statement s = c.createStatement();
      ResultSet rs = s.executeQuery("SELECT * FROM product ORDER
        BY name");
      while (rs.next()) {
        list.add(new Product(rs.getInt("product_id"),
        rs.getString("name"),
        rs.getString("description"),
        rs.getString("image"), 
        rs.getString("category"), 
        rs.getDouble("price"),
        rs.getInt("qty_in_stock")));
      }
    }
    catch (SQLException e) {
      e.printStackTrace();
      throw new DAOException(e);
    }
    finally {
      ConnectionHelper.close(c);
    }
    return list;
  }
 
  public List getProductsByName(String name) throws DAOException {
    List list = new ArrayList();
    Connection c = null;
    try {
      c = ConnectionHelper.getConnection();
      PreparedStatement ps = c.prepareStatement("SELECT * FROM
        product WHERE UPPER(name) LIKE ? ORDER BY name");
        ps.setString(1, "%" + name.toUpperCase() +
          "%");
        ResultSet rs = ps.executeQuery();
      while (rs.next()) {
        list.add(new Product(rs.getInt("product_id"),
        rs.getString("name"),
        rs.getString("description"),
        rs.getString("image"), 
        rs.getString("category"), 
        rs.getDouble("price"),
        rs.getInt("qty_in_stock")));
      }
    }
    catch (SQLException e) {
      e.printStackTrace();
      throw new DAOException(e);
    }
    finally {
      ConnectionHelper.close(c);
    }
    return list;
  }
                              
  public Product getProduct(int productId) throws DAOException {
    Product product = new Product();
    Connection c = null;
    try {
      c = ConnectionHelper.getConnection();
      PreparedStatement ps = c.prepareStatement("SELECT * FROM
        product WHERE product_id=?");
      ps.setInt(1, productId);
      ResultSet rs = ps.executeQuery();
      if (rs.next()) {
        product = new Product();
        product.setProductId(rs.getInt("product_id"));
        product.setName(rs.getString("name"));
        product.setDescription(rs.getString("description"));
        product.setImage(rs.getString("image")); 
        product.setCategory(rs.getString("category")); 
        product.setPrice(rs.getDouble("price"));
        product.setQtyInStock(rs.getInt("qty_in_stock"));
      }
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new DAOException(e);
    }
    finally {
      ConnectionHelper.close(c);
    }
    return product;
  }
 
  public Product create(Product product) throws DAOException {
    Connection c = null;
    PreparedStatement ps = null;
    try {
      c = ConnectionHelper.getConnection();
      ps = c.prepareStatement("INSERT INTO product (name,
        description, image, category, price, qty_in_stock) VALUES (?, ?, ?, ?, ?,
        ?)");
      ps.setString(1, product.getName());
      ps.setString(2, product.getDescription());
      ps.setString(3, product.getImage());
      ps.setString(4, product.getCategory());
      ps.setDouble(5, product.getPrice());
      ps.setInt(6, product.getQtyInStock());
      ps.executeUpdate();
      Statement s = c.createStatement();
   
      // HSQLDB Syntax to get the identity (company_id) of inserted row
      ResultSet rs = s.executeQuery("CALL IDENTITY()");
    
      // MySQL Syntax to get the identity (product_id) of inserted row
      // ResultSet rs = s.executeQuery("SELECT
        LAST_INSERT_ID()");
      rs.next();
 
      // Update the id in the returned object. This is important as
      // this value must get returned to the client.
      product.setProductId(rs.getInt(1));
      }
      catch (Exception e) {
        e.printStackTrace();
        throw new DAOException(e);
      }
      finally {
        ConnectionHelper.close(c);
      }
    return product;
  }
 
  public boolean update(Product product) throws DAOException {
    Connection c = null;
    try {
      c = ConnectionHelper.getConnection();
      PreparedStatement ps = c.prepareStatement("UPDATE product
        SET name=?, description=?, image=?, category=?, price=?, qty_in_stock=? WHERE
          product_id=?");
      ps.setString(1, product.getName());
      ps.setString(2, product.getDescription());
      ps.setString(3, product.getImage());
      ps.setString(4, product.getCategory());
      ps.setDouble(5, product.getPrice());
      ps.setInt(6, product.getQtyInStock());
      ps.setInt(7, product.getProductId());
     return (ps.executeUpdate() == 1);
    }
    catch (SQLException e) {
      e.printStackTrace();
      throw new DAOException(e);
    }
    finally {
      ConnectionHelper.close(c);
    }
  }
 
  public boolean remove(Product product) throws DAOException {
    Connection c = null;
    try {
      c = ConnectionHelper.getConnection();
      PreparedStatement ps = c.prepareStatement("DELETE FROM
        product WHERE product_id=?");
      ps.setInt(1, product.getProductId());
      int count = ps.executeUpdate();
     return (count == 1);
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new DAOException(e);
    }
    finally {
      ConnectionHelper.close(c);
    }
  }
 
  public boolean delete(Product product) throws DAOException {
    return remove(product);
  }
}

Bereitstellen von Java-Serverklassen

Nachdem Sie die Java-Serverklassen angelegt haben, stellen Sie diese auf dem Server bereit, auf dem LiveCycle Data Services gehostet wird. Kompilieren Sie die Java-Klassen in Ihrer Java-IDE und stellen Sie dann die .CLASS-Dateien bereit. Der Bereitstellungsort hängt vom Namen der Anwendung ab. In diesem Entwicklerartikel wird davon ausgegangen, dass der Name der Anwendung „lcds-samples“ ist. Da Product.class, ProductAssembler.class und ProductDAO.class allesamt Teile des flex.samples.product-Pakets sind, legen Sie diese Klassendateien im folgenden Ordner ab:

[Install Directory]\lcds\tomcat\webapps\lcds-samples\WEB-INF\classes\flex\samples\product

Da Connection.class und DAOException.class zum flex.samples-Paket gehören, legen Sie diese Klassen im folgenden Ordner ab:

[Install Directory]\lcds\tomcat\webapps\lcds-samples\WEB-INF\classes\flex\samples

Konfigurieren Sie LiveCycle Data Services für die Verwendung der Serverklassen

Um die Java-Serverklassen erfolgreich zu verwenden, konfigurieren Sie die Datei „data-management-config.xml“. In dieser Datei können Sie ein Data Management Service-Ziel anlegen. Ein Ziel ist der Endpunkt, den Sie zum Datenaustausch verwenden, um die Datenverteilungs- und Datensynchronisierungsfunktion in Ihrer Clientanwendung bereitzustellen. Ein Ziel wird in der Clientanwendung referenziert.

Standardmäßig befindet sich die Datei data-management-config.xml im Ordner WEB_INF/flex der Webanwendung, die LiveCycle Data Services enthält. Die Datei data-management-config.xml wird in der Datei services-config.xml auf der obersten Ebene referenziert. Das folgende Beispiel zeigt ein Ziel mit dem Namen inventory. Beachten Sie, dass das Quellelement auf flex.samples.product.ProductAssembler verweist. Genauso verweist das Artikelklassenelement auf flex.samples.product.Product.

<destination id="inventory">
  <properties>
    <source>flex.samples.product.ProductAssembler</source>
    <scope>application</scope>
    <item-class>flex.samples.product.Product</item-class>
    <metadata>
      <identity property="productId"/>
    </metadata>
    <network>
      <paging enabled="false" pageSize="10"/>
    </network>
  </properties>
</destination>

Für den Anwendungsumfang bedeutet dies, dass es für alle Clientanwendungen nur eine Assembler-Instanz gibt. Das Element Identitätseigenschaft wird einem Datenelement in der Produktklasse zugeordnet. Wenn Sie Data Management verwenden, müssen alle persistenten Entitäten über eine oder mehrere Identitätseigenschaften verfügen, die jede verwaltete Instanz eindeutig kennzeichnen.

Paging kann die Leistung von Anwendungen verbessern, indem die Abfragezeiten verkürzt und der Arbeitsspeicher für den Verbraucher verringert wird. LiveCycle Data Services unterstützt drei Paging-Arten: Client-zu-Server-Paging, Server-zu-Datenquelle-Paging und Zuordnungs-Paging. In diesem Beispiel ist das Paging nicht aktiviert.

Starten Sie den J2EE-Anwendungsserver, auf dem LiveCycle Data Services gehostet ist

Starten Sie den J2EE-Anwendungsserver, auf dem LiveCycle Data Services gehostet wird.

  • Klicken Sie auf Start, Alle Programm, Adobe, LiveCycle Data Services ES 3.1, LiveCycle Data Services Server starten.

Führen Sie startdb.bat aus, um die Beispieldatenbank zu starten. Diese Datei befindet sich im folgenden Verzeichnis: [Install directory]lcds3/sampledb.

Anlegen eines Flash Builder-Projekts

Legen Sie ein Flash Builder-Projekt an, das zum Erstellen der Clientanwendung verwendet wird. Dieses Projekt bezieht sich auf den J2EE-Anwendungsserver, auf dem LiveCycle Data Services gehostet ist. Wählen Sie beim Anlegen des Projekts J2EE als Anwendungsservertyp und LiveCycle Data Services als Anwendungsserver aus. Achten Sie darauf, dass das Projekt auf das Kontextstammverzeichnis verweist, in dem die Datenquelle erstellt wurde. Nachdem Sie das Projekt angelegt haben, werden alle Clientbibliotheken, die für die Interaktion mit dem J2EE-Anwendungsserver erforderlich sind, automatisch dem Klassenpfad Ihres Projekts hinzugefügt.

Mit dem folgenden MXML-Code wird ein Datenraster erstellt. Wenn der Benutzer auf die Schaltfläche „Daten abrufen“ klickt, wird die in der ProductAssembler-Klasse definierte Fill-Funktion aufgerufen. Beachten Sie, dass der Zieleigenschaft ein Inventory ist, das auf das in der Datei „data-management-config.xml“ festgelegte Ziel verweist.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
backgroundColor="#FFFFFF">
<mx:ArrayCollection id="products"/> 
<mx:DataService id="ds" destination="inventory"/>
                              
  <mx:DataGrid dataProvider="{products}"
    editable="true" width="100%" height="100%">
    <mx:columns>
      <mx:DataGridColumn dataField="name" headerText="Name"/>
      <mx:DataGridColumn dataField="category" headerText="Category"/>
      <mx:DataGridColumn dataField="price" headerText="Price"/>
      <mx:DataGridColumn dataField="image" headerText="Image"/>
      <mx:DataGridColumn dataField="description" headerText="Description"/>
    </mx:columns>
  </mx:DataGrid>
  <mx:Button label="Get Data" click="ds.fill(products)"/> 
</mx:Application>

Sie müssen außerdem eine ActionScript-Produktklasse anlegen, die die Daten in der Produkttabelle darstellt. Die Datei „Product.as“ kann sich im selben Paket wie die MXML-Hauptdatei befinden. Die folgende ActionScript-Klasse stellt die Datei Product.as dar.

package
{
[Managed]
[RemoteClass(alias="flex.samples.product.Product")]
public class Product
{
  public function Product()
  {
  }
                                    
  public var productId:int;
  public var name:String;
  public var description:String;
  public var image:String;
  public var category:String;
  public var price:Number;
  public var qtyInStock:int;
  }
}

Beachten Sie, dass das RemoteClass-Tag auf flex.samples.product.Product verweist. Alle Datenelemente, die in der flex.samples.product.Product-Klasse festgelegt sind, werden auch in der Product.as-Klasse definiert. Beachten Sie außerdem, dass die in Product.as definierten Datentypen mit den in flex.samples.product.Product festgelegten Datenelementen übereinstimmen.

So erstellen Sie eine Clientanwendung mit Flash Builder 4:

  1. Starten Sie Flash Builder 4 durch Klicken auf Start, Alle Programme, Adobe Flash Builder 4.
  2. Geben Sie im Feld „Projektname“ einen Namen für das Projekt ein.
  3. Wählen Sie unter „Anwendungstyp“ die Option „Web“.
  4. Legen Sie für die Flex SDK-Version die Version 3.5 fest.
  5. Wählen Sie in der Liste der Anwendungsserver die Option J2EE.
  6. Aktivieren Sie das Kontrollkästchen „Fernzugriffsdienst verwenden“.
  7. Aktivieren Sie das Kontrollkästchen „LiveCycle Data Services“.
  8. Geben Sie im Feld „Stammordner“ den Wert für den Stammordner an. Geben Sie beispielsweise C:\lcds\tomcat\webapps\lcds-samples ein.
  9. Geben Sie im Feld „Stamm-URL“ den Wert für den Stamm-URL-Ordner an. Geben Sie beispielsweise http://localhost:8400/lcds-samples/ ein.
  10. Geben Sie im Feld „Kontextstammverzeichnis“ den Wert für das Kontextstammverzeichnis ein. Geben Sie beispielsweise /lcds-samples ein.
  11. Übernehmen Sie den Standardwert des Ausgabeordners.
  12. Klicken Sie auf „Beenden“.
  13. Legen Sie die Klasse Product.as an.
  14. Fügen Sie die am Anfang dieses Abschnitts gezeigte Anwendungslogik in die MXML-Datei ein.