2009-07-04 26 views
14

Creo que lo que necesito se llama resolución de URL inversa en Django. Digamos que tengo una AddUserController que dice algo como esto:¿Puedo encontrar la URL para un controlador mvc de primavera en la capa de visualización?

@Controller 
@RequestMapping("/create-user") 
public class AddUserController{ ... } 

Lo que yo quiero es una manera de encontrar de forma dinámica la URL a este controlador o formar una URL con parámetros a la misma desde el punto de vista (JSP), por lo que no es necesario codificar urls para los controladores de todo el lugar. ¿Es esto posible en Spring MVC?

+0

Puede haber casos en que varias direcciones URL se asignan al mismo controlador y luego lo que desea hacer? –

Respuesta

2

¿Ha considerado tener un bean que agregue todas las URL de controlador que necesita en un HashMap y luego agregar este controlador/Mapa de URL a cualquier modelo que lo requiera? Cada controlador Spring tiene la capacidad de invocar un método init(), puede hacer que cada controlador agregue su nombre y URL al controlador/mapa de URL en los métodos init() para que esté listo para usarse cuando los controladores entren en funcionamiento.

+0

Trataré de crear mi propio HandlerInterceptor que agregue las asignaciones de controlador-> url y las publique en cada ModelAndView para cada solicitud. Pero aún así, esto no se acerca a lo que es posible con la resolución url y la resolución inversa de django. – Vasil

+0

Veo tu punto. Django centraliza agradablemente los patrones de url incluso permitiendo nombres para ellos. He saltado a la fuente Spring en el pasado para descubrir cómo se hacen las cosas, pero no es muy divertido – jottos

1

Puede obtener acceso al objeto de solicitud en cualquier archivo JSP sin tener que conectar manualmente o administrar el objeto en el JSP. así que eso significa que puede obtener la ruta url fuera del objeto de solicitud, tener un google en objetos implícitos JSP.

Aquí hay una página para que pueda empezar http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

+0

hmmm ... No estoy realmente interesado en obtener la URL de una solicitud entrante. Lo que quiero hacer es dar una clase o referencia de controlador y recuperar una url que será servida por ese conroller. Lo que resulta que es imposible "fuera de la caja". – Vasil

1

que probablemente tratar de construir una taglib que inspecciona las anotaciones que se está usando con el fin de encontrar una pareja adecuada:

<x:url controller="myController"> 
    <x:param name="action" value="myAction"/> 
</x:url> 

código Taglib podría ser algo más o menos así

  1. Haz primavera de habas configurados con la anotación @Controller
  2. Iterar en un orden adecuado en busca de alguna pareja adecuada en el nombre de la clase controlador o frijol
  3. Si el @RequestMapping incluye params, a continuación, sustituirlos
  4. devolver la cadena de

que podrían funcionar para su caso específico (Estilo @RequestMapping) pero es probable que se ponga un poco complicado cuando tiene varias asignaciones. Tal vez una anotación personalizada lo haría más fácil.

Editar:

AbstractUrlHandlerMapping :: getHandlerMap, que se hereda por la DefaultAnnotationHandlerMapping que estés muy probable que tenga, devuelve un mapa de URL para Handler

devolver los gestores registrados como Mapa inmodificable , con la ruta registrada como clave y el objeto del manejador (o el nombre del bean controlador en el caso de un manejador perezoso ) como valor.

De modo que podría iterar sobre eso buscando una coincidencia adecuada, donde la "coincidencia adecuada" sea la que desee.

1

Envié una solicitud de mejora para esta en mayo. Puede seguir/votar/comentar aquí: http://jira.springsource.org/browse/SPR-5779

+2

De hecho, estoy sorprendido de que no haya una forma incorporada de hacer esto. Esta es una de las características que amo en Django/Python. –

2

Se puede resolver con Java Reflection API. Al crear la biblioteca de etiquetas personalizadas.métodos ve así

Class c = Class.forName("Your Controller"); 

      for(Method m :c.getMethods()){ 
       if(m.getName()=="Your Method"){ 
        Annotation cc = m.getAnnotation(RequestMapping.class); 
        RequestMapping rm = (RequestMapping)cc; 
        for(String s:rm.value()){ 
         System.out.println(s); 
        } 
       } 
      } 

Problema Posible usted puede hacer frente es

1.Path variable> gusta esta/animal/mostrar/{id} de modo conjunto de nombre de ruta & valor debe ser el apoyo a continuación, reemplace este String.replace() antes de la URL de retorno

2. Método de anulación> solo un método no es problema. si el método reemplaza necesita dar la secuencia de soporte del tipo de parámetro que realmente desea como Method.getParametersType()

3.Multiple Url to Single Method> like @RequestMapping (value = {"/", "welcome"}). tan fácil es elegir el primero.

4.Alike Like Style Url> Me gusta *.do para solucionar esto es usando múltiples URL colocando el estilo de hormiga en el último ejemplo. @RequestMapping(value={"/pet","/pet/*.do"})


Así Posible estilo de etiqueta de enlace es

<my:link controller="com.sample.web.PetController" method="show" params="java.lang.Integer"> 
<my:path name="id" value="1" /> 
</my:link> 

Dónde parmas atributo es opcional si no hay un método sustituto.


Puede ser que deje de pensar en algún problema. :)

0

El problema con esto es que no hay un enrutador central en SpringMVC donde todas las rutas están registradas y ordenadas. Entonces el enrutamiento inverso no es un proceso estático y la resolución de ruta en la capa de vista puede ser difícil de integrar.

Consulte this project para obtener un enrutador centralizado (como los rieles) y el enrutamiento inverso en la capa de visualización.

0

Spring La biblioteca HATEOS le permite hacer enlaces a los Controladores.

Durante mucho tiempo he pensado en implementar algo como esto usando proxies CGLib, pero era demasiado vago. Parece Spring HATEOS library le permitirá hacerlo de manera proxy y variedad de otras formas.

Cuestiones relacionadas