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.

ManagedBean URL Parameter lesen

Vor kurzem musste ich mich fragen wie man ein paar einfache URL Parameter ausgelesen bekommt. Das ganze in der ManagedBean. Eigentlich ist die Lösung einfach wenn man einmal begriffen hat wozu ManagedProperties gedacht sind. Das schöne ist das es über eine einfach Annotation geht und in der faces-config.xml nur eine Kleinigkeit hinzugefügt werden muss.

In unserem fall ist es z.B. /faces/test/test.xhtml?test1=hurz&test2=gurz

 

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>com.example.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>test1</property-name>
        <value>#{param.test1}</value>
    </managed-property>
    <managed-property>
        <property-name>test2</property-name>
        <value>#{param.test2}</value>
    </managed-property>
</managed-bean>

Wichtig hierbei ist die Scope. Falls ihr die Scope auf Session belasst werdet ihr ein Instanziierungsproblem bekommen. Da der URL Aufruf wie der Name schon sagt ein einfacher und nur für den Moment geltender Aufruf ist ist der Scope ganz wichtig bei der Sache das auch die Parameter korrekt gelesen werden können. Somit achtet darauf das die Scope auf alle Fälle REQUEST enthält.

Anschließend könnt ihr in eurer ManagedProperty die zwei Parameter auslesen:

@ManagedProperty ("{test1}")
private String test1;
@ManagedProperty ("{test2}")
private String test2;

public void setTest1(String test1) {
 this.test1 = test1;
}
public void setTest2(String test2) {
 this.test2 = test2;
}

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>