如何在 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 的站点(注解控制器)上的状态消息