2010-12-13 44 views
13

fragment web.xmlspring mvc comment contourner DispatcherServlet pour les fichiers * .html?

<!-- Handles all requests into the application --> 
<servlet> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/app-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Il fonctionne très bien, mais je voudrais ne pas laisser la poignée Dispatcher Servlet * demandes .html. Comment est-ce que je fais ça? Merci.

+1

Cela peut être une aide: http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all- request-but-exclude-static-content-d – AHungerArtist

+0

@AHungerArtist Merci pour le lien. J'ai trouvé une bien meilleure réponse là-dedans. –

Répondre

5

Mappez-le sur un url-pattern plus spécifique.

<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/spring/*</url-pattern> 
</servlet-mapping> 

Créer une Filter qui est mis en correspondance sur /*.

<filter-mapping> 
    <filter-name>Your Dispatcher Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
<filter-mapping> 

qui effectue les opérations suivantes dans la méthode doFilter().

String uri = ((HttpServletRequest) request).getRequestURI(); 
if (uri.endsWith(".html")) { 
    chain.doFilter(request, response); // Just let it go (assuming that files are in real not placed in a /spring folder!) 
} else { 
    request.getRequestDispatcher("/spring" + uri).forward(request, response); // Pass to Spring dispatcher servlet. 
} 
+0

Cela fonctionne presque pour moi ... using getRequestURI retournera un chemin incluant le chemin de contexte. En supposant que votre contexte est/ctx, une requête à/ctx/foo sera envoyée à/ctx/spring/ctx/foo Je pense que getServletPath() + getPathInfo() (si pathInfo! = Null) fonctionne mieux – VoidPointer

+0

Ceci résoudra mon problème. Merci BalusC, Vous êtes génial –

0

Essayez d'ajouter ceci à votre configuration XML Spring:

<!-- This will override the default DefaultAnnotationHandlerMapping that is created, 
    - and not map file extensions automagically --> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="useDefaultSuffixPattern" value="false"/> 
</bean> 

Cela permettra d'éviter printemps de cartographier automatiquement les requêtes avec .html à votre contrôleur. Par exemple. @RequestMapping(value = "/products/widgets", method = RequestMethod.GET) devrait normalement intercepter une adresse URI de /products/widgets.html ainsi que . L'ajout du code XML ci-dessus force la correspondance exacte des modèles d'URI par Spring (seul ce dernier correspondra).

23

Dans Spring MVC 3.x, il y a le default servlet handler pour résoudre ce problème.

ajouter ceci à la configuration XML Spring:

<mvc:default-servlet-handler/> 
+0

Super. Je me souviens de cette config mais je ne me souviens pas exactement du code. Je vous remercie. – bnguyen82

+0

Nice, merci – Ramp

+0

Vous avez sauvé ma journée. Merci – Bhaskara

2
<url-pattern>/*</url-pattern> 

peut attraper comme /index, /*.html, /*.jsp ... et donner à DispatcherServlet.

<url-pattern>/</url-pattern> 

ne peut attraper /index, /main ..., sans suffixe.

+0

Wow, le plus simple de tous. – Aakash

2

La solution de Lari (ci-dessus) est géniale, et a fonctionné pour moi, mais vous devez faire très attention à l'ordre dans lequel vous écrivez l'instruction, cela doit être au début du document !!!

Dans mon cas était quelque chose comme:

<mvc:annotation-driven /> 
<mvc:default-servlet-handler/> 

<context:annotation-config /> 
<context:component-scan base-package="org.civitana.controller" /> 
+0

Très belle solution, résolu quelques autres problèmes aussi! – Aakash