Christian Kaltepoth / ingenit GmbH & Co. KG
Andy Bosch / Berater und Trainer

PrettyFaces:
    RESTful URLs für JSF
Agenda
•   Begriffsklärung: RESTful URLs
•   Was bietet JSF?
•   Einführung in PrettyFaces
•   Live-Demonstration
•   Fazit / Ausblick
RESTful URLs

 Was ist das?
Prinzipien für RESTful URLs
    http://example.com/products/4554


•   Eindeutige Adressierbarkeit
•   Zustandslosigkeit
•   GET als bevorzugte Operation
•   Einfache HTML Links
Warum RESTful URLs?

•   Lesbarkeit (Wo bin ich?)
•   SEO / Keywords in URL
•   „Vertrauen“
•   Die URLs sind „schön“
Schön?!?
http://www.amazon.de/b/ref=sa_menu_
    desk3?ie=UTF8&node=514699031


              Schön!
  http://www.ebay.de/elektronik
„Brauchen wir nicht!
Wir entwickeln Anwendungen für das
              Intranet!“
Warum RESTful URLs?
• Post-Redirect-Get (PRG) Pattern:
  – Auf ein POST folgt ein Redirect
  – Vermeidung von Form Resubmissions
  – Besseres Verhalten bei Back-Button
    Nutzung oder Reload der Seite
• Optimale Bedienbarkeit
  – Bookmarks / „In neuem Tab öffnen“
• Verknüpfungen zwischen Anwendungen
Was bietet JSF
für RESTful URLs?
JSF 1.2 und älter

•   Navigationsregeln in faces-config.xml
•   Kein echter GET-Support
•   Query-Parameter nur mit Umwegen
•   Darum viele Postbacks
•   „Vorherige Seite“ in Adresszeile
JSF 2.0 / 2.1
• GET-Support:
  – JSF View Parameter
  – PreRenderView Event
  – <h:link> und <h:button>
• Unterstützung von Redirects bei
  impliziter Navigation
Was bietet PrettyFaces darüber
           hinaus?
Rewriting
• Beliebige Adressen für JSF Seiten
• FacesServlet Mapping irrelevant

http://shop.de/faces/warenkorb.xhtml
                  ↓
      http://shop.de/warenkorb
Path-Parameter
• Echte Path-Parameter
• Integration mit JSF View Parametern

http://shop.de/faces/artikel.xhtml?
         kategorie=notebooks
                  ↓
 http://shop.de/kategorie/notebooks
Page Actions
• Ausführung beim Seitenzugriff
• Vorherige Konvertierung und Validierung

     http://shop.de/notebooks

                Page Action:
  Lade Artikel der Kategorie „Notebooks“
Annotations
@Named
@RequestScoped
@URLMapping(pattern="/warenkorb",
            viewId="/faces/warenkorb.xhtml")
public class WarenkorbBean {

  @URLAction
  public void loadData() {
    …
  }

}
XML Konfiguration
   • /WEB­INF/pretty­config.xml

<pretty­config xmlns="http://ocpsoft.com/prettyfaces/3.3.0">

   <url­mapping id="warenkorb">
      <pattern value="/warenkorb" />
      <view­id value="/faces/warenkorb.xhtml" />
      <action>#{warenkorbBean.loadData}</action>
   </url­mapping>

</pretty­config>
Rewrite Engine
  • Vergleichbar mit mod_rewrite
  • Deployment der Regeln mit der Anwendung
  • Migration „alter URLs“

<pretty­config xmlns="http://ocpsoft.com/prettyfaces/3.3.0">

    <rewrite match="^/kategorie.php?name=(w+)$"
             substitute="/kategorie/$1" redirect="301" />

</pretty­config>
Weiteres
• PrettyFaces nicht nur für JSF
• Lizenz: Apache 2.0
• Integration mit:
  – JSF 1.2 / 2.0 / 2.1
  – CDI
  – Spring
Neugierig?

   Nun folgt eine Demonstration!

https://github.com/chkal/wjax11­demo
PrettyFaces…
• macht Ihre Applikation „schöner“
• ist leicht zu integrieren/konfigurieren
• vereinfacht Entwicklung und
  Anwendung

    PrettyFaces ist eine sinnvolle
   Ergänzung für jedes JSF Projekt!
Fast hätte ich es vergessen:
• Erweiterung durch SPIs:
  –   ConfigurationProvider
  –   ConfigurationPostProcessor
  –   Processor
  –   ELBeanNameResolver
  –   DevelopmentModeDetector
  –   etc.
Was bringt die Zukunft?
• Fokus liegt auf PrettyFaces 4.0
• Basierung auf Rewrite:
  – Neuimplementierung der Kernfunktionen als
    dediziertes Projekt
  – Unabhängig von JSF einsetzbar
  – Konfiguration durch „Fluent API“


→ http://ocpsoft.com/rewrite/
public Configuration getConfiguration(ServletContext ctx) {

    return ConfigurationBuilder.begin()
             .defineRule()
             .when(Direction.isInbound().and(
                        Path.matches("/some/{page}/.*/")))
             .perform(Forward.to("/new­{page}/"));

}
Fragen?
Vielen Dank für die Aufmerksamkeit!

 http://ocpsoft.com/prettyfaces/

Christian Kaltepoth                      Andy Bosch
christian@kaltepoth.de   andy.bosch@jsf-academy.com
     @chkal                              @andybosch

PrettyFaces: RESTful URLs für JSF