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 中使用&lt;a href="&lt;spring:url value="/admin/listPeople"/&gt;"&gt;People&lt;/a&gt; 【参考方案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 容器根本不会将其发送到您的应用程序。 当。 适用于链接,但仍然没有我想要的那么好。我想要一种自动将其应用于整个应用程序的方法。我知道这是有可能的(我的旧工作做到了)。我们直接使用“/admin/listPeople”之类的东西。有时只是“listPeople”。【参考方案2】:

c:url 标记会将上下文路径附加到您的 URL。例如:

<c:url value="/admin/listPeople"/>

另外,我也更喜欢在我的 Spring MVC 应用程序中尽可能多地使用相对 URL。因此,如果页面位于/MyApp/index,链接&lt;a href="admin/listPeople"&gt; 将带我到listPeople 页面。

如果您在 URL 层次结构中更深,这也适用。您可以使用.. 向上遍历一个级别。所以在/MyApp/admin/people/aPerson的页面上,使用&lt;a href="../listPeople"&gt;会喜欢回到列表页面

【讨论】:

【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

Spring Mvc总结

在 Spring MVC 中获取根/基 URL

Spring mvc @PathVariable

请问,java高手,spring mvc拦截器如何拦截所有的请求啊,包括html和jsp页面?

无法使用 Spring Boot 和 MVC 找到/渲染 JSP 文件

请问:为啥配置Spring MVC的DispatcherServlet的url-pattern为/能访问JSP,而不能访问JS、CSS文件?