2009-08-27 16 views
7

Ich bin neu in der Webentwicklung und frage mich nur über Best Practices für Java-Servlets. Sollte jedes Servlet genau eine Aktion ausführen, dh ein Servlet für die Anmeldung, ein Servlet für die Registrierung usw., oder sollte ich ähnliche Aktionen kombinieren, indem ich einen anderen Parameter übergebe, um dem Servlet mitzuteilen, welche Aktion ausgeführt werden soll?Wie viele Aktionen sollte ein Servlet ausführen?

Prost

+0

Nur als Hinweis, wenn Leute über ein einzelnes Servlet sprechen, denken sie entweder an Front Controller Pattern oder ihre Java-spezifische Annahme, die als MVC Model 2 bekannt ist und wenn Leute über mehrere Servlets sprechen, denken sie daran traditionelles MVC-Muster. – Esko

Antwort

4

In Frameworks wie Struts gibt es ein einziges Servlet (obwohl es mehrere Instanzen davon ausgeführt sein könnte). Dieses Servlet wird Anfragen für verschiedene URLs bearbeiten und diese an die entsprechenden Aktionshandler übergeben.

Ich schreibe nur zusätzliche Servlets für die Bereitstellung verschiedener Inhaltstypen wie ein Bild-Rendering-Servlet.

+1

Dies gilt für so ziemlich jedes moderne Web-Framework. Die Anzahl der Servlets ist in der Regel sehr begrenzt (ein oder zwei für die gesamte Anwendung) und wird normalerweise vom Framework implementiert. Servlets von Grund auf neu schreiben ist heutzutage untypisch. –

+0

Obwohl JSP-Dateien vom Webserver in Servlets kompiliert werden. – pjp

+0

Spring's Inversion of Control-Funktionalität macht dies wirklich sehr einfach, weil es Ihnen ermöglicht, die Aktion als Schlüssel für eine Art von Karte zu übergeben, die dann den entsprechenden Handler aufruft. Mit ein wenig Vererbung können Sie Ihren Servlet-Code sehr sauber machen und Verantwortlichkeiten sehr leicht trennen. –

4

Sie sollten niemals Argumente übergeben, um einem Servlet mitzuteilen, dass es verschiedene Aktionen ausführen soll. Alles, was Sie damit machen, ist die Kombination von 2 Servlets zu einem, und das wird schwieriger zu verwalten. Sie werden ein Servlet für jede Aktion benötigen.

Ein Beispiel dafür, was dies zu vermeiden ist:

/App/Servlet1 action = edit

if (request.getParamater("action").equals("edit")) { 
//update fields 

} else if (request.getParamater("action").equals("view")) { 
//just query 
} 

Dies führt dazu, weiter eine Menge Probleme zu verursachen, wenn Sie etwas neu zu gestalten möchten. Sie werden separate Servlets haben wollen, weil es Ihre Logik entkoppelt, so dass Sie es leicht ändern können, anstatt seine verschiedenen Feinheiten des Codes zu verbinden, mit denen es nicht verwandt sein sollte. Schauen Sie auch in Separation of Concerns.

Überarbeitet/editiert: Ich werde das jetzt sagen (viel später zur ursprünglichen Antwort) ... Sie können das Konzept der "Mehrfachaktionen" beibehalten und in ein einziges Servlet (Controller) einfügen. Dieser Controller könnte und sollte an einzelne Aktionshandler delegieren. Ich denke, das ist das gleiche in Bezug auf die Trennung von Bedenken und ist sauberer als meine ursprüngliche Antwort. Mit anderen Worten, implementieren Sie nichts im Servlet, verwenden Sie das nur für das Routing.

1

Ich bevorzuge weniger Servlets und mehr. Sie können Servlet sehr gut als einen einzigen Einstiegspunkt verwenden, wie in vielen Web-Frameworks. Das einzelne Servlet empfängt alle HTTP-Anfragen und basierend auf der Anfrage wird die richtige Aktion ausgewählt. Das ist Grund Front Controller, die viele Vorteile wie die Möglichkeit geschaffen ziemlich leicht zentralisierte Funktionalitäten zu schaffen, wie die Authentifizierung etc .. Hier einige weitere Informationen über das: http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Mit Funktionalität in vielen Servlets verkompliziert die Dinge nur unnecesserily. Bedenken Sie jedoch, dass Sie auch mit nur einem Servlet Probleme machen können, wenn Sie Ihren Code nicht gut verteilen und verwalten.

0

Wenn Ihre Webanwendung komplex genug ist, dass die Anzahl der Aktionen die Anzahl der Servlets überschreiten kann, die Sie verarbeiten können, dann sollten Sie ein Webframework betrachten, um dieses Problem zu abstrahieren .

Ihre Servlet-Schicht ein paar Dinge nur tun sollten:

  1. Yank Eingabe von Anfrage
  2. Dispatch-Objekte Sitzungsstatus verwalten zu/von Geschäftsobjektschicht
  3. Push-Daten in die Antwort
  4. Weiterleiten an eine Ansicht
  5. Handle Fehler/schlechte Eingabe/Ausgabe

Fast alles andere, das in ein Servlet gesteckt wird, ist eine schlechte Idee.

Wenn Sie einige einfache Richtlinien befolgen, kann ein einfaches Servlet einen Eingabeprozessor aufrufen, um Daten von der Anfrage und von Daten, die sich in der Sitzung befinden, in ein geeignetes Objekt umzuwandeln. Dieses Objekt kann dann an eine BizObject-Ebene übergeben werden. Diese Ebene gibt Informationen zurück, die möglicherweise in der Sitzung gespeichert wurden, und einige Objekte, die an die Ansicht übergeben werden.

Ich erzwang eine 40-Zeilen-Regel für Servlet-Service-Methoden. Wenn Sie über 40 Zeilen gingen, erwartete ich eine gute Erklärung.

Ich arbeitete an einer 80k Linie Java Web App, die zwei Servlets hatte, keine 40 Zeilen überschritten. Es behandelte ungefähr 60 Formen/Zustände.

Zu keinem Zeitpunkt dachte ich, es wäre einfacher zu verwalten/pflegen/ändern die App, wenn mehr Code im Servlet wäre.

1

Jedes Servlet sollte eine bis vier Aktionen haben, die als doDelete, doGet, doPost und doPut bezeichnet werden. Diese Namen entsprechen den HTTP-Methodennamen DELETE, GET, POST und PUT. Zusammen bauen sie eine REST ful API. Sie verwenden die volle Leistung von HTTP, wenn Sie eine Serverressource mit dieser einheitlichen Schnittstelle schreiben.

Um eine RESTful API zu erhalten, denken Sie an Ressourcen als Substantive mit einem Standardsatz von Aktionen. Sie werden mit mehr Servlets (Controllern) als mit einem Framework wie Struts enden, aber jedes Servlet hat nur eine begrenzte Anzahl von Aktionen.

Viele Frameworks verwenden das Front-Controller-Muster mit einem einzelnen Servlet, das eine Anforderung an einen Controller oder eine Aktion sendet. Aber Framework-Controller oder Aktionen tendieren dazu, die Funktionalität der Servlet-API zu duplizieren. Der Servlet-Container ist bereits eine Art Front-Controller, der Anfragen an einen Handler (ein Servlet) sendet.

+0

Dies geht über den Umfang der Servlet API hinaus. Nutzen Sie einfach die JAX-RS API. – BalusC

+0

JAX-RS ist nur eine weitere Möglichkeit, RESTful-Anwendungen zu schreiben. Die Servlet-API unterstützt REST von Anfang an. JAX-RS ist bequemer, wenn eine massive Verwendung von Anmerkungen akzeptiert wird. – deamon

Verwandte Themen