JSP 中的 Spring MVC 请求 URL
Posted
技术标签:
【中文标题】JSP 中的 Spring MVC 请求 URL【英文标题】:Spring MVC Request URLs in JSP 【发布时间】:2011-10-21 15:46:34 【问题描述】:我正在使用 Spring MVC 编写一个 Web 应用程序。我正在为控制器等使用注释。一切工作正常,除了应用程序中的实际链接(表单操作、<a>
标签等)当前,我有这个(显然是缩写的):
//In the controller
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET)
//In the JSP
<a href="/admin/listPeople">Go to People List</a>
当我直接输入“http://localhost:8080/MyApp/admin/listPeople”之类的 URL 时,页面加载正确。但是,上面的链接不起作用。它丢失了应用程序名称“MyApp”。
有谁知道是否有办法配置 Spring 以将应用程序名称扔在那里?
如果您需要查看我的任何 Spring 配置,请告诉我。我正在使用带有视图解析器等的标准调度程序 servlet。
【问题讨论】:
这可以在 spring 3.0 中使用<a href="<spring:url value="/admin/listPeople"/>">People</a>
【参考方案1】:
您需要在链接前添加上下文路径。
// somewhere on the top of your JSP
<c:set var="contextPath" value="$pageContext.request.contextPath"/>
...
<a href="$contextPath/admin/listPeople">Go to People List</a>
【讨论】:
+1 谢谢,我想到了这个,但我宁愿以某种方式使用 Spring。 没有“春天”的方式来做到这一点:) 唯一可以让您免于将 $contextPath 附加到您的链接的选项是将您的应用程序部署为根,因此它的上下文路径是“ /"(正如凯文所描述的);但我不推荐这种方法,因为它会使您的应用程序依赖于其部署。 我正在研究过滤器是否有助于实现这一目标。比如,使用 RequestDispatcher。 我不这么认为。您的过滤器驻留在您的应用程序中,它们只能处理发送到您的应用程序的那些请求。如果请求没有正确的上下文路径(在您的情况下为 MyApp),则 servlet 容器根本不会将其发送到您的应用程序。 当。c:url
标记会将上下文路径附加到您的 URL。例如:
<c:url value="/admin/listPeople"/>
另外,我也更喜欢在我的 Spring MVC 应用程序中尽可能多地使用相对 URL。因此,如果页面位于/MyApp/index
,链接<a href="admin/listPeople">
将带我到listPeople
页面。
如果您在 URL 层次结构中更深,这也适用。您可以使用..
向上遍历一个级别。所以在/MyApp/admin/people/aPerson
的页面上,使用<a href="../listPeople">
会喜欢回到列表页面
【讨论】:
【参考方案3】:我更喜欢使用 BASE 标签:
<base href="$pageContext.request.scheme://$pageContext.request.serverName:$pageContext.request.serverPort$pageContext.request.contextPath/" />
那么,你所有的链接都可以是这样的:
<a href="admin/listPeople">Go to People List</a>
【讨论】:
我建议在使用基本标签之前阅读此内容:***.com/questions/1889076/…【参考方案4】:因为我刚刚试图找到这个问题的答案,这是第一个谷歌结果。
现在可以使用 MvcUriComponentsBuilder 完成此操作
这是 Spring MVC 4.0 版本的一部分
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html
需要的方法是fromMappingName
来自文档:
从 Spring MVC 控制器方法的请求映射的名称创建一个 URL。 配置的 HandlerMethodMappingNamingStrategy 在启动时确定控制器方法请求映射的名称。默认情况下,所有映射都根据类名的大写字母分配一个名称,后跟“#”作为分隔符,然后是方法名称。例如,“PC#getPerson”用于名为 PersonController 的类,其方法为 getPerson。如果命名约定不产生唯一的结果,则可以通过@RequestMapping 注解的名称属性分配显式名称。
这主要用于视图渲染技术和 EL 表达式。 Spring URL 标签库将此方法注册为一个名为“mvcUrl”的函数。
例如,给定这个控制器:
@RequestMapping("/people")
class PersonController
@RequestMapping("/id")
public HttpEntity getPerson(@PathVariable String id) ...
JSP 可以为控制器方法准备一个 URL,如下所示:
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<a href="$s:mvcUrl('PC#getPerson').arg(0,"123").build()">Get Person</a>
【讨论】:
【参考方案5】:我通常将tomcat配置为使用“/”的上下文根或将war部署为ROOT.war。无论哪种方式,战争名称都不会成为 URL 的一部分。
【讨论】:
【参考方案6】:您可以使用 servletRelativeAction。我不确定它在哪些版本中可用(我目前使用的是 4.0.x)并且我没有看到太多关于此的文档,但是如果您查看支持 spring 表单的代码,您可能会猜到。只需确保您传递的路径以“/”开头。
例子:
<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check" method="POST">
参见 org.springframework.web.servlet.tags.form.FormTag:
protected String resolveAction() throws JspException
String action = getAction();
String servletRelativeAction = getServletRelativeAction();
if (StringUtils.hasText(action))
action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action));
return processAction(action);
else if (StringUtils.hasText(servletRelativeAction))
String pathToServlet = getRequestContext().getPathToServlet();
if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath()))
servletRelativeAction = pathToServlet + servletRelativeAction;
servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction));
return processAction(servletRelativeAction);
else
String requestUri = getRequestContext().getRequestUri();
ServletResponse response = this.pageContext.getResponse();
if (response instanceof HttpServletResponse)
requestUri = ((HttpServletResponse) response).encodeURL(requestUri);
String queryString = getRequestContext().getQueryString();
if (StringUtils.hasText(queryString))
requestUri += "?" + HtmlUtils.htmlEscape(queryString);
if (StringUtils.hasText(requestUri))
return processAction(requestUri);
else
throw new IllegalArgumentException("Attribute 'action' is required. " +
"Attempted to resolve against current request URI but request URI was null.");
【讨论】:
【参考方案7】:因为已经有好几年了,我想我会为其他正在寻找这个的人筹钱。例如,如果您正在使用注释并且有这样的控制器操作:
@RequestMapping("/new") //<--- relative url
public ModelAndView newConsultant()
ModelAndView mv = new ModelAndView("new_consultant");
try
List<Consultant> list = ConsultantDAO.getConsultants();
mv.addObject("consultants", list);
catch (Exception e)
e.printStackTrace();
return mv;
在您的 .jsp(视图)中添加此指令
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
简单地使用
<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="$url">New consultant</a>
在哪里
value
的值应与控制器操作中@RequestMapping
的参数匹配,并且
var's
值是您用于href
的变量的名称
嗨
【讨论】:
以上是关于JSP 中的 Spring MVC 请求 URL的主要内容,如果未能解决你的问题,请参考以下文章
请问,java高手,spring mvc拦截器如何拦截所有的请求啊,包括html和jsp页面?
无法使用 Spring Boot 和 MVC 找到/渲染 JSP 文件
请问:为啥配置Spring MVC的DispatcherServlet的url-pattern为/能访问JSP,而不能访问JS、CSS文件?