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

时间:2009-07-04 18:34:25

标签: java spring jsp spring-mvc

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

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

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

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 Variable>喜欢这个/ pet / show / {id}这样一套路径名称& value应该是支持然后在返回url

之前替换此String.replace()

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

3.多个URL到单个方法>比如@RequestMapping(value = {“/”,“welcome”})。如此简单的规则是先选择一个。

4.Ant Like Style Url>像这样*.do来解决这个问题就是通过在最后放置类似样式的ant来使用多个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属性是可选的。


我可能会想到一些问题。 :)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

Taglib代码可能大致类似于

  1. 向Spring询问带有@Controller注释的配置bean
  2. 以适当的顺序迭代,在控制器类或bean名称上寻找一些合适的匹配
  3. 如果@RequestMapping包含params,则替换它们
  4. 返回字符串
  5. 这可能适用于您的特定情况(@RequestMapping样式),但是当您有多个映射时,它可能会有点毛茸茸。也许自定义注释会使其更容易。

    编辑:

    AbstractUrlHandlerMapping :: getHandlerMap,由您最有可能使用的DefaultAnnotationHandlerMapping继承,返回一个URL映射到Handler

      

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

在视图层中查看this project集中路由器(如rails)和反向路由。

答案 6 :(得分:0)

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

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

相关问题