news 2026/9/2 18:55:46

Javaweb项目的上下文路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Javaweb项目的上下文路径

目录

上下文路径

假如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 配置)


上下文路径

Deployment 中的 Application Context(应用上下文)就是 Tomcat 中项目的 “上下文路径”,它直接决定了浏览器访问项目、代码中处理路径时必须带的 “前缀”。
Application Context 设置
浏览器访问示例
代码中路径处理方式
/app
http://IP:端口/app/login
普通项目手动拼接 /app;框架项目仅对框架语法自动加 /app,原生 HTML 标签需手动加
/
(根路径)
http://IP:端口/login
无需加前缀,直接写路径即可(所有请求路径直接映射到服务器根路径)

假如Application Context = /(根路径)

如果将 Application Context 设为 /(根路径),此时上下文路径为空,访问时就不需要加任何前缀:
  • 浏览器访问:http://IP: 端口 /index.jsp、http://IP: 端口 /login;
  • 代码中写路径:JSP 中可省略 ${pageContext.request.contextPath},框架语法(如 Thymeleaf@{/xxx})也会自动匹配根路径,原生 HTML 标签(/)直接写/xxx即可。

假设此时 Application Context = /app。

  • 浏览器访问必须加前缀

浏览器访问项目的所有资源(页面、接口、静态文件),URL 中必须包含 /app 这个上下文路径,否则 Tomcat 找不到对应的项目:
    • 访问首页: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)。
  • 代码中处理路径的规则(核心:区分框架语法 / 原生标签)

框架仅对「框架语法生成的路径」自动拼接上下文路径,原生 HTML 标签的路径由浏览器解析,框架无法自动处理。
(1)普通 Servlet 项目(无框架):需手动加前缀
因为原生 Servlet 没有自动处理上下文路径的能力,必须手动拼接 contextPath(即 /app):
JSP 中写超链接 / 表单:
<!-- 错误:路径缺失 /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 项目)

无论是否配置 DispatcherServlet,只要上下文路径≠/,原生标签路径必须手动拼接上下文路径,否则 404:
错误请求:
  • → 浏览器请求 http://localhost:端口/css/portal/reset.css(缺失 /app);
正确请求:
  • → 浏览器请求 http://localhost:端口/app/css/portal/reset.css。

场景 2:IDEA 中启动 SSM 项目(上下文路径 = app)

分 3 种情况(核心:DispatcherServlet 是否拦截静态资源 + 是否配置静态资源处理):
  • 情况 1:未配置 DispatcherServlet,使用默认 Servlet
现象:不改代码(路径写/css/xxx.css)依然 404;
原因:IDEA 开发模式下,上下文路径 = app 时,默认 Servlet 的映射路径是/app/*,仅处理 http://localhost:端口/app/css/xxx.css,无法处理 http://localhost:端口/css/xxx.css;
例外:若 IDEA 中上下文路径配置为 /,则默认 Servlet 映射到服务器根路径,/css/xxx.css可正常访问(这是上下文路径的作用,非 IDEA 特殊映射)。
  • 情况 2:配置 DispatcherServlet 的 url-pattern 为 /(覆盖默认 Servlet),未处理静态资源
现象:静态资源请求 404;
原因:DispatcherServlet 拦截所有请求(包括静态资源),但它仅处理@RequestMapping映射的 Controller 方法,找不到对应方法则返回 404;
示例:请求/app/css/base.css时,DispatcherServlet 会找@RequestMapping("/css/base.css")的 Controller 方法,无匹配则 404。
  • 情况 3:配置 DispatcherServlet 的 url-pattern 为 /,且处理静态资源(springmvc.xml 配置)
需在 springmvc.xml 中添加静态资源配置,让 SpringMVC 处理静态资源请求:
<!-- 方式一:指定静态资源位置(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)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 9:36:28

2026大专建筑工程必看!这些证书让你找工作不踩雷!

各位建工专业的同学们&#xff0c;2026年的建筑行业正在经历深刻转型。“大干快上”的时代过去了&#xff0c;现在是拼技术、拼管理、拼合规的时代。作为大专生&#xff0c;我们学历上不占优&#xff0c;但恰恰可以通过实操技能和专业证书&#xff0c;在施工现场打出一片天。今…

作者头像 李华
网站建设 2026/9/2 15:16:37

《UGC工具的能力梯度解锁指南》

很多产品陷入“功能越多越强大”的误区,却忽略了用户在碎片化场景下的核心诉求—当一位博主在通勤途中想用手机编辑图文时,过多的排版选项会成为认知负担,而过于简化的功能又无法满足专业表达需求。这就需要建立“感知负荷拆解模型”,将复杂功能拆解为“基础必选”“进阶可…

作者头像 李华
网站建设 2026/9/1 6:21:33

【算法题】滑动窗口(一)

滑动窗口是处理子串/子数组问题的经典双指针技巧&#xff0c;核心是通过维护一个“窗口”&#xff08;左右指针界定的区间&#xff09;&#xff0c;动态调整窗口范围来满足题目条件&#xff0c;从而高效求解问题。 一、无重复字符的最长子串 题目描述&#xff1a; 给定一个字符…

作者头像 李华
网站建设 2026/9/2 2:35:31

Office Tool Plus v10.29.50 office安装激活一条龙

&#x1f51e;简介:Office Tool Plus是一款相当牛逼的office安装工具&#xff0c;并且安装完了顺带激活&#xff0c;也可以很快捷的卸载office清除激活信息等等。下载最新的office2016免去那么多的麻烦&#xff0c;反方便~【下载地址】&#xff1a;链接&#xff1a;https://dri…

作者头像 李华
网站建设 2026/8/31 2:28:04

锁、互斥、阻塞、自旋、CAS、可见性

今天的目标是&#xff1a;从 OS 视角理解“为什么必须有锁”、“为什么会出现竞态”、“锁为什么能解决”、“CAS 的本质是什么”。这一层是并发编程最容易混乱的地方&#xff0c;因为它跨越&#xff1a;OS 调度&#xff08;Day3&#xff09;CPU 缓存一致性&#xff08;你之前学…

作者头像 李华
网站建设 2026/9/2 13:18:41

Pr 如何批量修改字幕?字体、大小统一调整的方法来了!

在剪辑圈里&#xff0c;统一字幕样式一直是让人头疼的环节。 很多专业剪辑师都吐槽&#xff1a;明明只是几十条字幕&#xff0c;结果改字体、调字号、调描边、调位置……每一个都得点开单独修改。遇到访谈类、讲解类视频&#xff0c;字幕数量动不动上百条&#xff0c;效率直接被…

作者头像 李华