TL;DR:我正在编写一个简单的 Tomcat/Spring/Freemarker webapp,似乎很难让 Spring 的 DispatcherServlet 遵守<mvc:resources...>
配置。
请注意:AFAICT 这不是其他问题的重复,因为我已经尝试过其他答案中给出的解决方案。如果有人发现现有问题并且该问题提供了我错过的解决方案,我很乐意将 VTC 作为 dup (或如果需要删除此问题)。
我有一个非常简单的基于 Freemarker 的 webapp。那部分工作正常。我有一个请求处理程序方法来处理所有请求(@RequestMapping("/**")
)但希望/${contextPath}/static/...
使用该<mvc:resources.../>
工具提供静态资源。这些资源位于顶级 webapp 目录的子目录中。
根据阅读其他关于 SO 的问题,我添加了
<mvc:resources mapping="/static/**" location="/" />
到我的 Spring 配置。
无论我做什么,我希望被解析为静态资源文件的请求都会被发送到我的控制器的请求处理程序方法。我唯一能想到的是@RequestMapping
注释优先于mvc:resources
,但这并没有多大意义。
我已验证资源 URL 生成正确,即模板行
<link rel="stylesheet" href="${contextPath}/static/css/gallery.css">
生成
<link rel="stylesheet" href="/gallery/static/css/gallery.css">
并且请求正在被Tomcat服务器接收,只是路由到了错误的地方。
我已经阅读了关于这个主题的大多数关于 SO 的问题,并且我相信我做对了(例如,参见Trying to get mvc resources to serve my static resources),但显然我遗漏了一些明显的东西。
环境
- 日食月神
- 爪哇 8
- 雄猫 8
- 自由标记 2.3.23
- 春天 4.2.0
- 视窗 7 SP1
部署布局
标准 Java EE Tomcat 目录结构
webapps
|- gallery
|- css
|- images
|- js
|- META-INF
|- WEB-INF
|- classes
|- lib
|- views
Tomcat 上下文定义
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\dev\tools\apache-tomcat-8.0.24\wtpwebapps\gallery"
path="/gallery" reloadable="true"
source="org.eclipse.jst.j2ee.server:gallery"/>
Spring Servlet 配置
WEB-INF/main-servlet.xml
...
<mvc:resources mapping="/static/**" location="/" />
<mvc:annotation-driven/>
<context:component-scan base-package="com.mysite.gallery"/>
...
我已经尝试了这些语句的所有可能排序,但这似乎没有效果。我也尝试添加
<mvc:default-servlet-handler/>
没有效果。
WEB-INF/web.xml
标准 Spring MVC DispatcherServlet 配置
...
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
...
请求映射方法
...
@RequestMapping("/**")
public String gallery(ModelMap modelMap, HttpServletRequest req, HttpServletResponse resp)
{
etc...
自由标记模板
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="${contextPath}/static/css/photoswipe.css">
<link rel="stylesheet" href="${contextPath}/static/css/default-skin/default-skin.css">
<link rel="stylesheet" href="${contextPath}/static/css/gallery.css">
<script src="${contextPath}/static/js/photoswipe.min.js"></script>
<script src="${contextPath}/static/js/photoswipe-ui-default.min.js"></script>
</head>
<body>
<div>
...