Dieses Blog durchsuchen

Dienstag, 6. Juli 2010

Meine Homepage ist online: www.jens-stahl.de!

Meine neue Homepage ist nun online!

Viel Spaß beim Anschauen, es gibt dort Infos über meine Schwerpunkte und durchgeführte Projekte.

Montag, 4. Januar 2010

Drag and Drop mit Richfaces

In Zeiten von Ajax und Web 2.0 bieten Web Applikationen mehr und mehr Möglichkeiten klassischer Rich Client Anwendungen. Mit Hilfe der Richfaces Komponenten Bibliothek können Facelets sehr einfach um Ajax Fähigkeiten erweitert werden.

Auch Drag and Drop Funktionalität kann komfortabel eingebaut werden. Nachfolgend zeige ich anhand eines kurzen Beispiels, wie einfach Drag and Drop mit Richfaces realisiert werden kann.

Das Prinzip ist sehr einfach: Zunächst wird ein Bereich definiert, der als "Drag-Bereich" dient und anschließend der Bereich zum "Droppen". Was beim "Drop" passieren soll, wird über einen Listener implementiert.

Zunächst wird ein Rich Data Grid definiert, welches dem Benutzer die Elemente von Interesse präsentiert:

<rich:dataGrid id="dragArea" value="#{elementsModel}" var="_element">
     <a4j:outputPanel layout="block">
          <rich:dragSupport dragType="element" dragIndicator=":indicator">
       <a4j:actionparam value="#{_element.objectName}" name="objectName" />
  </rich:dragSupport>
  <div>
       <h:graphicImage value="#{_package.filePath}" /> 
       <h:outputText value="#{_element.objectName}"/>
          /div>
     </a4j:outputPanel>
</rich:dataGrid>


Der zweite Schritt besteht darin, den Bereich festzulegen, der als Ablagebereich für die Elemente dienen soll:

<rich:dropSupport dropListener="#{elementManager.addSelectedElement}" acceptedTypes="element" reRender="dropArea">
<rich:dataGrid id="dropArea" value="#{selectedElements}" var="_element">
<h:graphicImage value="#{_element.filePath}" />
<h:outputText value="#{_element.objectName}" />
</rich:dataGrid>
</rich:dropSupport>


Der dropListener besagt, welche Methode beim Drop aufgerufen werden soll. Innerhalb dieser Methode wird das ausgewählte Element einer Collection der anzuzeigenden Elemente hinzugefügt. Zu beachten ist das Attribut "acceptedTypes". Es muss den selben Wert haben, wie das dragType Attribute aus dem dragSupport Element.

Insgesamt war es sehr einfach, eine Drag and Drop Funktionalität mit RichFaces zu implementieren. Etwas Ausprobieren gehört dazu, um das Design der Seite intuitiv und ansprechend zu gestalten. Es ist jedoch wenig XML Code nötig, um Drag and Drop mit Richfaces zu ermöglichen.

Montag, 23. November 2009

Documentum Foundation Services und das Seam Framework

Seit einiger Zeit beschäftige ich mich mit dem Seam Framework: www.seamframework.de

Seam ist ein modernes Web Framework, welches die Entwicklung mit JSF und EJB enorm vereinfacht. Seam wird von JBoss entwickelt. Das schöne ist jedoch, dass Seam auf JEE Standards basiert und deshalb in jedem JEE kompatiblen Application Server lauffähig ist.

Es ist sogar recht einfach möglich, eine Seam Applikation in einem Tomcat auszuführen (http://seamframework.org/Documentation/RunningSeamExamplesWithApacheTomcat)

Nach erfolgreichem Generieren eines Projektes mit Hilfe von seam-gen, war mein Ziel, eine Anwendung zu implementieren, die auf den Documentum Foundation Services (DFS) basiert. So sollte es möglich sein, über Web Services auf das Dokumentenmanagement System von EMC zuzugreifen. Wie sich herausstellte, ist Seam und DFS eine sehr schöne Kombination.

Zunächst einmal ist es möglich, eine Seam Komponente beim Starten des Applikationsservers zu laden und diese in den Application Scope zu legen. Dazu sind folgende Seam-Annotations notwendig:

@Name("searchFactory")
@Startup
@Scope(ScopeType.APPLICATION)

Der nächste Schritt besteht darin, eine Service Factory zu initialisieren, welche die Documentum Services zur Verfügung stellt:

@Create
private void initializeServiceFactory() {

contextFactory = ContextFactory.getInstance();
context = contextFactory.getContext();

RepositoryIdentity repoId= new RepositoryIdentity();
repoId.setRepositoryName(DOCBASE);
repoId.setUserName(USERNAME);
repoId.setPassword(PASSWORD);

context.addIdentity(repoId);

serviceFactory = ServiceFactory.getInstance();
}

Die @Create Annotation besagt, dass die Methode sofort beim Laden der Komponente ausgeführt werden soll. Da die Instanziierung der Service Factory sehr aufwändig ist, macht es Sinn, sie schon beim Starten des Servers zu initialisieren.

Wenn der Applikationsserver gestartet ist, ist auch die ServiceFactory startklar und kann sehr komfortabel in einer anderen Komponente injiziert werden:

@In
private SearchFactory searchFactory;

Schließlich können die Services über die Factory bezogen werden und die Business Logik kann die Services verwenden:

IQueryService queryService = searchFactory.getQueryService();