Schöneres JSF mit PrettyFaces

Listing 4 zeigt die für die Kategorieseite verantwortliche Bean. Als wichtigster Unterschied zur vorherigen Klasse fällt die EL-Expression im pattern-Attribut auf. Mit einem solchen Ausdruck definiert man einen Path-Parameter für das URL-Mapping. Wie der aufmerksame Leser zu diesem Zeitpunkt bereits vermutet, schreibt PrettyFaces die an dieser Stelle in dem URL stehende Zeichenkette in die referenzierte Property der Bean.

@Named("categoryBean")
@RequestScoped
@URLMapping(id="category", pattern="/category/#{categoryBean.name}",
    viewId="/faces/category.xhtml")
public class CategoryBean {

  @Inject
  private BookDao bookDao;

  @Inject
  private CategoryDao categoryDao;

  private String name;

  private Category category;

  private List books;  
  
  @URLAction
  public void initView() {
    
    category = categoryDao.getByName(name);
    if( category == null ) {
      PrettyContext.getCurrentInstance().sendError(404);
      return;
    }
    
    books = bookDao.findByCategory(category);
    
  }

  /* Getter + Setter */
}

Listing 4: CategoryBean.java

Wie erzeugen wir nun einen Link für einen solchen URL? PrettyFaces liefert zu diesem Zweck die Komponente <pretty:link> mit. Sie benötigt lediglich die ID des URL-Mappings und die Werte der Path-Parameter, die mithilfe von <f:param> Tags gesetzt werden. Mit dieser Komponente kann die Kategorietabelle auf der Startseite wie folgt um Links auf die jeweiligen Kategorieseiten erweitert werden:

Kommen wir auf die CategoryBean zurück. Da der Name der adressierten Kategorie in die Bean injiziert wurde, kann die Kategorie in der Page Action aus der Datenbank geladen werden. An dieser Stelle ist es äußerst wichtig, darauf zu achten, dass ungültige Kategorienamen korrekt behandelt werden. Da der Name direkt aus dem URL übernommen wird, muss er wie eine Benutzereingabe behandelt und somit genau geprüft werden.

Wir werden es uns in diesem Beispiel möglichst einfach machen. Findet das DAO keine Kategorie mit dem entsprechenden Namen, liefern wir den http-Status 404 Not Found zurück. Das lässt sich besonders einfach mithilfe der Klasse PrettyContext realisieren. Sie enthält Informationen bezüglich des aktuellen Requests und einige nützliche Hilfsmethoden und kann, ähnlich wie der FacesContext, über eine statische Hilfsmethode bezogen werden.

Finden wir die Kategorie, können wir die Liste der Bücher abfragen. Listing 5 zeigt die JSF-View der Kategorieseite. Sie enthält neben dem Kategorienamen in der Überschrift eine Tabelle mit allen Büchern dieser Kategorie.


  

TitelAutorPreis

Listing 5: category.xhtml

Validierung

Wie der Link in der letzten Spalte der Tabelle bereits andeutet, benötigen wir nun natürlich noch eine Seite, die alle Details eines Buchs darstellt. Auch hier wollen wir das anzuzeigende Buch durch einen Path-Parameter identifizieren. Bei Büchern bietet sich dafür die 13-stellige ISBN-Nummer an. Um möglichst früh offensichtlich ungültige ISBN-Nummern zu erkennen, werden wir den Wert des Path-Parameters mit einem regulären Ausdruck prüfen. Dazu fügen wir den regulären Ausdruck durch Schrägstriche eingeschlossen in den Path-Parameter ein (Listing 6). Das URL-Pattern wird nur dann aktiviert, wenn die ISBN-Nummer aus genau 13 Ziffern besteht.

@Named("bookBean")
@RequestScoped
@URLMapping(id="book", viewId="/faces/book.xhtml", 
  pattern="/book/#{ /[0-9]{13}/ bookBean.isbn }")
public class BookBean {

  @Inject
  private BookDao bookDao;
  
  private Long isbn;

  private Book book;
  
  @URLAction
  public void initView() {
    
    book = bookDao.getByISBN(isbn);
    if( book == null ) {
      PrettyContext.getCurrentInstance().sendError(404);
      return;
    }
    
  }

  /* Getter + Setter */
}

Listing 6: BookBean.java

Neben solchen regulären Ausdrücken lassen sich zur Prüfung auch JSF-Validatoren an einzelne Parameter binden. Näheres zu diesem Thema lässt sich in der PrettyFaces-Dokumentation nachlesen. Der Rest der Bean ähnelt denen der anderen Seiten. Die initView()-Methode lädt das Buch anhand seiner ISBN-Nummer aus der Datenbank. Listing 7 zeigt eine einfache Version der zu diesem Mapping gehörenden JSF-View.


  

Listing 7: book.xhtml

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.