JSP上机实习报告全攻略:从环境搭建到JDBC增删改查实战
简介面向JSP开发技术课程实训与复习这份资料汇编了JSP上机实习的完整任务报告涵盖JSP页面输出Java计算结果、BookInfo值JavaBean的创建、DoString工具类实现字符串中特殊符号的转换以及使用JavaBean完成用户名密码校验的简易登录程序。每个任务均提供代码片段、运行思路与页面跳转讲解末尾附心得总结适合信息管理类学生快速掌握JSP与JavaBean的基础协作方式也适合初次接触JavaWeb的开发者查漏补缺。资源共1份doc格式文档整体大小为38KB内容紧凑无冗余便于下载后直接查看、打印或作为实验报告模板使用。目前已有102人学习下载说明对课程实验与复习有较强参考价值。读者通过阅读可梳理JSP动态页面写法、JavaBean属性封装规范、getter与setter方法定义以及请求参数处理、页面跳转等核心操作在完成这些上机任务的过程中也能锻炼排错能力与基础编码思维为后续JSP项目开发打下扎实基础。1. JSP上机实习报告不是写文档是先让系统在我机器上跑起来拿“JSP上机实习报告.doc”当交付物的课程作业最坑的不是报告本身而是很多同学把顺序搞反了先找模板、先抄代码最后发现Tomcat根本起不来。我在实验室见过不少惨案文档里贴了完整的学生管理系统问到端口、部署路径、数据库连接串时人直接愣住。其实这篇报告真正考察的是你能否把 JSP 的整条链路走通环境配置、页面语法、内置对象、JDBC 增删改查、部署排错。代码是载体能运行、能演示、能面对提问才是核心。这篇文章就直接按这条链路带你过一遍最后落到一份自己能讲清楚、经得起现场验收的实习报告上新手照着做熟手当排错手册翻。2. 从JDK到Tomcat搭出JSP最小运行环境三个环节一次讲清2.1 JDK与Tomcat的选型版本不匹配会让第一节课就卡死JSP 本质上跑在 Servlet 容器里Tomcat 是绝大多数上机课的默认选择。选型上没有太多花哨但版本不能乱配。踩过一次的都知道JDK 太新、Tomcat 太新老教材里的代码可能直接编译不过反过来 JDK 太老新驱动又会抛 UnsupportedClassVersionError。上机实习报告里“实习环境”这一栏是必填项版本不对会让整篇报告失去可信度。组合推荐度原因JDK 1.8 Tomcat 9.x最稳教材、驱动、课程代码兼容性最广JDK 11 Tomcat 9.x可用部分老 MySQL 驱动会报模块访问问题JDK 17 Tomcat 10.x慎用Servlet 包名从 javax.* 改成 jakarta.*老代码直接废我的建议很简单交作业求稳直接上 JDK 1.8 配 Tomcat 9。如果你机器已装了高版本 JDK也先别卸把 1.8 单独解压到某个目录需要时切换环境变量即可。检验环境是否可用打开终端跑一条命令java -version javac -version上面两条命令输出里的版本号必须一致如果java有输出而javac报“无法找到命令”说明只配置了 JRE 的路径JAVA_HOME 指错了目录。这是环境配置里最常踩的坑没有之一。正确做法是把 JAVA_HOME 指向 JDK 的根目录而不是 bin 目录。2.2 配置环境变量并部署第一个 index.jspJDK 配置完成后把 Tomcat 解压到任意目录然后在系统环境变量里补上CATALINA_HOME。这一步不是必须的很多同学不配 CATALINA_HOME 也能启动 Tomcat但后面一旦要写脚本或调整日志路径没有这个变量会非常难受。export JAVA_HOME/usr/local/jdk1.8.0_202 export CATALINA_HOME/usr/local/apache-tomcat-9.0.xx export PATH$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATHWindows 用户在“系统属性 → 环境变量”里新建同名变量即可效果一样。配置完成后在命令行执行startup.bat # Linux/macOS 下是 startup.sh看到“Server startup in xxx ms”才算启动成功。如果窗口一闪而过去 Tomcat 的 logs 目录找catalina.out或本地日志文件大部分启动失败的原因都在里面写着。接着在 webapps 下建一个最简单的 Web 应用目录mkdir -p $CATALINA_HOME/webapps/student/WEB-INF然后写一个 JSP 页面% page contentTypetext/html;charsetUTF-8 % % page importjava.util.Date % html headtitleJSP上机首页/title/head body h1JSP运行成功/h1 p服务器时间% new Date() %/p /body /html把这个文件保存为index.jsp放进student目录浏览器访问http://localhost:8080/student/index.jsp看到时间输出就说明整条链路通了。注意 URL 里必须有8080端口和/student上下文路径直接双击 jsp 文件打开的只是源代码那不等于运行成功。提示修改 JSP 后页面不更新是常见现象先重启 Tomcat再检查 webapps 下的 work 目录里有没有生成对应的 java 和 class 文件。很多时候旧页面是 Tomcat 缓存没清掉不是代码改错了。3. JSP页面语法与内置对象报告里“系统设计”部分的技术底座3.1 一个页面吃透page指令、声明、表达式和注释JSP 的语法体系说复杂也复杂但上机报告真正要你写清楚的就四类东西指令、声明、小脚本、表达式。再加上注释基本能把一个页面的结构撑起来。先看一段同时包含这五类的代码% page languagejava contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 importjava.util.* % %! // 声明定义成员变量和方法 private int visitCount 0; public String getServerTime() { return new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date()); } % % // 小脚本在 _jspService 方法里执行的 Java 代码 visitCount; % %-- 这是JSP注释客户端看不到 --% html body p页面访问次数% visitCount %/p p当前时间% getServerTime() %/p /body /html上面有三点值得写进报告“关键技术说明”一节。page指令里的contentType管响应编码pageEncoding管 jsp 文件本身的编码两个都必须写 UTF-8漏一个就可能中文乱码。%!声明的是成员变量或方法会被翻译成 Servlet 类的字段多个请求访问同一个变量存在线程安全问题。% % 小脚本里的代码会在请求到达时执行% %表达式等价于out.println()负责输出内容。注释这里有个隐藏考点!-- --是 HTML 注释客户端右键查看源代码能看到%-- --%是 JSP 注释只在服务端存在压根不会发送到浏览器。报告截图如果想显得专业可以把 JSP 注释混在页面里然后解释两者区别老师一眼就知道你不是只会复制代码。3.2 内置对象request、session、application的实际分工JSP 有九个内置对象上机代码里高频使用的其实是 request、response、session、application 这四兄弟。搞懂它们的作用范围等于把报告里的“页面交互流程”写明白了一半。它们分别对应请求数据、响应控制、会话状态、全局状态。内置对象作用范围典型场景request单次请求读取表单参数、请求头response单次请求跳转、设置响应头session单个用户会话登录状态保持application整个应用在线人数统计下面这段登录逻辑比较直白把三个常用对象贯穿起来% request.setCharacterEncoding(UTF-8); String username request.getParameter(username); if (username ! null !username.trim().isEmpty()) { session.setAttribute(user, username.trim()); Integer count (Integer) application.getAttribute(onlineCount); application.setAttribute(onlineCount, count null ? 1 : count 1); response.sendRedirect(welcome.jsp); return; } %逻辑很清晰request 拿到表单字段session 存当前用户application 做全局计数最后 response 重定向。注意application属性在 Tomcat 重启后会清零这是正常的报告里不需要画蛇添足去解释“消失的用户数”。有个坑是Integer拆箱问题如果你用int count (Integer)拿空值会抛空指针先用Integer接收再判空是最稳的写法。提示session 默认超时时间是 30 分钟在 web.xml 里可以配session-config。答辩前如果页面长时间没操作导致登录态丢失先别怀疑代码看超时时间是不是被改过。4. 数据库增删改查是上机报告的“硬菜”JDBC直连与四段核心代码4.1 建库建表与JDBC工具类链接串里的时区参数别删上机报告要落地几乎无法绕开数据库。JSP 项目虽然也可以用文件存储但数据库交互才是课程考核的重点毕竟增删改查是标准动作。先建一张极简学生表字段够验收用即可CREATE DATABASE IF NOT EXISTS jsp_class DEFAULT CHARSET utf8mb4; USE jsp_class; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL, name VARCHAR(50) NOT NULL, score DECIMAL(5,2), create_time DATETIME ); INSERT INTO student (student_no, name, score, create_time) VALUES (2024001, 张三, 88.50, NOW()), (2024002, 李四, 76.00, NOW());表结构里id用自增主键create_time用NOW()填充后期报告测试数据时省很多事。然后写一个DBUtil工具类把连接串、用户名、密码集中管理import java.sql.*; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/jsp_class?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(MySQL驱动加载失败请检查jar包); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement st, ResultSet rs) { if (rs ! null) { try { rs.close(); } catch (SQLException ignored) {} } if (st ! null) { try { st.close(); } catch (SQLException ignored) {} } if (conn ! null) { try { conn.close(); } catch (SQLException ignored) {} } } }这段代码里有三个关键参数。MySQL 8 以上驱动类名必须是com.mysql.cj.jdbc.Driver老驱动名com.mysql.jdbc.Driver在 8.x 里会直接抛 ClassNotFoundException。URL 里的useUnicodetruecharacterEncodingUTF-8负责存取中文不乱码serverTimezoneAsia/Shanghai是 MySQL 8 的强制要求删掉会报时区错误。close方法里用空判断包一层是为了防止某个对象为空时直接抛 NullPointerException很多同学在这里栽跟头。4.2 学生列表与新增删除修改四段代码覆盖报告核心功能有了工具类剩下的就是按页面拆功能。列表页是最基础的一段直接循环遍历 ResultSet% page importjava.sql.* % % Connection conn null; PreparedStatement ps null; ResultSet rs null; % table border1 trthID/thth学号/thth姓名/thth分数/thth操作/th/tr % try { conn DBUtil.getConnection(); ps conn.prepareStatement(SELECT id, student_no, name, score FROM student ORDER BY id); rs ps.executeQuery(); while (rs.next()) { int id rs.getInt(id); % tr td% id %/td td% rs.getString(student_no) %/td td% rs.getString(name) %/td td% rs.getDouble(score) %/td td a hrefstudent_edit.jsp?id% id %修改/a a hrefstudent_delete.jsp?id% id %删除/a /td /tr % } } catch (SQLException e) { out.println(trtd colspan5查询失败 e.getMessage() /td/tr); } finally { DBUtil.close(conn, ps, rs); } % /table用PreparedStatement而不是Statement原因就一条防止 SQL 注入。哪怕上机作业里没人在意安全性报告里主动写出这一条也能明显提升印象分。finally里关资源是必须的不关连接的话Tomcat 跑一会儿就报 Too many connections这个错在答辩现场出现非常丢分。新增功能拆成两个页面表单页采集数据处理页执行插入。form actionstudent_save.jsp methodpost 学号input typetext namestudent_no / 姓名input typetext namename / 分数input typetext namescore / input typesubmit value保存 / /form% request.setCharacterEncoding(UTF-8); String studentNo request.getParameter(student_no); String name request.getParameter(name); String scoreStr request.getParameter(score); double score Double.parseDouble(scoreStr); String sql INSERT INTO student(student_no, name, score, create_time) VALUES(?,?,?,NOW()); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, studentNo); ps.setString(2, name); ps.setDouble(3, score); ps.executeUpdate(); response.sendRedirect(student_list.jsp); } catch (SQLException e) { out.println(新增失败 e.getMessage()); } %处理页开头那句request.setCharacterEncoding(UTF-8)就是中文乱码的解药之一post 提交时必须在读取第一个参数之前设置编码放晚了等于没设。删除和修改逻辑可以压缩得很短% int id Integer.parseInt(request.getParameter(id)); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(DELETE FROM student WHERE id?)) { ps.setInt(1, id); ps.executeUpdate(); response.sendRedirect(student_list.jsp); } %修改页是先按 id 查出来回显到表单提交时再执行 UPDATE。回显用的student_edit.jsp?id参数拼接放链接里注意 URL 中文参数要编码这是很多人忽略的细节。到这里列表、新增、删除、修改四段代码齐活报告的核心功能就有血有肉了。5. JSP上机排错现场404、中文乱码、端口占用的排查手记5.1 Tomcat版本与部署路径冲突导致的404现象浏览器输入http://localhost:8080/student/直接 404但文件明明已经放进 webapps 目录了。原因大概率是这三类项目目录名和 URL 里的路径对不上webapps 下放错层级把 student 文件夹套在另一个目录里JSP 文件放在 WEB-INF 目录内而 WEB-INF 下的资源不能通过浏览器直接访问。还有一个隐蔽原因是 Tomcat 还没完成自动发布刚拷文件就立刻访问等两秒刷新即可。解决打开 webapps 目录确认路径正确student文件夹下必须有index.jspWEB-INF 里只放类和配置。同时去 Tomcat 的 logs 目录翻localhost.yyyy-MM-dd.logTomcat 会把加载失败的具体原因打在这里比瞎猜快得多。5.2 一套UTF-8却还是乱码三处编码一致性缺一不可现象页面显示中文是问号或者往数据库插入中文后查出来变成乱码。更诡异的是同一套代码在同学机器上正常换一台就乱。原因编码是个链路JSP 文件本身可能不是 UTF-8 存储的那pageEncoding设什么都没用response 的contentType没设 UTF-8浏览器用了默认编码POST 参数在读取前没设置 request 编码最后 MySQL 连接串缺了characterEncodingUTF-8或者表不是 utf8mb4。四段里任何一处断了都会乱码。解决装个带编码选择的编辑器保存 JSP统一 UTF-8JSP 头部保留contentType和pageEncoding双保险开始取参数前执行request.setCharacterEncoding(UTF-8)MySQL 连接串带上useUnicodetruecharacterEncodingUTF-8已建表如果不是 utf8直接用ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4补救。一套下来还没解决的把浏览器也强制切成 UTF-8排除缓存干扰。5.3 端口占用、时区报错与黑匣子缓存现象Tomcat 启动日志写着Port 8080 is already in use或者启动后马上闪退。原因之前启动的 Tomcat 进程没被杀干净或者 8080 被别的服务占用了。解决Windows 下用netstat -ano | findstr 8080找到占用端口的 PID然后在任务管理器结束该进程或者直接改 Tomcat 的conf/server.xml把端口切到 8081。改完端口后所有访问 URL 的端口号必须同步改别只顾着改配置忘了浏览器地址栏。另一个上机报告答辩前的高频现场报错是 MySQL 时区问题连接时抛The server time zone value is unrecognized。原因就是 JDBC 连接串缺serverTimezone参数补上serverTimezoneAsia/Shanghai即可。至于 Tomcat 跑了旧代码是因为 JSP 编译后的 class 缓存在work/Catalina目录里彻底一点就把该目录清掉再重启别用“听天由命”式刷新。注意代码修改后如果页面始终不变大概率不是 Tomcat 玄学而是 JVM 还没重新编译。删除 work 目录里的对应项目缓存重启 Tomcat这个“黑匣子”其实非常透明。6. 从代码到《JSP上机实习报告》把过程沉淀成一份能现场演示的文档6.1 报告的框架与每一个小节要贴什么代码跑通之后写报告就是整理证据。不要照着网上的模板填“系统概述”“可行性分析”那种空话实验室上机报告的核心是“做了什么、怎么做、遇到什么坑怎么解决”。我建议按下面这个结构组织每个模块在报告里对应的是一张截图加一段说明报告章节你要放的内容实习环境JDK、Tomcat、MySQL、驱动的具体版本号需求分析两句话讲清系统服务对象和功能边界页面设计JSP 页面截图标注指令、脚本元素、内置对象数据库设计建表 SQL 和表结构截图核心代码列表、新增、删除、修改四段代码每段配一句逻辑说明运行结果浏览器 URL 和操作后的页面截图问题与解决从第 5 章的排查记录里挑两三条真实遇到过的实习总结写一个真实的收获比如搞懂了 session 的作用范围6.2 验收现场必须留好三类证据第一类是环境证据。答辩老师问的不只是代码还会问“你这个项目换个机器能不能跑”。报告里把 JAVA_HOME 的路径、Tomcat 版本、MySQL 连接串三项列清楚现场就能照看环境是否一致。第二类是数据证据。截图里不要把数据库表空着拍提前插入两三行测试数据让增删改查的每一步都有前后对比。第三类是流程证据。演示时先启动数据库再启动 Tomcat按“列表 - 新增 - 修改 - 删除”的顺序走一遍每做一步切一次数据库软件截图让老师看到 JSP 和数据库是真实联动的。6.3 提交前的打包备份习惯最后给一个我吃过亏换来的操作习惯报告和项目代码打包提交前先做一次完整备份。# 把整个项目目录连同报告文件一起打包 tar -czvf jsp_student_backup.tar.gz student/ JSP上机实习报告.doc别小看这一步答辩现场最怕的就是改坏了项目又不想承认备份能让一切重来。打包前顺手检查 JSP 文件名、数据库名、URL 路径是不是和报告里写的一致因为报告和代码对不上是最低级的丢分点。以前我最怕被问到“这个功能怎么实现”现在养成先跑通再截图、先备份再改代码的习惯报告交出去心里就有底了。希望帮到你。本文还有配套的精品资源点击获取