我可以在视图层中找到spring mvc控制器的URL吗?

我认为我需要的是在Django中称为反向URL解析。 假设我有一个类似这样的AddUserController:

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

我想要的是一些动态查找此控制器的URL或从视图(JSP)形成带有参数的URL的方法,因此我不必将URL硬编码到控制器到处。 这是否可以在Spring MVC中使用?

您是否考虑过将bean所需的所有控制器URL聚合到HashMap中,然后将此控制器/ URL Map添加到需要它的任何模型中? 每个Spring控制器都能够调用init()方法,你可以让每个控制器在init()方法中将它的名称和URL添加到控制器/ URL映射中,这样它就可以在控制器上线时使用了。

可以用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 / show / {id}所以路径名和值的设置应该是支持然后在返回url之前替换这个String.replace()

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

3.Multiple Url to Single Method> like @RequestMapping(value = {“/”,“welcome”})。 如此简单的规则是先选择一个。

4.Ant Like Style Url>像这样*.do 。解决这个问题就是使用多个url,例如在最后放置类似ant的样式。 @RequestMapping(value={"/pet","/pet/*.do"})


所以可能的链接标签样式是

    

如果没有方法覆盖,parmas属性是可选的。


可能是我想到了一些问题。 🙂

您可以在任何JSP文件中访问请求对象,而无需手动将对象连接或管理到JSP中。 这意味着你可以从请求对象中获取url路径,将google转换为JSP隐式对象。

这是一个可以帮助您入门的页面http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

我可能会尝试构建一个taglib来检查您正在使用的注释,以便找到合适的匹配:

    

Taglib代码可能大致相似

  1. 向Spring询问带有@Controller注释的已配置bean
  2. 迭代一些合适的顺序,在控制器类或bean名称上寻找一些合适的匹配
  3. 如果@RequestMapping包含params,则替换它们
  4. 返回字符串

这可能适用于您的特定情况(@RequestMapping样式),但是当您有多个映射时,它可能会有点毛茸茸。 也许自定义注释会使它更容易。

编辑:

AbstractUrlHandlerMapping :: getHandlerMap,由您最有可能使用的DefaultAnnotationHandlerMappinginheritance,返回给Handler的URL Map

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

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

我在5月份提交了一份增强请求。 您可以在此处关注/投票/评论: http : //jira.springsource.org/browse/SPR-5779

这样做的问题是SpringMVC中没有中央路由器,其中所有路由都被注册和订购。 然后,反向路由不是静态过程,并且视图层中的路由分辨率可能难以集成。

在视图层中查看此项目以获取集中式路由器(如rails)和反向路由。

Spring HATEOS库允许您链接到控制器。

很长一段时间以来,我一直在考虑使用CGLib代理实现类似的东西但是太懒了。 看来Spring HATEOS库将允许您以其他方式执行代理方式和各种方式。