Einfaches URL Rewriting mit Seam 2.1

Viele Webseiten und Blogs, wie auch javathreads.de, haben ein “URL Rewriting” aktiviert. Das bedeutet, dass die URL im Browser keine einzelnen Parameter mehr in Form von “?id=1&order=desc” anzeigt sondern eine “saubere” URL, wie z.B. http://javathreads.de/2008/11/einfaches-url-rewriting-mit-seam-21 für diesen Artikel, zu sehen ist. Mir persönlich gefällt diese Art der URL Darstellung auch wesentlich besser und auch die Suchmaschinen honorieren das.
Entwickelt man nun eine eigene Webanwendung und verwendet dazu ein Framework wäre eine direkte Unterstützung für ein solches URL Rewrite natürlich sehr wünschenswert.

Mit der aktuellen Seam 2.1 Version wurde nun diese URL Rewrite Unterstützung direkt eingebaut und man muss kaum etwas konfigurieren um es zum laufen zu bringen. Wie einfach das ist soll im folgenden kurz gezeigt werden.

Um das URL Rewriting zu aktivieren muss in der components.xml folgende Zeile eingefügt werden:

<web:rewrite-filter view-mapping="*.seam"/>

Dazu wird der Namespace web benötigt. Dieser muss in der components.xml somit auch bekannt gemacht werden. Dazu folgende Namespace Angabe in dem Root Element components einfügen:

<components xmlns="http://jboss.com/products/seam/components"
  ...
  xmlns:web="http://jboss.com/products/seam/web"
  xsi:schemaLocation=
     ...
     http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd">

Nachdem dies in der components.xml angegeben wurde können in der pages.xml die Rewrite Regeln konfiguriert werden.

Als Beispiel dient ein kleines Testprojekt um Java Code Schnipsel zu erfassen und einzugeben (mittlerweile online ereichbar: http://java-schnipsel.de). Die Seite um ein Schnipsel hinzufügen heißt addSnippet.xhtml und kann unter der URL http://localhost:8080/JavaSnippets/addSnippet.seam aufgerufen werden:

Schöner ist natürlich die URL einfach nur mit /add anstatt umständlich mit addSnippet.seam aufrufen zu können.
Um das zu bewerkstelligen muss in der pages.xml lediglich eine kleine Konfiguration für diese Seite vorgenommen werden, die wie folgt aussieht:

<page view-id="/addSnippet.xhtml">
  <rewrite pattern="/add"/>
</page>

Durch die Änderungen an der components.xml muss der JBoss komplett neu gestartet werden. Wurde nur die pages.xml modifziert reicht auch das automatische Hot Deployment.
Anschließend gelangt man durch die URL http://localhost:8080/JavaSnippets/addSnippet.seam auf die gewünschte Seite und das sieht dann im Browser wie folgt aus:

Wie sieht das ganze mit Request Parametern aus? Um bei diesen Java Schnipsel Beispiel zu bleiben wird nun die Seite snippet.xhtml betrachtet. Dieser kann man einen Request Parameter snippetId mitgeben um das gewünschte Java Snippet aufzurufen.
Die URL sieht somit wie folgt aus: http://localhost:8080/JavaSnippets/snippet.seam?snippetId=1.

Um ein Java Schnipsel anzuzeigen wird die Seam Action ViewSnippetAction.java, welche den Request Parameter entgegennimmt und das Snippet lädt, verwendet. Die Klasse ist verkürzt dargestellt – man sollte natürlich ein paar Dinge abfangen wie z.B. wenn keine ID übergeben oder kein Snippet zur übergebenen ID gefunden wurde:

@Name("viewSnippetAction")
public class ViewSnippetAction {

  @RequestParameter
  Long snippetId;

  @In
  private EntityManager entityManager;

  @Factory(value = "snippet", scope = ScopeType.EVENT)
  public Snippet loadSnippet() {
    return entityManager.find(Snippet.class, snippetId);
  }
}

Jetzt zu dem interessanten Teil, dem URL Rewrite. Die Seite snippet.xhtml soll unter der URL /view zu sehen sein und der Request Parameter heißt “snippetId“. Dazu in der pages.xml folgende Konfiguraton angeben:

<page view-id="/snippet.xhtml">
  <rewrite pattern="/view/{snippetId}"/>
</page>

Durch die geschweiften Klammern wird ein Requestparameter konfiguriert. Der Requestparametername muss mit dem in in der Seam Action durch die Annotation @RequestParamter definierten Attributnamen übereinstimmen.

Somit wird der Wert nach /view/ wie z.B. /view/12 auf das Attribut snippetId in der ViewSnippetAction.java gemappt.
Im Browser kann die Seite somit nun unter der URL http://localhost:8080/JavaSnippets/view/1 aufgerufen werden, was dazu führt, dass das Snippet mit der ID 1 geladen wird:

Sieht doch schon viel besser aus und wie man sehen kann sind solche URL Rewrite Regeln mit Seam 2.1 sehr schnell konfiguriert.

Das Thema URL Rewrite kann man natürlich auch in der sehr guten Seam 2.1 Referenzdokumentation nachlesen.

Und wer sich das Projekte “Java Schnipsel” genauer ansehen möchte kann es unter der URL http://java-schnipsel.de erreichen. Fühl dich frei einfach und schnell ein Java Schnipsel hinzufügen: http://java-schnipsel.de/add

Tags: , ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

hy!

Unfortunatelly this example is not work for me.( the conversationId or another param is not rewritten)

I would like to send me the above example, please!

Thank you very much!
bakaibalazs@gmail.com

oh, its work since 1 don’t work navigation.xml :)

In my example at home it works also with a conversation. The convesation id will be appended automatically at the end of the url and look like this:
http://localhost:8080/JavaSnippets/add?cid=3

So if you start a conversation it doesn’t matter whether you rewrite the url or not – the conversation will be appended per default.
And you’re right: you have to use the pages.xml file for define you navigation and rewrite rules in Seam.

An other trick to hide the conversation id in an rewrited url is the following rewrite configuration:

<page view-id=”/addSnippet.xhtml”>
<rewrite pattern=”/add-{conversationId}”/>
</page>

In this case the url will be lool like this:
http://localhost:8080/JavaSnippets/add-3

But the major difficulty for me was to disable viewing the conversation id in the url ;).

Hinterlasse einen Kommentar