目录
上下文路径
假如Application Context = /(根路径)
假设此时 Application Context = /app。
浏览器访问必须加前缀
代码中处理路径的规则(核心:区分框架语法 / 原生标签)
静态资源访问的特殊场景(SSM 项目,区分「本地 Tomcat 部署」/「IDEA 开发启动」)
场景 1:部署到本地独立 Tomcat(SSM 项目)
场景 2:IDEA 中启动 SSM 项目(上下文路径 = app)
情况 1:未配置 DispatcherServlet,使用默认 Servlet
情况 2:配置 DispatcherServlet 的 url-pattern 为 /(覆盖默认 Servlet),未处理静态资源
情况 3:配置 DispatcherServlet 的 url-pattern 为 /,且处理静态资源(springmvc.xml 配置)
上下文路径
Application Context 设置 | 浏览器访问示例 | 代码中路径处理方式 |
/app | http://IP:端口/app/login | 普通项目手动拼接 /app;框架项目仅对框架语法自动加 /app,原生 HTML 标签需手动加 |
/ (根路径) | http://IP:端口/login | 无需加前缀,直接写路径即可(所有请求路径直接映射到服务器根路径) |
假如Application Context = /(根路径)
- 浏览器访问:http://IP: 端口 /index.jsp、http://IP: 端口 /login;
- 代码中写路径:JSP 中可省略 ${pageContext.request.contextPath},框架语法(如 Thymeleaf@{/xxx})也会自动匹配根路径,原生 HTML 标签(/)直接写/xxx即可。
假设此时 Application Context = /app。
浏览器访问必须加前缀
- 访问首页:http://IP:端口/app/index.jsp(而非 http://IP:端口/index.jsp);
- 访问 Servlet/Controller:http://IP:端口/app/login(而非 http://IP:端口/login);
- 访问静态资源:http://IP:端口/app/css/style.css(而非 http://IP:端口/css/style.css)。
代码中处理路径的规则(核心:区分框架语法 / 原生标签)
<!-- 错误:路径缺失 /app 前缀,会访问 http://IP:端口/login --> <a href="/login">登录</a> <!-- 正确:用 ${pageContext.request.contextPath} 自动获取 /app,最终路径是 /app/login --> <a href="${pageContext.request.contextPath}/login">登录</a>Servlet 中重定向 / 转发:
// 错误:重定向到 http://IP:端口/success,缺失 /app response.sendRedirect("/success"); // 正确:用 request.getContextPath() 获取 /app,最终重定向到 /app/success response.sendRedirect(request.getContextPath() + "/success");(2)SSM 项目(有框架):框架语法自动拼接,原生标签需手动拼接
1.Controller 中 @RequestMapping:
写 @RequestMapping("/login"),框架自动拼接上下文路径,最终匹配 URL:http://IP: 端口 /app/login;
2.前端框架标签(如 Thymeleaf):
<!-- Thymeleaf 自动加/app前缀,最终路径是/app/user/list --> <a th:href="@{/user/list}">用户列表</a>3.前端原生标签(<link>/<script>/<img>/ 普通<a>):
框架无法自动拼接,必须手动添加上下文路径,否则 404:
<!-- 错误:浏览器解析为 http://IP:端口/css/portal/reset.css,缺失/app --> <link rel="stylesheet" href="/css/portal/reset.css"> <!-- 正确:拼接/app,最终请求 http://IP:端口/app/css/portal/reset.css --> <link rel="stylesheet" href="${pageContext.request.contextPath}/css/portal/reset.css">静态资源访问的特殊场景(SSM 项目,区分「本地 Tomcat 部署」/「IDEA 开发启动」)
场景 1:部署到本地独立 Tomcat(SSM 项目)
- → 浏览器请求 http://localhost:端口/css/portal/reset.css(缺失 /app);
- → 浏览器请求 http://localhost:端口/app/css/portal/reset.css。
场景 2:IDEA 中启动 SSM 项目(上下文路径 = app)
情况 1:未配置 DispatcherServlet,使用默认 Servlet
情况 2:配置 DispatcherServlet 的 url-pattern 为 /(覆盖默认 Servlet),未处理静态资源
情况 3:配置 DispatcherServlet 的 url-pattern 为 /,且处理静态资源(springmvc.xml 配置)
<!-- 方式一:指定静态资源位置(location的/对应webapp根目录) --> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/images/**" location="/images/" /> <!-- 方式二:放行静态资源请求给Tomcat默认Servlet --> <mvc:default-servlet-handler />方式一:SpringMVC 直接处理/app/css/xxx.css请求,去 webapp/css 目录找文件并返回;
方式二:DispatcherServlet 无法处理的静态资源请求(如/app/css/xxx.css),转发给默认 Servlet 处理;
注意:即使配置了静态资源处理,原生标签路径仍需手动拼接上下文路径(否则请求路径是/css/xxx.css,而非/app/css/xxx.css)。