22

我正在使用 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。

4

7 回答 7

50

您需要为链接添加上下文路径。

// 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>
于 2011-08-07T01:28:58.613 回答
14

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">会喜欢回到列表页面

于 2011-08-14T05:17:24.920 回答
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>
于 2011-08-08T11:39:39.290 回答
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 注释的 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>
于 2016-07-19T15:28:10.807 回答
0

我通常将tomcat配置为使用“/”的上下文根或将war部署为ROOT.war。无论哪种方式,战争名称都不会成为 URL 的一部分。

于 2011-08-07T01:30:36.863 回答
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.");
        }
    }
}
于 2014-02-01T02:02:05.717 回答
-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'svalue 是您使用的变量的名称href

HIH

于 2018-09-24T05:38:47.987 回答