2011-05-10 21 views
9

Esto es similar a this question, pero todavía estoy confundido acerca de mi situación. Quiero trazar este patrón de estilo hormiga a un método de control:Usando Spring @RequestMapping con comodines

/results/** 

Es decir, quiero cualquier URL como www.hostname.com/MyServlet/results/123/abc/456/def/ para ir a este método. Tengo:

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/results/*</url-pattern> 
</servlet-mapping> 

y:

@RequestMapping(value="/**", method=RequestMethod.GET) 
public ModelAndView handleRequest() {...} 

Esto funciona para guiar la solicitud a mi método, pero me lleva a varias preguntas:

  1. ¿Y si añado otra correlación de servlets, como <url-pattern>/another-mapping/*</url-pattern> ??? ¡También se asignará a ese método! ¿Cómo puedo separar los dos?
  2. ¿Por qué funciona el url-pattern /results/*, mientras que /results/** no? De acuerdo con los estilos de ruta de hormiga, ** significa incluir caracteres anidados /, mientras que * se detiene en el siguiente /. Por lo tanto, solo debe correlacionar correctamente una URL como /results/123, bot NO /results/123/abc/. ¿Derecha?
+0

Acabo de empezar una recompensa por esto. Mira mis comentarios en la primera respuesta ... –

Respuesta

5

¿Y si añado otra correlación de servlet, como/otro mapeo/* ??? ¡También se asignará a ese método! ¿Cómo puedo separar los dos?

Con su configuración actual no puede. Si desea asignar DispatcherServlet a varios patrones de URL y distinguir entre ellos, se puede declarar DefaultAnnotationHandlerMapping con alwaysUseFullPath = "true" y utilizar ruta completa en @RequestMapping.

Como alternativa, puede asignar DispatcherServlet como <url-pattern>/*</url-pattern> y utilizar ruta completa en @RequestMapping sin tener que reconfigurar DefaultAnnotationHandlerMapping. Aunque en este caso necesitará configre exclusions for static content.

¿Por qué funciona el url-pattern/results/* work, mientras que/results/** does not? De acuerdo con los estilos de ruta de las hormigas, ** significa incluir caracteres anidados /, mientras que * se detiene en el siguiente /. Por lo tanto, solo debe correlacionar correctamente una URL como/results/123, bot NOT/results/123/abc /. ¿Derecha?

patrones de URL en web.xml no son patrones de estilo de hormigas, de manera que sólo .../**.xxx y se permiten comodines en ellos.

+0

Bien, entonces agregué a mi DefaultAnnotationHandlerMapping bean. ¿Cuál debería ser el valor de @RequestMapping? Lo siento, soy nuevo en esto ... –

+0

@Tony: Debería ser '/ results/**'. – axtavt

+0

De acuerdo, lo intenté y me aparece: "No se encontró ningún método de controlador coincidente para la solicitud de servlet: ruta '/ abc/123'" –

6

Tal vez en su correlación de servlet que se quiere dirigir todo el tráfico a '/ *'. De esta manera, puede distinguir en su controlador qué método usar con diferentes @ RequestMapping's.

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

y

@RequestMapping(value="/results/**", method=RequestMethod.GET) 
public ModelAndView handleResults() {...} 

@RequestMapping(value="/another-mapping/**", method=RequestMethod.GET) 
public ModelAndView handleAnotherMapping() {...} 

Esperamos que lo anterior le ayudará con el número 1. Por lo que el número 2 va, no creo que se puede utilizar comparadores de patrones 'de estilo hormiga' (específicamente **) en su descriptor de dominio web.xml.

+0

Hmm está bien, pensé que había leído que usa Ant-style, pero supongo que estoy equivocado. So/* corresponde a anidado/abc/123/....... –

Cuestiones relacionadas