2009-10-15 8 views
1

J'ai deux servlets 'ExtensionServlet' et 'PatternServlet' et une page HTML statique. Le code HTML est donné ci-dessous.Ambiguïté dans le mappage de servlet

<html> 
    <head> 
     <title> 
      Resolve servlet ambiguity 
     </title> 
    </head> 
    <body> 
     <form action="servlets/form.col" method="POST"> 
      <input type="submit" value="Goto Servlet"> 
     </form> 
    </body> 
</html> 

Le descripteur de déploiement est le suivant.

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class>  
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>  
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

Lorsque je clique sur le bouton dans la page HTML, il conduit à "PatternServlet". Si je Réorganiser l'ordre de servlet dans le descripteur de déploiement comme ci-dessous, il va « ExtensionServlet »

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>   
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
    </servlet-mapping> 
</web-app> 

Quelqu'un peut-il expliquer ce comportement s'il vous plaît?

Tomcat 6.0.20 machine virtuelle Java 1.6.0_15-b03

Répondre

4

Votre schéma est-il un raccourci des éléments suivants?

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
    <servlet> 
     <servlet-name>Pattern Servlet</servlet-name> 
     <servlet-class>PatternServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>Extension Servlet</servlet-name> 
     <servlet-class>ExtensionServlet</servlet-class> 
    </servlet> 
    <servlet-mapping>     
     <servlet-name>Pattern Servlet</servlet-name> 
     <url-pattern>/servlets/*</url-pattern> 
    </servlet-mapping>     
    <servlet-mapping>     
     <servlet-name>Extension Servlet</servlet-name> 
     <url-pattern>*.col</url-pattern> 
    </servlet-mapping> 
</web-app> 

Dans votre version, je pense que vous ne définissez qu'une seule servlet.

Lorsque tomcat rencontre plusieurs définitions correspondant à une requête (comme dans votre cas), il utilise le premier.

+0

Ouais. Merci! mon erreur!! – bdhar

1

Cela ne ressemble pas à un descripteur de déploiement légal pour moi. Le schéma ne nécessite-t-il pas quelque chose comme ceci:

<servlet> 
    <servlet-name>Extension Servlet</servlet-name> 
    <servlet-class>ExtensionServlet</servlet-class>   
</servlet> 
<servlet> 
    <servlet-name>Pattern Servlet</servlet-name> 
    <servlet-class>PatternServlet</servlet-class> 
</servlet> 
<servlet-mapping>   
    <servlet-name>Extension Servlet</servlet-name> 
    <url-pattern>*.col</url-pattern> 
</servlet-mapping>   
<servlet-mapping>   
    <servlet-name>Pattern Servlet</servlet-name> 
    <url-pattern>/servlets/*</url-pattern> 
</servlet-mapping> 
+0

Oui. Merci! mon erreur!! – bdhar

2

Lorsque Tomcat reçoit une requête, il sélectionne une seule servlet à exécuter à l'aide des mappages de servlet configurés. Si l'URL demandée correspond à plusieurs mappages, la meilleure correspondance est sélectionnée, ignorant les autres. Par spécification, les mappages de modèle de préfixe de trajet sont préférés par rapport aux mappages d'extension. Cela signifie que, dans votre exemple, le mappage sur "/ servlets/" devrait l'emporter sur celui de " .col", et la requête devrait toujours provoquer l'exécution du servlet Pattern. Le comportement inattendu que vous avez lorsque vous réorganisez les déclarations est parce que votre descripteur n'est pas correct, comme cela a déjà été souligné par d'autres réponses. Essayez d'utiliser un descripteur correct, comme celui suggéré par David Rabinowitz.

+0

Merci Mr.Fliri. J'ai également corrigé mon descripteur. Et, où puis-je trouver la spécification qui me donne des informations sur la sélection du mappage de servlet et des préférences comme celle-ci? – bdhar