如何在 Spring MVC 中基于控制器和操作方法创建 URL?

Posted

技术标签:

【中文标题】如何在 Spring MVC 中基于控制器和操作方法创建 URL?【英文标题】:How can I create a URL based on controller and action method in Spring MVC? 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢 jira 链接。刚刚投票给jira.springsource.org/browse/SPR-5779 第 4 版已包含此功能。请查看this one。但我没有找到足够的指导如何使用它。尝试过但没有成功。【参考方案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 将允许您以我希望的代理方式和其他各种方式来完成它。

【讨论】:

以上是关于如何在 Spring MVC 中基于控制器和操作方法创建 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring MVC 中存储会话

基于 Spring MVC 的站点(注解控制器)上的状态消息

Spring mvc 实现jsonp和json数据类型

请教在Spring MVC中,如何实现启动时从数据库读取信息

如何使用实体框架或 MVC 项目绑定 HTML 选择元素?

Spring MVC学习—基于注解的Controller控制器的配置全解一万字