2009-07-04 87 views
14

我认为我需要的是在Django中称为反向URL解析。比方说,我有一个是这样的AddUserController:我可以在视图图层中找到弹簧mvc控制器的URL吗?

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

我想一些方法来动态地找到网址到该控制器或形成从视图(JSP)的参数给它一个网址,让我不必硬编码到所有地方的控制器。这在Spring MVC中可能吗?

+0

可能有多个URL映射到相同的控制器然后你想要做什么的情况? – 2009-08-28 16:49:02

回答

2

您是否考虑过拥有一个bean,将所需的所有控制器URL集合到一个HashMap中,然后将该控制器/ URL映射添加到需要它的任何模型中?每个Spring控制器都可以调用init()方法,您可以让每个控制器将它的名称和URL添加到init()方法中的控制器/ URL映射中,以便在控制器启用时可以使用它。

+0

我会尝试制作我自己的HandlerInterceptor,它可以聚合控制器 - > url映射,并将它们广告给每个ModelAndView,以供每个请求使用。但是,这还没有达到django网址分辨率和反向分辨率所能达到的水平。 – Vasil 2009-07-04 19:19:00

+0

我明白你的观点。 Django很好地集中了url模式,甚至允许它们的名字。我已经跳进Spring源代码来弄清楚事情是如何完成的,但它并没有太多乐趣 – jottos 2009-07-04 20:07:13

1

您可以访问任何JSP文件中的请求对象,而无需手动将对象连接或管理到JSP中。这意味着你可以得到url请求对象的路径,将一个google放入JSP隐式对象中。

这里是一个网页,让你开始http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

+0

嗯......我并不是真正有兴趣从一个无聊的请求中获取URL。我想要做的是给一个控制器类或引用,并获取将由该控制器服务的URL。事实证明,这是不可能的“开箱即用”。 – Vasil 2009-07-20 11:45:59

1

我可能会尝试建立这种检查你使用的注释,以便找到合适的匹配标签库:

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

标签库的代码可能是这样大致是

  1. 向春天的配置豆类与注解@Controller
  2. 迭代在一些合适的顺序寻找在控制器类或bean名称一些合适的比赛
  3. 如果@RequestMapping包括参数,可以再替换他们
  4. 返回字符串

这可能会为您的特定情况下工作(@RequestMapping风格),但当你有多个映射时它可能会有点毛毛。也许一个自定义注释会使它更容易。

编辑:

AbstractUrlHandlerMapping :: getHandlerMap,这是你最有可能使用的DefaultAnnotationHandlerMapping继承,返回一个URL映射到处理程序

返回注册的处理程序作为 不可修改的地图,注册的 路径作为键和处理程序对象(或 处理程序的bean名称,如果是 lazy-init处理程序)作为值。

所以你可以迭代,寻找一个合适的匹配,其中“合适的匹配”是任何你想要的。

2

可以用Java Reflection API解决。通过创建自定义标签库。方法是这样的

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); 
        } 
       } 
      } 

可能的问题,你可以面对的是

1.Path变量>筛选/ PET /显示/ {ID}所以设置路径名的&值应为支持则在返回url之前替换此String.replace()

2.方法覆盖>只有一种方法没有问题。如果方法重写需要提供参数类型的支持序列您真的很想要Method.getParametersType()

3.多Url到单一方法>像@RequestMapping所以轻松的规则是第一个选择。

4.Ant Like Style Url>像这样*.do解决这个问题是通过将蚂蚁样式放在最后例如使用多个URL。 @RequestMapping(value={"/pet","/pet/*.do"})


所以可能的链接标签风格

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

哪里parmas属性是可选的,如果没有方法重写。


可能是我留下来想想一些问题。 :)

0

这个问题是SpringMVC中没有中心路由器,所有路由都被注册和排序。然后反向路由不是一个静态过程,视图层中的路由分辨率可能难以整合。

检出this project集中路由器(如导轨)和视图层中的反向路由。

0

Spring HATEOS库允许您创建指向控制器的链接。

很长一段时间我一直在想使用CGLib代理来实现类似的东西,但是太懒惰了。看起来Spring HATEOS library将允许你做它的代理方式和其他方式的各种。

相关问题