简介:面向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.jsp
JDK 配置完成后,把 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 contentType="text/html;charset=UTF-8" %> <%@ page import="java.util.Date" %> <html> <head><title>JSP上机首页</title></head> <body> <h1>JSP运行成功</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 language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.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?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/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 里的useUnicode=true&characterEncoding=UTF-8负责存取中文不乱码,serverTimezone=Asia/Shanghai是 MySQL 8 的强制要求,删掉会报时区错误。close方法里用空判断包一层是为了防止某个对象为空时直接抛 NullPointerException,很多同学在这里栽跟头。
4.2 学生列表与新增删除修改:四段代码覆盖报告核心功能
有了工具类,剩下的就是按页面拆功能。列表页是最基础的一段,直接循环遍历 ResultSet:
<%@ page import="java.sql.*" %> <% Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; %> <table border="1"> <tr><th>ID</th><th>学号</th><th>姓名</th><th>分数</th><th>操作</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 href="student_edit.jsp?id=<%= id %>">修改</a> <a href="student_delete.jsp?id=<%= id %>">删除</a> </td> </tr> <% } } catch (SQLException e) { out.println("<tr><td colspan='5'>查询失败:" + e.getMessage() + "</td></tr>"); } finally { DBUtil.close(conn, ps, rs); } %> </table>用PreparedStatement而不是Statement原因就一条:防止 SQL 注入。哪怕上机作业里没人在意安全性,报告里主动写出这一条也能明显提升印象分。finally里关资源是必须的,不关连接的话,Tomcat 跑一会儿就报 Too many connections,这个错在答辩现场出现非常丢分。
新增功能拆成两个页面:表单页采集数据,处理页执行插入。
<form action="student_save.jsp" method="post"> 学号:<input type="text" name="student_no" /> 姓名:<input type="text" name="name" /> 分数:<input type="text" name="score" /> <input type="submit" 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.jsp,WEB-INF 里只放类和配置。同时去 Tomcat 的 logs 目录翻localhost.yyyy-MM-dd.log,Tomcat 会把加载失败的具体原因打在这里,比瞎猜快得多。
5.2 一套UTF-8却还是乱码:三处编码一致性缺一不可
现象:页面显示中文是问号,或者往数据库插入中文后,查出来变成乱码。更诡异的是,同一套代码在同学机器上正常,换一台就乱。
原因:编码是个链路,JSP 文件本身可能不是 UTF-8 存储的,那pageEncoding设什么都没用;response 的contentType没设 UTF-8,浏览器用了默认编码;POST 参数在读取前没设置 request 编码;最后 MySQL 连接串缺了characterEncoding=UTF-8或者表不是 utf8mb4。四段里任何一处断了,都会乱码。
解决:装个带编码选择的编辑器保存 JSP,统一 UTF-8;JSP 头部保留contentType和pageEncoding双保险;开始取参数前执行request.setCharacterEncoding("UTF-8");MySQL 连接串带上useUnicode=true&characterEncoding=UTF-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参数,补上serverTimezone=Asia/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 路径是不是和报告里写的一致,因为报告和代码对不上是最低级的丢分点。以前我最怕被问到“这个功能怎么实现”,现在养成先跑通再截图、先备份再改代码的习惯,报告交出去心里就有底了。希望帮到你。
本文还有配套的精品资源,点击获取