@WebServlet annotatie met Tomcat 7

In mijn toepassing, ik had een servlet die werd gedefinieerd als dit in de web.xml:

<servlet>
    <display-name>Notification Servlet</display-name>
    <servlet-name>NotificationServlet</servlet-name>
    <servlet-class>com.XXX.servlet.NotificationServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>NotificationServlet</servlet-name>
    <url-pattern>/notification/*</url-pattern>
</servlet-mapping>

Na de verhuizing naar het gebruik van Tomcat 7, ik zou graag gebruik maken van de @WebServlet annotatie die het werk doen.

Hier is de manier waarop ik het heb gedaan:

@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {

En het werkt niet.
Kan iemand mij vertellen wat ik verkeerd gedaan?

  • Ik was in staat om zich te ontdoen van zo veel standaard XML omdat van deze vraag. Hoera voor aantekeningen!
InformationsquelleAutor Dvora | 2011-06-30



3 Replies
  1. 111

    Op voorwaarde dat u er zeker van bent dat u Tomcat 7 of nieuwer, de webapp is web.xml worden gedeclareerd conform Servlet 3.0 specificatie om Tomcat te scannen en het verwerken van de meldingen. Anders Tomcat zal nog steeds worden uitgevoerd in een fallback-modus overeenkomen met de Servlet versie in web.xml. De steun voor de servlet API annotaties werd pas toegevoegd in Servlet 3.0 (Tomcat 7).

    Dus, de wortel verklaring van uw web.xml moet er uitzien als hieronder (zorg ervoor dat u een DOCTYPE van web.xml te zijn, anders wordt het nog worden geïnterpreteerd als een Servlet 2.3!).

    <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">

    Verder is er een klein verschil in het URL-patroon. De URL-patroon /notifications laat de servlet alleen luisteren op verzoeken op precies die pad. Het heeft geen schop in op verzoeken met een extra pad als /notifications/list of iets. De URL-patroon /notifications/* laat de servlet luisteren op aanvragen met extra pad-info ook.

    De minimale @WebServlet annotatie zo moeten uitzien

    @WebServlet("/notifications/*")

    De rest van de attributen zijn optioneel en dus niet verplicht om de servlet te functioneren even.

    Zie ook:

    • U kan nodig zijn om de <web-app (...) metadata-complete="false"></webapp>.
    • dat is de standaard al.
    • Men hoeft niet te gebruiken web.xml op alle bij het gebruik van @WebServlet annotatie. Het werkt zonder web.xml.
    • dat is juist. Echter, als u die heeft, zoals in OP de zaak, het moet ten minste 3.0. Je moet uiteindelijk één, omdat niet alles kan worden geannoteerd.
    • maar op servlet wiki en.wikipedia.org/wiki/Java_Servlet het met ondersteuning van versie 2.5. Hoewel ik getest het werkt niet met versie 2.5 het vereist versie 3.0. Maar ik ben een beetje in de war na het lezen van servlet wiki pagina
    • Dus u zegt dat de informatie op Wikipedia is meer betrouwbaar dan de informatie in Oracle ‘ s eigen Servlet specificatie document? Waarom precies?
    • Ik had het vreemde effect dat de servlet werkte toen was aangepast, gecompileerd en overgeplaatst naar glassfish 4. Toen ik opnieuw gecompileerd zonder veranderingen, en ingezet, het werkte niet. De toevoeging van de metadata-complete=”false” kenmerk en wist de webservlet-annotatie, en nu werkt het. Andere servlets bezig waren de hele tijd al.

  2. 6

    Kan men ook controleren of het hebben van twee klassen met een annotaties met dezelfde naam:

    @WebServlet(name = "Foo", urlPatterns = {"/foo"})
    public class Foo extends HttpServlet {
        //...
    }

    En:

    @WebServlet(name = "Foo", urlPatterns = {"/bar"})
    public class Bar extends HttpServlet {
        //...
    }

    In deze gevallen, een van de servlets zal niet werken. Indien u geen gebruik maken van de naam, laat het, zoals @BalusC suggereert. Ik heb het vreemde gedrag dat een van de servlets alleen gewerkt, na het veranderen en compileren, maar niet na compilatie zonder veranderingen.

    • Als je naar beneden stemmen, laat een reactie achter, anders zal niemand in staat zijn te reageren, te verbeteren of te leren. Dank u.
  3. 2

    Bovendien in om gebruik te maken van deze aantekeningen en het compileren van de code importeert u de bijbehorende afhankelijkheden in uw pom.xml maar zoals voorzien oorzaak van uw “Servlet 3.0” – compatibele server heeft al deze.

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *