1

我有一个 spring mvc 应用程序,在一个页面中,我在一个表中列出了从数据库中获取的“组”详细信息。每个组的 url 设置为“/viewgroup/410”,其中 410 是组 ID,将从数据库中加载并显示在 viewgroup.jsp 页面中。

<td><a href="viewgroup/${group.groupid}">${group.name}</a></td>

所以,控制器方法有

@RequestMapping("/viewgroup/{groupid}") 
public String viewGroup() {
    ...
}

像这样。jsp页面无法加载我在目录结构中的静态资源

+webapp
  +resources
     +css
     +js
     +images
  +views
    +login.jsp

jsp 页面的 image/js/css 路径如下。

<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">

我尝试添加

@Controller
@RequestMapping("/viewgroup/**")
public class ViewGroupController {
   ...
}

这在jsp中

<link href="viewgroup/resources/css/bootstrap.css" rel="stylesheet" media="screen">

仍然jsp页面加载无法加载静态资源。url中传递params时,jsp页面中静态资源的资源路径如何提供?

4

1 回答 1

1

您通过项目的任何 URL 传递查询参数这一事实不会影响它处理静态资源的方式。您只需要包含指向您的静态资源的链接(例如作为相对路径),如下所示:

<link href="/resources/css/bootstrap.css" rel="stylesheet" media="screen">

此类静态资源的分辨率完全独立于您当前正在查看的页面,无论是它/viewgroup/410还是/foo/bar. 这就是为什么在链接的 href 开头不需要“viewgroup”的原因。

但是你确实需要告诉 Spring MVC 它应该如何处理这些静态资源。通常,这是在 Spring 配置中完成的。例如,如果您通过WebMvcConfigurer实例使用 Spring MVC java config,您应该以这种方式覆盖addResourceHandlers方法:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }


编辑:我的错,我认为 Spring MVC + 任何视图技术(JSP、Thymeleaf 等)会自动根据网络应用程序的根路径解析链接的 href 但这显然不适用于原始 HTML,其中相对链接的 href 已解决反对当前路径。因此,最后,正如 OP 所发现的,如果使用正在使用的视图技术处理链接,则仅针对根路径解析链接(在使用 JSP 的示例中<c:url value="/resources/css/bootstrap.css"/>:)

于 2014-08-18T10:46:05.313 回答