osRetail – Primefaces 4 Upgrade

Wir sind wieder einen Schritt weiter. osRetail in der finalen Primefaces 4.0 Version. Und als Maven Projekt. osRetail das erste open Source ERP System für den Handel. Wir versuchen das starre Korsett eines fertigen ERP System aufzubrechen. Dem Kunden eine möglichst große Vielfalt an Standardfunktionalität zu bieten und auch kostspielige Funktionen wie der Katalogerstellung frei Haus mitzuliefern.

Vor ca. einem Jahr haben wir uns dazu entschlossen ein großes Refactoring der Software durchzuführen. So haben wir nicht nur die Entwicklungsumgebung von Netbeans auf Eclipse geändert. Wir haben auch IceFaces ausgetauscht und – mit dem leistungsstarken Framework – Primefaces einen weiteren Schritt zu einer moderneren Arbeitoberfläche geebnet.

jee7-standard

Ebenso wurde der Code überarbeitet. Derzeit verwenden wir den JEE7 Standard um den aktuellsten Stand der Enterprise Entwicklung von Java nutzen zu können. Autodeployments über Jenkins erleichtern uns die Arbeit erheblich da wir alle Code Commits und Änderungen auf den Testsystem schnellst möglich dem publishen können.

maven-overview-plugin

Maven unterstützt uns bei der Library Auswahl. Mit einfachsten Mitteln ist es möglich neue oder ältere Bibliotheken auszuwählen und automatisch in der Entwicklung und beim Deployment zu verwenden.

Glassfish 4 bietet uns einen schnellen Application- Server der leicht zu handeln ist. Skalierbarkeit, effizientes Arbeiten und schnelle Deployments standen dabei im Vordergrund. Durch einfache Erweiterbarkeit ist es uns möglich schnell auf Kundenwünsche zu reagieren.

JEE Anwendung: QUAT

Es ist ein attraktives Entwicklungsumfeld im JEE Bereich. Webapplications mit EJB3 Anbindung und Managed- Beans.

Im Standard JEE6 wurde viel Aufmerksamkeit auf Annotations gelenkt und die vereinfachte Kommunikations der Beans mit dem Frontend. Der neue JEE7 Standard, erst ein paar Wochen alt wird jetzt speziell die Ausrichtung im Bereich Ajax im Blick haben. Light- Weight Communication mit dem Backend wenn man so will. Wenige Daten die geliefert werden und somit die Performance von Applikationen beschleunigt.

Ich werde euch hier ein kleines Beispiel für eine JEE Anwendung erstellen inkl. der aktuellen Version von Eclipse Kepler und Glassfish 4.

Die JEE Anwendung wird mit dem Plugin von Primefaces 3.5 laufen. Einem leistungsstarken Ajax- Framework das basierend auf jQuery UI viel interaktive Bearbeitungsmöglichkeiten bietet.

Nachteil von Primefaces. Die jQuery UI hat, meines erachtens nicht gerade ein business orientiertes Interfaces Design. Die Buttons und Eingabemasken wirken sehr groß und für ein schlankeres Aussehen müssen einige CSS Classes überarbeitet werden.

Auch muss man sich vor Augen führen das durch den zusätzlichen CSS und Javascript Aufwand die einzelnen Seiten etwas Content- lastiger werden und somit die Ladezeit im Gegensatz zu reinem JSF2 länger sein können. Da man aber sehr viele Daten nachladen kann wird nur der Erstaufruf etwas länger benötigen. Sobald alle Daten Clientseitig gecached wurden wird die Performance deutlich besser sein.

Maven wird in diesem kleinen Projekt eine weiter Rolle spielen. Um möglichst einfach alle Komponenten bauen zu lassen ohne sich um die Libraries kümmern zu müssen oder die Libraries im SVN bereit zu stellen werde ich mich darum kümmern das das Projekt mit Maven gebaut werden kann.

Vorteile:

  • Versionierung des Projektes anhand von Maven- einstellungen.
  • Einfaches Updaten von Libraries
  • Schnelles Bauen von Projekten

Nachteil:

Langwieriges einstellen der Maven Poms um einen erfolgreichen Build zu generieren. Mittlerweile habe ich auch festgestellt das nicht alle POM Einstellungen Plattformunabhängig sind. Es kann sein das Builds teilweise unter Windows laufen und auf dem Mac Fehler verursachen weil Abhängigkeiten fehlen.

Projektname: QUAT

Das Projekt das ich seit längerem realisiere nennt sich QUAT. Mittlerweile stecken knappe 2 Jahre Entwicklung in dem System. Angefangen hat es mit einer einfachen PHP Anwendung die mittlerweile ihre Alter erreicht hat und dank unzähliger PHP Updates auch einiges an Funktionen nicht mehr unterstützen bzw. nur noch per Workaround laufen.

QUAT wird z.B. für ein Callcenter verwendet werden können das sich mit der Qualitätssicherung von Mitarbeiter beschäftigt. Überall wo die Leistung vom Mitarbeiter eine Bewertung benötigt und die Qualität in Gesprächen oder direkter Kommunikation am Telefon geprüft werden muss um den Erfolg der Firma zu steigern oder gezielt Schulungen für Mitarbeiter anzubieten.

Aber erstmal genug um den Nutzen der Software. Wir möchten uns die technische Seite etwas genauer ansehen und somit den Aufbau der Software.

[HIER WERDEN ALLE ZUKÜNFTIGEN ARTIKEL ZU QUAT GELISTET UND VERLINKT|

 

Primefaces – web.xml korrekt Konfigurieren

Für Glassfish sind ein paar mehr Einstellungen notwendig um Primefaces Push zu aktivieren und auch korrekt laufen zu lassen.

Im Webprojekt muss die web.xml folgendermaßen erweitert werden:

 

   <servlet>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
      <param-name>org.atmosphere.cpr.sessionSupport</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
      <param-value>org.atmosphere.cache.SessionBroadcasterCache</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcastFilterClasses</param-name>
      <param-value>org.atmosphere.client.TrackMessageSizeFilter</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.WebSocketProcessor</param-name>
      <param-value>org.atmosphere.cpr.HttpServletRequestWebSocketProcessor</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.disableOnStateEvent</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useWebSocket</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.websocket.maxTextMessageSize</param-name>
      <param-value>0</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>

 

Aktivieren von Comet in Glassfish

Primefaces bietet in der aktuellen Version ein PrimePush an. Leider scheint das ganze nur zu funktionieren wenn diverse Konfigurationen abgestimmt sind. Derzeit läuft es bei mir noch nicht ganz stabil aber ein paar Tipps kann ich gerne schon mal geben.

Es gibt die Möglichkeit Comet, eine Pushvariante im Glassfish bzw. für Pushservices per Parameter zu aktivieren. Aufpassen! Diese Möglichkeit der klassischen Parameter ist tödlich für den Glassfish. Leider wird damit die Antwortzeit ins unermessliche gesteigert und nur schwer ein Aufruf möglich.

Die sichere Variante ist aktivieren von Comet per Administratorconsole und zwar in den einzelenen http-listenern. Anbei ein Screenshot der das Ganze zeigt.

comet_aktivierung

Primefaces, Tipps & Tricks

Primefaces ist ein super Werkzeug um schnell und zuverlässig Webplattformen zu erstellen auf Basis von JEE6 mit EJB3 und einem Glassfish.

Ich arbeite derzeit mit dem Glassfish 3.1 auf Eclipse IDE Indigo (mittlerweile gibt es neuere Releases)

Primefaces hat aber so seine Eigenheiten. Wer JSF2 gewohnt ist wird schnell auf ein paar  Unterschiede stoßen. Sei es die Parameterübergabe oder auch die Formen die man beachten muss wenn man mit Primefaces arbeitet. Der Mensch ist faul und wird daher oft selbst bestraft wenn er sich nicht alles durchließt. 😉

Ein Dialog z.B. bildet eine eigene Form und benötigt somit keine weitere Ummantelung eines form Tags.

<p:dialog id="basicDialog" header="Basic Dialog" widgetVar="dlg1">  
    <h:outputText value="Sample Dialog!" />  
</p:dialog> 

Eine weitere Besonderheit sind die wenn man sie richtig anwenen möchte muss man sich etwas konzentrieren. Direkte Parameterübergabe z.B. mit

geht nicht!

Korrekt hierfür wäre, wie im Primefaces Beispiel auch schon steht, aber natürlich von mir im ersten Moment nicht so angewandt wurde ein dieser kann im Button integriert werden und z.b. über einen Dialog verarbeitet werden.

<h:form prependId="false"> 
    <h:panelGrid columns="1" cellpadding="5">  
        <h:outputText id="msg" value="#{buttonBean.text}"/>  
          
        <p:commandButton id="showDialogButton" value="Destroy the World" onclick="myDialog.show()" type="button">
            <f:setPropertyListener value="blub" target="#{bean.property}" />
        </p:commandButton>
    </h:panelGrid>  
      
    <p:dialog id="myDialog" widgetVar="myDialog">  
        <f:outputText value="Hey, #{bean.property} would u really destroy the world?" />           
    </p:dialog >  
</h:form>