2016-04-29 3 views
3

Es gibt zwei Möglichkeiten für das Servlet-Mapping. Die erste ist in web.xml:Tomcat: Servlet-Zuordnung vs. WebServlet-Annotation

@WebServlet("/foo") 
public class foo extends HttpServlet { 
... 
} 

Welche besser ist:

<servlet> 
    <servlet-name>foo</servlet-name> 
    <servlet-class>com.whatever.foo</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>foo</servlet-name> 
    <url-pattern>/foo</url-pattern> 
</servlet-mapping> 

Die zweite Methode, um die WebServlet Annotation verwendet? Wo sind die Vorteile der ersten und zweiten Weg?

Antwort

4

XML-Konfiguration:

Vorteile:

Alle Zuordnungen in der gleichen Lage sind, haben Sie eine Übersicht über alle von ihnen in einer einzigen Datei.

Nachteile:

benötigt eine separate Datei zusätzlich zu den Klassendateien.

Annotation configuration:

Vorteile:

Die Abbildung wird direkt in der betreffenden Klasse beschrieben.

Nachteile:

Sie haben eine bestimmte Klasse öffnen ihre Zuordnungen zu sehen.

4

Vorausgesetzt, dass Sie sicher sind, dass Sie mit Tomcat 7 sind oder neue, web.xml die Webapp der haben erklärt werden konform Servlet 3.0 spec, um Tomcat zu bekommen, um zu scannen und die Anmerkungen zu verarbeiten. Ansonsten läuft Tomcat immer noch in einem Fallback-Modus, der der Servlet-Version in web.xml entspricht. Die Unterstützung für Servlet-API-Annotationen wurde nur in Servlet 3.0 (Tomcat 7) hinzugefügt.

die Wurzel Deklaration Ihrer web.xml muss also wie folgt aussehen (stellen Sie sicher, dass Sie jede DOCTYPE von web.xml entfernen, sonst wird es noch als Servlet 2.3 interpretiert werden!).

<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

Außerdem gibt es einen kleinen Unterschied im URL-Muster. Das URL-Muster /notifications lässt das Servlet nur Anfragen auf genau diesem Pfad zuhören. Es tritt bei Anfragen mit einem zusätzlichen Pfad wie /notifications/list oder so etwas nicht ein. Das URL-Muster /notifications/* lässt das Servlet auch Anfragen mit zusätzlichen Pfadinformationen zuhören.

Die minimale @WebServlet Anmerkung sollte so aussehen wie diese

@WebServlet("/notifications/*") 

Die übrigen Attribute sind optional und somit nicht zwingend das Servlet zu bekommen gleichermaßen zu funktionieren.

Was ist der Vorteil der Verwendung von Java-basierten Config anstelle von web.xml für Servlet 3.x? Sie vermeidet es, sich selbst zu wiederholen und dabei Fehler zu machen. Die Servlet-Klasse ist beispielsweise com.foo.bar.SomeServlet. Mit web.xml, sind Sie gezwungen, diese Klasse in web.xml erneut eingeben:

<servlet-class>com.foo.bar.Someservlet</servlet-class> 

Aber warten Sie, Sie einen Tippfehler gemacht haben, und Sie werden es erst zur Laufzeit entdecken.

Oder Sie benennen eine Servlet-Klasse um, aber Sie vergessen, sie auch in der web.xml umzubenennen, und Sie entdecken den Fehler nur zur Zeit der Bereitstellung.

Schließlich machen sie unser Leben leichter. Sie erstellen ein Servlet und möchten es offensichtlich einer URL zuordnen. Also fügen Sie einfach eine Anmerkung hinzu. Sie müssen nicht in eine andere Datei wechseln, um das Mapping hinzuzufügen, und dann zur Klasse zurückkehren, da Sie den genauen Namen vergessen haben, und dann wieder zur Datei zurückkehren. Alles was ein Servlet betrifft, ist in der Servlet-Klasse. Dasselbe gilt für einen Filter, Listener usw.

Anmerkungen haben nicht alle diese Probleme.

Ich hoffe, das hilft Ihnen!