[servlet] url-pattern

X

xardias

Guest
Guten Tag,

ich bastel schon länger an einem Framework für Java Webapps (ch weiß es gibt viele, doch ich habe meine Gründe).
Ich stehe doch gerade vor einem Problem:

Das Servlet wird über das url-pattern: *.page eingebunden.
Jede Webseite wird durch eine Klasse abgeleitet von HtmlPage repräsentiert.
Um die herauszusuchen wird die Request URI geparst. So wird bei einem aufruf der Seite "beispiel.com/testfolder/Test.page" Die Klasse "irgendeinpackage.testfolder.TestPage" instanziert und ausgegeben.
Dabei ergeben sich 2 Probleme:
Es lassen sich keine Index Seiten erstellen, also z.B. so dass "beispiel.com/testfolder/" die HtmlPage "irgendeinpackage.testfolder.IndexPage" öffnet. Dazu müsste ich sämtliche urls an das servlet leiten anstatt sie an das Default Servlet zu senden.
Doch dazu müsste ich wiederum sämtliche anderen Dateianforderungen selbst behandeln, was ich vermeiden möchte (ich wüsste auch nicht wie).
Das nächste problem ist ganz trivial:
die URLs sind komplett case sensitive. Und es lässt sich kaum umgehen.

Das "Rendern" einer HtmlSeite funktionerit komplett nur die frage, wie die Seiten letztenendes ausgewählt werden stört mich daran momentan. Wie würdet ihr das machen?
So dass man in einer properties Datei sämtlichen URI's eine Klasse zuordnet? Und wie würdet ihr das Problem mit den Index Seiten lösen?

Vielen Dank
Dennis 'xardias' Kempin
 
Hallo,

- zum 1. Problem: da bin ich überfragt, vielleicht hilft hier mod_rewrite oder auch hässlicherweise eine index.jsp, die die richtige IndexPage aufruft oder ein Redirect schickt.
- ad case sensitive: ich weiss zwar nicht wie dein FrontController-Servlet die HtmlPages aufruft, aber da könnt ich mir zB eine HashMap vorstellen, die als Keys die lowercase-Klassennamen als Strings enthält und als Values Referenzen auf Singletons der HtmlPages (Achtung Thread-Safety!)
- ad Links: für größere Projekte würd ich versuchen typsicher zu bleiben und zum Beispiel mit Link-Objekten arbeiten, die man nur durch htmlPageXY.getLink(Integer id, String username) bekommt, damit der Link mit all seinen Parametern und mit den richtigen Daten aus der Datenbank auch wirklich aufgeht. Implementierung ev. auch als Factory.
Ein Framework sollte aber sicherlich auch die deklarative Variante anbieten, da würd ich persönlich aber xml verwenden.

Ob dir das wohl geholfen hat...

Viel Glück!
Reini
 
Zum case (in-)sensitive:
Bei jedem Seitenaufruf wird die URI in einen Klassennamenumgewandelt, wovon dann eine instanz erzeugt wird, die in einer Map gespeichert wird. Problem ist jedoch, dass sich die Klassen nicht finden lassen, wenn der case nicht stimmt. mit Class.forName sehe ich keine möglichkeit case insensitive zu arbeiten außer festzulegen wie der case einer solchen klasse auszusehen hat. sprich: Erster Buchstabe upper-case der rest klein.
Oder ich müsste per hand für jede Seite einen Eintrag in einer hash map machen was ich eigentlich vermeiden möchte.
 
Zurück
Oben