2009-07-27 5 views
1

Angenommen wir einige Projekte mit folgenden Struktur:Best Practices der Implementierung von Front-Controller mit Java-Servlets

 
web 
    articles 
    main.jsp 
    sidearts.jsp 
    central.jsp 
    forum 
    main.jsp 
    css 
    js 
    WEB-INF 
    web.xml 

Bitte beachten, dass wir noch nicht an diesem Punkt Front-Controller haben.

mit einigen Facette Nach der Bereitstellung (lassen Sie es ‚asdf‘ sein) wir unsere Seiten mit folgenden URLs zugreifen können:

 
http://localhost:8080/asdf/articles/main.jsp 
http://localhost:8080/asdf/forum/main.jsp 

and so on.. 

main.jsp erzeugt eine HTML und umfasst sidearts.jsp (mittels jstl c : Importieren oder auf andere Weise)

Und was passiert nach dem Hinzufügen von Front Controller?

Angenommen, wir Servlet ArticlesController haben, die für den Versand
einige Anfragen zuständig ist und die nächste Abbildung hat:

<servlet> 
    <servlet-name>ArtsController</servlet-name> 
    <servlet-class>org.forstackoverflow.ArticlesController</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ArtsController</servlet-name> 
    <url-pattern>/articles/*</url-pattern> 
</servlet-mapping> 

Wenn wir jetzt URL anfordern http://localhost:8080/asdf/articles/main, ArticlesController behandelt diese Anfrage und versuchen, Artikel enthalten/main. jsp. Und an diesem Punkt beginnt der Infinity-Zyklus, da/arts/* ArtsController zugeordnet ist.

Was ist die korrekte Lösung des beschriebenen Problems?

Meine Varianten sind:

1) Mappings für alle jsp-Dateien machen (ich glaube nicht, dass es)

2) ändern Verzeichnisse Namen (Artikel-> Kunst acceptible ist); aber dann bekommen wir viele neue URLs (wie http://localhost:8080/asdf/arts/main.jsp) und ich denke, dass es eine Quelle von Bugs sein kann.

+0

Kommentieren zu Ich kann Beispiele von POEAA veröffentlichen, wenn ich nach Hause komme. –

+0

Aus Neugier, aus welchem ​​Grund möchten Sie Ihren eigenen (Servlet-basierten) Frontcontroller implementieren? Warum nicht für eines der vielen verfügbaren Open-Source-MVC-Frameworks entscheiden? –

Antwort

1

Sie könnten Servlets mit Filtern verwirren. Mit Servlet gibt es keine Endlosschleife. Ihre JSP-Seiten werden immer über exakte Muster zugeordnet, entweder explizit (wenn sie vorkompiliert wurden) oder implizit (über den JSP-Dateipfad relativ zu webapp root, wenn sie nicht vorkompiliert wurden). Was dies bedeutet, ist Ihr „Artikel/main.jsp“ wird effektiv ein Servlet mit der folgenden Abbildung sein:

<servlet-mapping> 
    <servlet-name>name_does_not_matter_here</servlet-name> 
    <url-pattern>/articles/main.jsp</url-pattern> 
</servlet-mapping> 

Mit Ihrem ArticlesController Servlet zugeordnet /articles/* folgenden passieren:

http://localhost:8080/asdf/articles/main URL behandelt werden von Ihrem Servlet, weil es nicht mit dem Muster für die JSP übereinstimmt. Die http://localhost:8080/asdf/articles/main.jsp URL, die mit beiden Mustern übereinstimmt, wird jedoch der JSP-Seite und nicht dem Servlet zugeordnet, da der Servlet-Container IMMER eine exakte Übereinstimmung über Wildcard-Übereinstimmung (dies ist ein Teil der J2EE-Spezifikation) vorzieht.

+0

Gibt es eine Möglichkeit, dasselbe Servlet mehrere Male ohne zusätzliche Kopien zu implementieren? Angenommen, ich schreibe ein CMS und möchte, dass zwei Kunden es verwenden können - ist das ein gültiger Anwendungsfall? Wird dies über web.xml gesteuert? –

+0

Ich bin mir nicht ganz sicher, was du meinst oder wie es sich auf die ursprüngliche Frage bezieht ... Wenn du mit "mehrfach einsetzen" meinst "map to different urls" dann ja, das kannst du machen. – ChssPly76

0

Da Sie MVC verwenden, sollten Sie den Client (d. H. Einen Browser) Zugriff auf die Ansicht, die JSP in diesem Fall. Das Controller-Servlet sollte aus der Sicht aufgerufen werden, wenn eine Aktion ausgeführt wird. Nach der Verarbeitung der Aktion in der Steuerung werden Sie zur nächsten Ansicht weitergeleitet (die dieselbe sein könnte wie die Aktion).

Das Servlet-URL-Muster stimmt mit einem echten Verzeichnis überein, weil es dem Container mitteilt Wählen Sie das Servlet anstelle der Standardseite für dieses Verzeichnis.