Archivi giornalieri: 24 Gennaio 2012

Avere più pattern per la stessa servlet

A volte capita che si voglia mappare una servlet su più URL che non sono facilmente descrivibili con una sola espressione; difatti questa possibilità è stata prevista nella strutturazione del file web.xml.

Normalmente la mappatura avviene in questo modo:

<servlet-mapping>
<servlet-name>fred</servlet-name>
<url-pattern>/john</url-pattern>
</servlet-mapping>

che equivale a dire che se viene richiamato l’URL http://nomehost/context/john allora si deve richiamare la servlet fred.

Al posto di pattern costanti, si posso utilizzare delle espressioni, come ad esempio in:

<servlet-mapping>
<servlet-name>fred</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

Nel caso che si voglia fare richiamare la stessa servlet su due diversi url, si deve fare in questo modo:

<servlet-mapping>
<servlet-name>fred</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>fred</servlet-name>
<url-pattern>/altrourl</url-pattern>
</servlet-mapping>

Almeno, questa è la sintassi che funziona con tomcat 5.5. Notare che la sintassi alternativa:

<servlet-mapping>
<servlet-name>fred</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>/altrourl</url-pattern>
</servlet-mapping>

viene accettata da tomcat, ma solo l’ultimo url-pattern viene utilizzato, il che è in genere è una brutta scoperta quanto il file web.xml non è stato scritto a mano, ma realizzato da uno strumento automatico come netbeans…

La specifica servlet 2.5 dice, al paragrafo SRV.19.0.3 intitolato «Multiple Occurrences of Servlet Mappings»:

Previous versions of the servlet schema allows only a single url-pattern or servlet name per servlet mapping. For servlets mapped to multiple URLs this results in needless repetition of whole mapping clauses.

il che vuol dire che in effetti il comportamento di tomcat5.5, che accetta più url-pattern all’interno dello stesso servlet-mapping, è sbagliato poiché tomcat 5.5 aderisce alla specifica 2.4 e non alla 2.5.

Ho aperto una segnalazione agli autori di tomcat. Vediamo come va.