【问题标题】:How can I create a URL based on controller and action method in Spring MVC?如何在 Spring MVC 中基于控制器和操作方法创建 URL?
【发布时间】:2011-08-26 18:00:06
【问题描述】:

我正在使用 Spring MVC 3.0

我有一个 guestbook.jsp 页面,我想在其中创建一个指向 GuestBookController 登录方法的链接。

这是一个大多数 web 框架处理的简单任务(例如 grails 使用 g:link 标记),但我在 SpringMVC 官方文档中找不到任何文档。

所以我摸不着头脑 - 这个功能在某些标签库中吗?框架是否公开了它?我是否必须扩展框架才能使其正常工作?

请注意,我不会对 url 进行硬编码(这是一个明显但弱的解决方案),而是根据控制器和操作名称生成它。

更新: Spring MVC 不提供此功能。不过有一张 JIRA 票。你可以在这里投票https://jira.springsource.org/browse/SPR-5779

【问题讨论】:

    标签: java spring jsp spring-mvc


    【解决方案1】:

    简短的回答是否定的,您目前无法使用 Spring MVC 执行此操作。

    很遗憾,因为您可以在其他框架中执行此操作,包括 Grails(在后台使用 Spring MVC)。

    请参阅讨论 here,其中包含一个指向 Spring 功能请求的链接以添加此功能(投票!)

    【讨论】:

    【解决方案2】:

    Spring MVC 在 JSP 中使用标准的 JSTL 标签:

    <c:url value="/guestBook.html" var="guestBookLink" />
    <a href="${guestBookLink}">Guest Book</a>
    

    在您的控制器中:

    @RequestMapping(value = "/guestBook")
    public String handleGuestBook() { ... }
    

    【讨论】:

    • 我不想硬核网址。我想要做的是指定控制器和操作方法,并让框架找出解析为的 url。这更健壮,许多框架都这样做 - 例如 grails 使用 g:link 标记。
    • 不幸的是,我不认为 Spring 已经内置了对这样一个标签的支持,你可以制作你自己的简单标签库,但是结合使用这里描述的 ControllerClassNameHandlerMapping static.springsource.org/spring/docs/3.0.x/reference/…
    • @lamalamathis 您所描述的不是 Spring 的工作方式,您的控制器的方法映射到的 URL 没有抽象(对我来说这听起来是件好事,因为这种抽象听起来会是过于模糊和过于现实)
    • 您能否详细说明为什么您认为“这种抽象听起来过于模糊和过于现实”?
    • 既然您了解 grails,您就知道除了配置映射的默认约定之外,URL 映射可能有多复杂。但这是可能的,正如你所提到的,如果你想要这个,请确保对 jira 进行投票。
    【解决方案3】:

    使用@RequestMapping 注释您的登录方法,如下所示:

    @Controller
    public class GuestBookController {
      ...
      @RequestMapping(value="/mycontextroot/login", method = RequestMethod.GET)
      public String login() {
        ...
      }
      ...
    }
    

    然后,在您的 JSP 中,创建一个类似这样的链接:

    <c:url var="loginlink" value="/mycontextroot/login.html">
    </c:url>
    <a href="${loginlink}">Login</a>
    

    这假定您的调度程序 servlet 正在寻找 *.html URL。

    【讨论】:

    • 看我的 cmets 到 @Abdullah 的回复。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多