jsp文件必须放在webcontent或src/main/webapp目录下且后缀为.jsp(大小写敏感),路径、后缀、dynamic web module版本须与容器兼容,否则导致404、源码下载或el不解析等问题。

手动创建 .jsp 文件时路径和后缀必须严格匹配
IDE 不会自动校验 JSP 文件是否放在正确的 Web 资源目录下,放错位置会导致 404 或直接下载源码。Eclipse 默认 Web 项目结构里,WebContent(或 src/main/webapp,取决于项目类型)才是 JSP 的合法根目录。
- 不能把
.jsp文件丢进src、Java Resources或任意新建的普通文件夹里 - 文件名必须以
.jsp结尾,大小写敏感;index.JSP在 Tomcat 下通常不被识别 - 如果项目是 Maven 结构,确保
webapp目录被标记为Deployment Assembly中的 Web root(右键项目 → Properties → Deployment Assembly → 检查是否有src/main/webapp映射到/)
用 New → JSP File 向导生成时需注意动态 Web 模块版本
向导能自动补全基本模板,但生成失败或内容异常,大概率是 Dynamic Web Module 版本与目标容器不兼容。比如选了 4.0 却部署到 Tomcat 8.x(只支持到 3.1),JSP 中的 EL 表达式(如 ${param.name})可能被原样输出而非解析。
- 新建前先确认:右键项目 → Properties → Project Facets → 检查
Dynamic Web Module版本是否 ≤ 目标服务器支持的最高版本 - 向导默认用 JSP 2.3 模板,若项目 Facet 是 3.0+,建议勾选 “Use JSP template” 并手动删掉顶部冗余的
—— 新版已默认开启 EL - 向导生成的
结构不含DOCTYPE,浏览器可能触发 Quirks Mode,建议手动加上
启动时报错 org.apache.jasper.JasperException: /xxx.jsp (line X, column Y) 通常是编码或隐式对象问题
这个错误不是语法报错,而是 JSP 编译阶段失败。常见诱因不是 Java 代码写错,而是页面编码声明缺失、中文字符未转义、或误用了已被移除的隐式对象(如 applicationScope 在老模板里被硬编码)。
- 确保文件保存为 UTF-8(右键文件 → Properties → Resource → Text file encoding → Other → UTF-8)
- 在
指令中显式声明: - 避免直接写
out.print(request.getParameter("q"))—— 未判空会抛NullPointerException;改用${param.q}更安全 - 检查是否有残留的
<usebean id="..." class="..." scope="application"></usebean>,Tomcat 9+ 默认禁用applicationscope 的 Bean 创建
修改 JSP 后刷新没变化?别急着重启服务器
Eclipse + Tomcat 组合下,JSP 修改不生效,多数情况不是缓存问题,而是热更新机制被禁用或类加载器没重载。
- 确认 Servers 视图中 Tomcat 的 Publishing 设置:双击服务器 → Overview → 右侧 “Publishing” → 勾选 “Automatically publish when resources change”
- 关闭 “Build automatically” 会导致 JSP 修改后不触发编译,Jasper 无法生成对应 servlet 类 —— 必须保持开启
- 如果用了 JRebel 或 Spring DevTools,它们会干扰 JSP 热更新,临时禁用再试
- 最简单的验证方式:删掉
work/Catalina/localhost/[your-app]/org/apache/jsp/下对应 JSP 的 .java 和 .class 文件,再刷新页面,看是否重建










