Tomcat部署JSP文件完整指南:手动部署+IDEA工程化实现 附404访问错误全排查


🌸你好呀!我是断弦承露
🌟感谢陪伴~ 小白博主在线求友
🌿 跟着小白学/Java/软件设计/鸿蒙开发/芯片开发
📖专栏汇总:
《软件设计师》专栏 | 《Java》专栏 | 《 RISC-V 处理器实战》专栏 | 《Flutter鸿蒙实战》专栏 | 《React Native开发》专栏 ------|CSDN|------

文章目录

Tomcat部署JSP文件完整指南:手动部署+IDEA工程化实现 附404访问错误全排查 📝

文章摘要:JSP是Java Web开发的入门核心技术,必须部署到Servlet容器中才能运行。本文基于Tomcat 9.0.121稳定版本,讲解两种主流部署方式:单文件快速手动部署、IntelliJ IDEA工程化部署,附带可直接运行的字母遍历示例代码,并针对新手最高发的「URL错误/404找不到」问题做全场景排查,所有步骤均可直接复现。

🧠 全文知识架构图

#mermaid-svg-BES4inu76EOyngh4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BES4inu76EOyngh4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BES4inu76EOyngh4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BES4inu76EOyngh4 .error-icon{fill:#552222;}#mermaid-svg-BES4inu76EOyngh4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BES4inu76EOyngh4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BES4inu76EOyngh4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BES4inu76EOyngh4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BES4inu76EOyngh4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BES4inu76EOyngh4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BES4inu76EOyngh4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BES4inu76EOyngh4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BES4inu76EOyngh4 .marker.cross{stroke:#333333;}#mermaid-svg-BES4inu76EOyngh4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BES4inu76EOyngh4 p{margin:0;}#mermaid-svg-BES4inu76EOyngh4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BES4inu76EOyngh4 .cluster-label text{fill:#333;}#mermaid-svg-BES4inu76EOyngh4 .cluster-label span{color:#333;}#mermaid-svg-BES4inu76EOyngh4 .cluster-label span p{background-color:transparent;}#mermaid-svg-BES4inu76EOyngh4 .label text,#mermaid-svg-BES4inu76EOyngh4 span{fill:#333;color:#333;}#mermaid-svg-BES4inu76EOyngh4 .node rect,#mermaid-svg-BES4inu76EOyngh4 .node circle,#mermaid-svg-BES4inu76EOyngh4 .node ellipse,#mermaid-svg-BES4inu76EOyngh4 .node polygon,#mermaid-svg-BES4inu76EOyngh4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BES4inu76EOyngh4 .rough-node .label text,#mermaid-svg-BES4inu76EOyngh4 .node .label text,#mermaid-svg-BES4inu76EOyngh4 .image-shape .label,#mermaid-svg-BES4inu76EOyngh4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-BES4inu76EOyngh4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BES4inu76EOyngh4 .rough-node .label,#mermaid-svg-BES4inu76EOyngh4 .node .label,#mermaid-svg-BES4inu76EOyngh4 .image-shape .label,#mermaid-svg-BES4inu76EOyngh4 .icon-shape .label{text-align:center;}#mermaid-svg-BES4inu76EOyngh4 .node.clickable{cursor:pointer;}#mermaid-svg-BES4inu76EOyngh4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BES4inu76EOyngh4 .arrowheadPath{fill:#333333;}#mermaid-svg-BES4inu76EOyngh4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BES4inu76EOyngh4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BES4inu76EOyngh4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BES4inu76EOyngh4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BES4inu76EOyngh4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BES4inu76EOyngh4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BES4inu76EOyngh4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BES4inu76EOyngh4 .cluster text{fill:#333;}#mermaid-svg-BES4inu76EOyngh4 .cluster span{color:#333;}#mermaid-svg-BES4inu76EOyngh4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BES4inu76EOyngh4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BES4inu76EOyngh4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-BES4inu76EOyngh4 .icon-shape,#mermaid-svg-BES4inu76EOyngh4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BES4inu76EOyngh4 .icon-shape p,#mermaid-svg-BES4inu76EOyngh4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BES4inu76EOyngh4 .icon-shape .label rect,#mermaid-svg-BES4inu76EOyngh4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BES4inu76EOyngh4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BES4inu76EOyngh4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BES4inu76EOyngh4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JSP部署指南
基础运行原理
JSP技术定位
Jasper引擎执行流程
手动部署方式
创建JSP源文件
规范保存文件
放入webapps目录
浏览器访问验证
IDEA工程化部署
创建Java Web项目
编写JSP代码
配置Tomcat服务器
启动运行验证
404错误专项排查
文件后缀隐藏问题
部署路径匹配问题
服务与端口问题
上下文路径问题
跨平台大小写问题
常见问题FAQ
进阶拓展写法

📚 一、基础运行原理

JSP(Java Server Pages,Java服务端页面)是嵌入Java代码的动态网页技术,不能直接用浏览器打开本地文件运行,必须部署到实现了Servlet规范的Web容器中。

Tomcat 9 内置 Jasper 2.3 引擎,对应实现JSP 2.3规范,负责解析JSP文件。完整执行流程分为两步:

  1. 转译阶段:首次访问时,Jasper将JSP源码转换为标准的Java Servlet源文件(.java);
  2. 编译阶段:调用Java编译器将.java源文件编译为字节码文件(.class)。

最终由Servlet执行页面逻辑,输出标准HTML页面返回给浏览器。这也是第一次访问JSP页面响应稍慢,后续访问速度明显提升的原因。

⚡ 二、方式一:手动部署到本地Tomcat

适合快速验证单文件效果,无需创建完整项目,直接复用已安装的Tomcat环境。

2.1 分步操作

步骤1:编写JSP代码

新建文本文件,写入如下示例代码。代码实现26个小写字母的遍历输出,附带逐行注释:

复制代码
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>小写字母遍历输出</title>
    <style>
        .letter-container {
            font-size: 18px;
            letter-spacing: 4px;
            margin-top: 12px;
        }
    </style>
</head>
<body>
    <h3>26个小写英文字母输出结果:</h3>
    <div class="letter-container">
    <%
        // currentChar:循环控制变量,存储当前遍历的字符
        // 采用小驼峰命名,语义清晰,符合Java编码规范
        char currentChar;
        // 利用小写字母ASCII码连续的特性,从字符'a'遍历到'z'
        // char类型底层为数值存储,支持直接自增运算
        for(currentChar = 'a'; currentChar <= 'z'; currentChar++){
            // out是JSP内置隐式对象,类型为JspWriter
            // 作用是向响应页面输出文本内容,无需开发者手动定义
            // &nbsp;是HTML空格实体,用于字符间视觉分隔,避免排版拥挤
            out.print(currentChar + "&nbsp;");
        }
    %>
    </div>
</body>
</html>

💡 代码说明:

  • 顶部page是JSP页面指令,用于声明页面属性:contentType指定浏览器解析的内容类型与编码,pageEncoding指定文件本身的存储编码,language指定脚本语言。
  • 示例为简化演示采用内联样式,工程实践中建议将CSS样式抽离到独立文件,实现结构与样式分离。
步骤2:规范保存文件

选择「文件 → 另存为」,按以下参数保存:

  • 文件名:letter.jsp
  • 编码:UTF-8
  • 保存类型:所有文件

⚠️ 新手第一大坑:Windows系统记事本默认保存编码为ANSI(即GBK),且默认隐藏已知文件类型的扩展名,直接保存会出现两个问题:

  1. 文件实际名为letter.jsp.txt,访问返回404;
  2. 文件编码为GBK,与pageEncoding=UTF-8冲突,页面中文乱码。

验证方法:打开文件资源管理器顶部「查看」选项卡,勾选「文件扩展名」,确认文件名后缀仅为.jsp;推荐使用VS Code、Notepad++等编辑器,避免记事本的编码坑。

步骤3:部署到Tomcat目录

将保存好的letter.jsp文件,放入Tomcat安装根目录下的webapps\ROOT文件夹中。

目录说明:ROOT是Tomcat的默认根应用目录,部署在此目录下的资源,访问路径无需加应用名前缀,直接通过文件名即可访问。

补充:也可以在webapps下新建自定义文件夹(如myapp),放入JSP文件,此时访问地址需要加上文件夹名作为上下文路径。单JSP文件可直接部署,完整Web应用还需要遵循标准目录结构,包含WEB-INF等目录。

步骤4:浏览器访问验证

确保Tomcat处于启动状态(控制台或logs/catalina.out中出现Server startup日志即为启动成功),打开浏览器访问地址:

http://localhost:8080/letter.jsp

页面正常显示26个连续小写字母,即为部署成功。

2.2 部署执行流程图

#mermaid-svg-KyaqaE3ed8uF0mLF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KyaqaE3ed8uF0mLF .error-icon{fill:#552222;}#mermaid-svg-KyaqaE3ed8uF0mLF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KyaqaE3ed8uF0mLF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KyaqaE3ed8uF0mLF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KyaqaE3ed8uF0mLF .marker.cross{stroke:#333333;}#mermaid-svg-KyaqaE3ed8uF0mLF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KyaqaE3ed8uF0mLF p{margin:0;}#mermaid-svg-KyaqaE3ed8uF0mLF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster-label text{fill:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster-label span{color:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster-label span p{background-color:transparent;}#mermaid-svg-KyaqaE3ed8uF0mLF .label text,#mermaid-svg-KyaqaE3ed8uF0mLF span{fill:#333;color:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF .node rect,#mermaid-svg-KyaqaE3ed8uF0mLF .node circle,#mermaid-svg-KyaqaE3ed8uF0mLF .node ellipse,#mermaid-svg-KyaqaE3ed8uF0mLF .node polygon,#mermaid-svg-KyaqaE3ed8uF0mLF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KyaqaE3ed8uF0mLF .rough-node .label text,#mermaid-svg-KyaqaE3ed8uF0mLF .node .label text,#mermaid-svg-KyaqaE3ed8uF0mLF .image-shape .label,#mermaid-svg-KyaqaE3ed8uF0mLF .icon-shape .label{text-anchor:middle;}#mermaid-svg-KyaqaE3ed8uF0mLF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KyaqaE3ed8uF0mLF .rough-node .label,#mermaid-svg-KyaqaE3ed8uF0mLF .node .label,#mermaid-svg-KyaqaE3ed8uF0mLF .image-shape .label,#mermaid-svg-KyaqaE3ed8uF0mLF .icon-shape .label{text-align:center;}#mermaid-svg-KyaqaE3ed8uF0mLF .node.clickable{cursor:pointer;}#mermaid-svg-KyaqaE3ed8uF0mLF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KyaqaE3ed8uF0mLF .arrowheadPath{fill:#333333;}#mermaid-svg-KyaqaE3ed8uF0mLF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KyaqaE3ed8uF0mLF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KyaqaE3ed8uF0mLF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KyaqaE3ed8uF0mLF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KyaqaE3ed8uF0mLF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KyaqaE3ed8uF0mLF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster text{fill:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF .cluster span{color:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KyaqaE3ed8uF0mLF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KyaqaE3ed8uF0mLF rect.text{fill:none;stroke-width:0;}#mermaid-svg-KyaqaE3ed8uF0mLF .icon-shape,#mermaid-svg-KyaqaE3ed8uF0mLF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KyaqaE3ed8uF0mLF .icon-shape p,#mermaid-svg-KyaqaE3ed8uF0mLF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KyaqaE3ed8uF0mLF .icon-shape .label rect,#mermaid-svg-KyaqaE3ed8uF0mLF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KyaqaE3ed8uF0mLF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KyaqaE3ed8uF0mLF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KyaqaE3ed8uF0mLF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 实际为jsp.txt
后缀正确
未成功
成功
是
否返回404
编写JSP代码
另存为jsp格式 UTF8编码
确认文件后缀正确
显示文件扩展名 重命名文件
放入webapps对应目录
启动Tomcat服务
确认服务启动成功
排查启动问题
浏览器访问对应URL
页面是否正常显示
部署完成
进入错误排查流程

🛠️ 三、方式二:IntelliJ IDEA工程化部署

适合正规项目开发,IDEA自动完成编译、部署、同步,是企业开发的标准方式。

3.1 分步操作

步骤1:创建Java Web项目

打开IDEA,新建项目,左侧选择「Java Enterprise」,右侧配置项:

新版本 IDEA 把原来的「Java Enterprise」正式改名为 Jakarta EE 了,入口就在左侧 Generators 分类下面。

下面按步骤走,

第一步:切换项目类型为 Jakarta EE

在左侧列表的 Generators 分组下,点击 Jakarta EE

说明:这就是旧版 IDEA 里的「Java Enterprise」,因为 Java EE 已经正式更名为 Jakarta EE,所以新版 IDEA 同步改了名字。

点击后右侧界面会自动切换成 Web 项目的配置项。

第二步:第一页基础配置

Name:给项目命名,比如 tomcat-jsp-demo

Location:项目存放路径,保持默认或自定义都可以

Build system:新手推荐选 Maven(行业通用,依赖管理更方便)

JDK:Tomcat 9 支持 Java 8 及以上全版本

下面的 Add sample code 建议取消勾选,自己写代码更清晰,也方便理解

第三步:选择 Web 模板 + 绑定 Tomcat 9

点击右下角的 Next 按钮,进入第二页配置:

在 Templates 列表里,勾选 Web Application

新版的在本页

点击 Application Server 下拉框,选择你本地安装的 Tomcat 9.0.121

如果下拉里没有,点旁边的「New」→「Tomcat Server」,选中你本地 Tomcat 的根目录即可

Servlet 版本选择 Servlet 4.0(和 Tomcat 9 实现的规范版本完全对应,兼容性最好)

第四步:创建项目

点击右下角的 Create,IDEA 会自动生成标准 Web 项目结构,并且自动配置好 Tomcat 运行配置。

步骤2:编写JSP文件

在项目的src/main/webapp目录上右键,新建「JSP/JSPX」文件,命名为letter.jsp,写入上述JSP代码并保存。

步骤3:确认运行配置

IDEA右上角会自动生成Tomcat运行配置,点击配置图标可检查:

  • 「服务器」标签:确认Tomcat安装路径、JDK路径正确
  • 「部署」标签:确认已添加当前项目的部署,记录应用上下文路径(IDEA默认值为项目名)

概念说明:应用上下文路径是Web应用的访问前缀,用于区分同一Tomcat下的多个应用。例如上下文路径为jsp-demo,则访问地址为[http://localhost:8080/jsp-demo/letter.jsp](http://localhost:8080/jsp-demo/letter.jsp)。

步骤4:启动运行

点击右上角绿色启动按钮,IDEA会自动启动Tomcat并部署项目,浏览器自动打开项目根路径。

在地址栏末尾追加/letter.jsp,即可访问到页面效果。

💡 说明:IDEA部署模式下,文件保存在项目源码目录中,IDEA会自动同步到Tomcat的部署目录,无需手动复制文件。

❗ 四、JSP访问404/URL错误专项排查

针对访问时出现「URL拼写可能存在错误,请检查」、页面返回404的场景,按出现概率从高到低逐一排查,覆盖99%的新手场景:

排名 错误原因 验证方法 解决方案
1 文件后缀被隐藏(最高发) 开启文件扩展名后,文件名显示为letter.jsp.txt 重命名文件,删除末尾的.txt后缀
2 部署路径不匹配 文件放到了bin、conf等非部署目录,或上下文路径写错 手动部署必须放在webapps\ROOT或webapps\自定义应用名目录下;访问地址与上下文路径保持一致
3 Tomcat未启动或启动失败 [http://localhost:8080](http://localhost:8080) 也无法打开 运行bin/startup.bat,查看日志确认启动成功,无报错信息
4 端口号不匹配 之前修改过Tomcat端口,仍用8080访问 查看conf/server.xml中HTTP Connector的port值,使用正确端口访问
5 应用上下文路径错误 IDEA部署的项目有应用名前缀,直接访问根路径 地址加上项目上下文路径,如[http://localhost:8080/](http://localhost:8080/)项目名/letter.jsp
6 跨平台大小写不匹配 Windows开发正常,部署到Linux服务器返回404 Linux系统路径严格区分大小写,全流程统一使用小写文件名
7 浏览器缓存旧页面 修改代码后刷新无变化,或之前访问过404页面被缓存 按Ctrl+F5强制刷新页面,绕过本地缓存重新请求
8 应用部署失败 启动日志有异常报错,应用未正常加载 查看logs/catalina.out日志,排查启动阶段的错误信息

快速定位技巧:先访问[http://localhost:8080](http://localhost:8080),如果Tomcat官方欢迎页都打不开,属于服务或端口问题;如果欢迎页正常,属于文件路径、文件名或上下文路径问题。

💬 五、常见问题 FAQ

Q1:JSP文件直接双击用浏览器打开不行吗?

不行。JSP是服务端动态技术,其中的Java代码需要服务端容器编译执行。直接本地打开只会把代码当纯文本显示,不会执行任何Java逻辑。必须部署到Web容器中,通过HTTP协议访问。

Q2:修改JSP代码后需要重启Tomcat吗?

默认开发模式下不需要。Tomcat默认开启JSP热编译机制,会自动检测文件更新并重新转译编译。

注意:生产环境通常会关闭热编译(将development设为false)提升性能,此时修改JSP必须重启服务才能生效。

Q3:JSP的内置对象有哪些?为什么out不用定义就能用?

JSP提供了多个隐式内置对象,由Jasper引擎在编译时自动创建,开发者可以直接使用。

常用的有out(输出)、request(请求)、response(响应)、session(会话)、application(全局上下文)、config(配置)、pageContext(页面上下文)、page(页面实例)8个;

还有1个exception(异常对象),仅在声明了isErrorPage="true"的错误页面中可用,普通页面无法访问。

Q4:页面中文乱码和控制台日志乱码是一回事吗?

不是同一问题,解决方案完全不同:

  • 页面中文乱码:是JSP文件编码、page指令编码、浏览器解析编码三者不统一导致,检查文件保存编码和page指令即可;
  • 控制台日志乱码 :是Tomcat日志编码与Windows CMD编码不匹配导致,修改logging.properties的控制台编码为GBK即可。

Q5:必须放在ROOT目录吗?能不能自己建文件夹?

可以自建目录。在webapps下新建一个文件夹,例如myapp,把JSP文件放入其中,访问地址即为[http://localhost:8080/myapp/letter.jsp](http://localhost:8080/myapp/letter.jsp)。每个独立的子文件夹对应一个独立的Web应用上下文。

🧮 六、进阶拓展:ASCII数值循环写法

除了直接用字符遍历,也可以通过ASCII码数值遍历,两种写法最终效果完全一致,适合理解底层原理:

复制代码
<%
    // 小写字母a的ASCII码为97,小写字母z的ASCII码为122
    // 以整数形式循环遍历,再强制转换为char字符
    for(int asciiCode = 97; asciiCode <= 122; asciiCode++){
        char letter = (char) asciiCode;
        out.print(letter + "&nbsp;");
    }
%>

原理说明:字符在计算机底层以ASCII数值存储,小写字母a-z的ASCII码连续递增,因此可以用整数循环后强转实现字符遍历。

🔗 官方参考链接

如果本文对你有帮助,欢迎点赞👍、收藏⭐、评论💬、关注➕!


个人领域:C++/java/Al/软件开发/芯片开发

个人主页:「一名热衷协作的开发者,在构建中学习,期待与你交流技术、共同成长。」

座右铭:「与其完美地观望,不如踉跄地启程」

相关推荐
曹牧1 小时前
Eclipse:Subclipse
java·ide·eclipse
张张的快乐时光呀!2 小时前
如何配置CUDA开发环境?
windows
weixin_448771722 小时前
Spring框架之ApplicationContext源码学习
java·学习·spring
白露与泡影2 小时前
Spring AI Alibaba -- 文生图、文生音及向量化
java·人工智能·spring
滕州市燕猫虎计算机科技工作室个体工商户2 小时前
Java,Java NIO,Java NIO2,Java AIO,AsynchronousServerSocketChannel
java·开发语言·nio·aio·nio2
学长毕设2 小时前
基于springboot的社会志愿者管理系统-附源码
java·spring boot·后端
fatCatLA2 小时前
记一次狼狈的装机
windows
木头科技2 小时前
【AI 工程化第十六篇】Spring AI 多模态 RAG 实战:图片、扫描件、表格与图文证据链
java·人工智能·spring
驭渊的小故事2 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm