我正在使用Spring MVC编写Web应用程序。我正在使用控制器的注释等。一切都工作正常,除了它涉及应用程序中的实际链接(表单操作,<a>
标签等)。当前,我有这个(显然缩写):< / p>
//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”这样的网址时,页面会正确加载。但是,上面的链接不起作用。它丢失了应用程序名称“MyApp”。
有没有人知道是否有办法配置Spring在那里抛出应用程序名称?
如果您需要查看我的任何Spring配置,请告诉我。我正在使用带有视图解析器等的标准调度程序servlet
答案 0 :(得分:45)
您需要在链接前添加上下文路径。
// 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 :(得分:13)
c:url
标记会将上下文路径附加到您的网址。例如:
<c:url value="/admin/listPeople"/>
或者,我更喜欢在我的Spring MVC应用程序中尽可能多地使用相对URL。因此,如果页面位于/MyApp/index
,则链接<a href="admin/listPeople">
会将我带到listPeople
页面。
如果您更深入了解URL层次结构,这也适用。您可以使用..
遍历某个级别。因此,在/MyApp/admin/people/aPerson
的页面上,使用<a href="../listPeople">
将返回列表页面
答案 2 :(得分:6)
我更喜欢使用BASE标签:
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />
然后,您的所有链接都可以是:
<a href="admin/listPeople">Go to People List</a>
答案 3 :(得分:4)
我刚刚试图找到这个问题的答案,这是谷歌的第一个结果。
现在可以使用MvcUriComponentsBuilder
来完成这是Spring MVC 4.0版本的一部分
所需的方法是fromMappingName
来自文档:
从Spring MVC控制器方法的请求映射名称创建URL。 配置的HandlerMethodMappingNamingStrategy确定启动时控制器方法请求映射的名称。默认情况下,所有映射都根据类名的大写字母分配名称,后跟“#”作为分隔符,然后是方法名称。例如,对于名为PersonController的类,使用方法getPerson的“PC#getPerson”。如果命名约定不产生唯一结果,则可以通过@RequestMapping注释的name属性指定显式名称。
这主要用于视图渲染技术和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>
答案 4 :(得分:0)
我通常将tomcat配置为使用“/”的上下文根或将war作为ROOT.war部署。无论哪种方式,战争名称都不会成为URL的一部分。
答案 5 :(得分:0)
您可以使用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.");
}
}
}
答案 6 :(得分:-1)
因为已经有好几年了,我认为我会加入其他人来寻找这个。如果您使用的是注释,并且具有类似这样的控制器操作,则:
@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
的变量的名称
HIH