☰
JSP上机实习报告:六道题代码与避坑指南
2026/10/14 2:01:55 网站建设 项目流程

简介:这份JSP上机实习报告面向高校Java Web课程学习者与初学者,围绕JSP开发技术课程实验整理而成,可帮助读者对照完成课堂作业、复习上机考点并梳理实验思路。报告内容覆盖JSP页面中嵌入Java代码实现算术运算、创建BookInfo等JavaBean封装name、price、stock、author属性、编写DoString工具类转换HTML特殊字符,以及基于JavaBean实现用户名密码校验与页面跳转的登录程序,并附有心得总结。资源包共1个doc文档,约38KB,结构紧凑,便于直接查阅与打印。目前已有102人学习下载,适合需要参考实验代码、理解JavaBean规范与JSP请求处理流程的学生对照练习,也可作为课程报告撰写的参考范例。

1. 从一份 JSP 上机实习报告说起:它到底能帮你省下多少翻书时间

如果你正在学 Java Web,或者带学生做 JSP 上机实验,大概率会遇到这种局面:环境搭好了,Tomcat 跑起来了,但真到写代码的时候,连一个“1+1 输出到页面”都要翻半天书。这份 JSP 上机实习报告就是冲着这个场景来的。它把 JSP 开发技术课程里最典型的几个上机题——表达式输出、表单提交、留言展示、JavaBean 封装、字符串转义、登录判断——全部拆成了可运行的代码片段和操作步骤。不是那种只给题目的实验指导书,而是每道题都配了能直接抄进 Eclipse 的源码。适合谁?刚接触 JSP 的在校生、需要快速交实验报告的开发者、以及想用最短时间把 JSP 核心语法过一遍的转行者。它解决的不是“JSP 是什么”的问题,而是“这道题代码到底怎么写、为什么这么写、跑不起来该看哪里”的问题。

2. 环境搭建与第一行 JSP 代码:从零跑通一个动态 Web 项目

2.1 选 Eclipse 还是 IDEA,Tomcat 版本怎么定

这份报告里的所有题目都默认在 Eclipse 里完成,项目类型是 Dynamic Web Project。为什么不是 Maven 项目?因为上机实验的场景下,Maven 的依赖下载和目录结构反而会分散注意力,Dynamic Web Project 的 WebContent 目录结构更直观,JSP 文件放进去就能跑。Tomcat 版本建议选 8.5 或 9.0,这两个版本对 JSP 2.3 和 Servlet 3.1 的支持最稳定,和 Eclipse 的集成也最成熟。JDK 用 8 就行,JSP 上机实验不涉及新语法,JDK 8 的兼容性最好。常见做法是:Eclipse 装 Java EE 版本,Window → Preferences → Server → Runtime Environments 里添加 Tomcat 路径,新建项目时 Target Runtime 选对应的 Tomcat。

2.2 第一题:用表达式标签输出 1+1 的完整流程

第一题看起来简单,但它是理解 JSP 执行模型的最小闭环。操作步骤分三步:新建 Dynamic Web Project,在 WebContent 下新建 JSP File,然后在 body 里写表达式标签。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>计算结果</title> </head> <body> <!-- 表达式标签:Java 表达式的结果会直接转为字符串插入 HTML --> <h2>1 + 1 的结果是:<%= 1 + 1 %></h2> <% // 脚本片段:这里可以写任意 Java 代码 int a = 10; int b = 20; int sum = a + b; out.println("a + b = " + sum); %> </body> </html>

这段代码里有两个关键点。第一,<%= 1 + 1 %>是表达式标签,它等价于out.print(1 + 1),但写法更简洁,适合输出单个值。第二,<% %>是脚本片段,里面可以声明变量、写循环、做判断,但注意脚本片段里声明的变量是局部变量,不能加访问修饰符。参数方面,pageEncoding="UTF-8"和contentType="text/html; charset=UTF-8"要同时写,只写一个在某些 Tomcat 版本下中文会乱码。我一般会把这两个属性当成 JSP 文件的标配,新建文件后第一件事就是检查它们。

2.3 部署到 Tomcat 并验证输出

写完 JSP 后,右键项目 → Run As → Run on Server,选 Tomcat,Eclipse 会自动把项目部署到workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/下。浏览器访问http://localhost:8080/项目名/文件名.jsp。如果页面显示“1 + 1 的结果是:2”,说明环境没问题。如果报 404,先检查项目是否真的部署成功——在 Servers 视图里双击 Tomcat,看 Modules 标签页里有没有你的项目。如果报 500,看 Console 里的堆栈,最常见的是 JSP 文件里 import 了不存在的包,或者 Java 代码有语法错误。这里有个血泪经验:Eclipse 有时候不会自动编译 JSP 里的 Java 代码,改完代码后最好在 Servers 视图里右键 Tomcat → Clean,再重新发布。

3. JavaBean 封装与字符串转义:把数据层和视图层拆开

3.1 第四题:BookInfo 的属性和 getter/setter 规范

第四题要求创建一个名为 BookInfo 的 JavaBean,包含 name、price、stock、author 四个 String 属性。JavaBean 的核心规范就三条:类必须是 public 的,属性私有,提供无参构造方法和 getter/setter。这份报告里的代码把包名写成了hbe,类名小写bookinfo,这在 Java 命名规范里其实不太标准——类名应该用大驼峰BookInfo。但上机实验里老师可能不检查这个,我建议还是按规范来,避免以后被 IDE 的警告烦到。

package com.example.bean; public class BookInfo { private String name; private String price; private String stock; private String author; // 无参构造方法:JavaBean 规范要求显式写出 public BookInfo() {} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getStock() { return stock; } public void setStock(String stock) { this.stock = stock; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }

参数说明:四个属性都是 String 类型,这是题目明确要求的。实际开发中 price 和 stock 更合理的是 BigDecimal 和 int,但上机实验为了简化,统一用 String 也能理解。getter/setter 的命名必须严格遵循getXxx/setXxx格式,因为 JSP 里的<jsp:useBean>和<jsp:setProperty>标签依赖反射来查找方法名,写错了会报NoSuchMethodException。

3.2 第五题:DoString 工具类与 XSS 转义的关系

第五题要求写一个 DoString 工具类,把字符串里的<和>替换成&lt;和&gt;。这份报告里的代码用了str=("<","&lt;")这种写法,实际上 Java 的 String 没有这个重载方法,正确写法应该是str.replace("<", "&lt;")。这个题目的实际意义是防止 XSS 攻击——如果用户输入的内容直接输出到页面,恶意脚本会被浏览器执行。虽然上机实验不会讲这么深,但这是 JSP 开发里必须知道的坑。

package com.example.util; public class DoString { // 将 HTML 特殊字符转义,防止脚本注入 public static String change(String str) { if (str == null) return ""; str = str.replace("<", "&lt;"); str = str.replace(">", "&gt;"); str = str.replace("\"", "&quot;"); str = str.replace("&", "&amp;"); // 注意 & 要最后替换 return str; } }

逻辑说明:替换顺序很重要。如果先替换&,那么&lt;里的&会被二次转义成&amp;lt;。所以&必须放在最后替换。参数方面,方法声明为 static,这样在 JSP 里可以直接用DoString.change(...)调用,不需要实例化。我一般还会加上 null 判断,避免空指针。这个工具类虽然简单,但它是后面留言展示题目的基础——用户留言如果不转义,页面结构会被破坏,甚至被注入脚本。

3.3 在 JSP 中调用 JavaBean 的两种方式

在 JSP 里使用 JavaBean 有两种方式。第一种是直接用脚本片段:

<%@ page import="com.example.bean.BookInfo" %> <% BookInfo book = new BookInfo(); book.setName("JSP 实战"); book.setPrice("59.9"); book.setStock("100"); book.setAuthor("某开发者"); %> <p>书名:<%= book.getName() %></p>

第二种是用 JSP 动作标签:

<jsp:useBean id="book" class="com.example.bean.BookInfo" scope="page" /> <jsp:setProperty name="book" property="name" value="JSP 实战" /> <jsp:getProperty name="book" property="name" />

两种方式都能跑,但动作标签的写法更“JSP 原生”,适合在实验报告里展示对 JSP 标签的掌握。注意scope="page"表示这个 Bean 只在当前页面有效,如果要在多个页面共享,需要改成session或application。常见错误是类名写错或者包名没导入,报ClassNotFoundException,这时候检查 WebContent/WEB-INF/classes 下有没有编译后的 .class 文件。

4. 登录判断与页面转发:请求流转的完整链路

4.1 第六题:用户名密码校验的逻辑实现

第六题要求用 JavaBean 接收用户名和密码,判断是否为 admin/000,然后转发到不同页面。这道题的核心不是 JavaBean,而是请求转发(forward)和重定向(redirect)的区别。报告里的代码用了("")这种占位写法,实际应该是request.getRequestDispatcher("success.jsp").forward(request, response)。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 获取表单提交的参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 简单校验:实际项目里应该查数据库 if ("admin".equals(username) && "000".equals(password)) { // 转发到欢迎页面,URL 不变 request.getRequestDispatcher("welcome.jsp").forward(request, response); } else { // 转发到失败页面,并携带错误信息 request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("fail.jsp").forward(request, response); } %>

逻辑说明:request.getParameter()获取表单字段,equals()判断时把常量写在前面可以避免空指针。forward()是服务器内部跳转,浏览器地址栏不变,请求域里的属性可以传递到下一个页面。如果换成response.sendRedirect(),地址栏会变,请求域属性会丢失。参数方面,表单的 method 必须是 post,get 会把密码暴露在 URL 里。另外,这个 JSP 本身既是表单处理页又是逻辑判断页,实际开发中应该拆成 Servlet,但上机实验为了简化,写在 JSP 里也能理解。

4.2 表单提交与中文乱码的三种解法

表单提交中文乱码是 JSP 上机实验里翻车率最高的地方。三种解法按推荐程度排序:第一种,在 JSP 页面顶部加request.setCharacterEncoding("UTF-8"),但只对 POST 有效;第二种,在 Tomcat 的 server.xml 里给 Connector 加URIEncoding="UTF-8",对 GET 和 POST 都有效;第三种,用过滤器统一处理。上机实验里最省事的是第一种,但要注意必须在获取任何参数之前调用。

<% request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); %>

如果已经乱码了,检查三处:JSP 文件的 pageEncoding、response 的 contentType、request 的 characterEncoding。这三处都设成 UTF-8,基本能解决 90% 的乱码问题。剩下的 10% 可能是 Tomcat 版本问题,换 8.5 或 9.0 通常就好了。

4.3 留言展示题的完整数据流

留言展示题虽然报告里只写了“留言输入”和“留言展示”两个标题,但它的数据流是完整的:表单页提交留言 → 处理页接收并转义 → 存储到 application 域 → 展示页遍历输出。这里的关键是 application 域,它比 session 的作用范围更大,所有用户都能看到留言。

<% // 处理页:接收留言并转义后存入 application String content = request.getParameter("content"); if (content != null && !content.trim().isEmpty()) { String safeContent = DoString.change(content); java.util.List<String> messages = (java.util.List<String>) application.getAttribute("messages"); if (messages == null) { messages = new java.util.ArrayList<>(); application.setAttribute("messages", messages); } messages.add(safeContent); } response.sendRedirect("list.jsp"); %>

展示页用 JSTL 或脚本片段遍历:

<% java.util.List<String> messages = (java.util.List<String>) application.getAttribute("messages"); if (messages != null) { for (String msg : messages) { %> <p><%= msg %></p> <% } } %>

参数说明:application 域的数据在服务器重启后丢失,上机实验够用,生产环境要存数据库。转义必须在存入之前做,展示时直接输出即可。如果先存后转义,已经存入的恶意脚本仍然可能在其他页面被触发。

5. 避坑与排查:JSP 上机实验里最容易翻车的五个点

5.1 现象:页面报 404,Tomcat 日志无异常

原因:项目没有真正部署到 Tomcat,或者访问路径写错。Eclipse 的 Dynamic Web Project 默认上下文路径是项目名,但有时候 Servers 视图里的 Tomcat 配置没有同步。解决:双击 Servers 里的 Tomcat,在 Modules 标签页确认项目在列表里;如果不在,右键 Tomcat → Add and Remove 手动添加。访问路径用http://localhost:8080/项目名/文件.jsp,注意大小写。

5.2 现象:JSP 里的 Java 代码报“无法解析为类型”

原因:JavaBean 类没有编译,或者包名和 import 不一致。Eclipse 默认不会自动编译 WebContent 下的 Java 类,需要手动检查 build 路径。解决:确认 Java 类放在src目录下而不是 WebContent 下;Project → Clean 重新编译;检查<%@ page import="完整包名.类名" %>是否写对。

5.3 现象:表单提交后中文变成问号或乱码

原因:request 的字符编码没有设置,或者 JSP 文件的 pageEncoding 和 contentType 不一致。解决:在获取参数前加request.setCharacterEncoding("UTF-8");JSP 顶部同时写pageEncoding="UTF-8"和contentType="text/html; charset=UTF-8";如果还不行,检查 Tomcat 的 server.xml 里 Connector 有没有URIEncoding="UTF-8"。

5.4 现象:<jsp:setProperty>报 NoSuchMethodException

原因:JavaBean 的 setter 方法命名不规范,或者属性类型不匹配。比如属性是 String,setter 参数写成了 int。解决:严格按setXxx格式命名,参数类型和属性类型一致;确保类有无参构造方法;如果属性名是name,setter 必须是setName而不是setname。

5.5 现象:forward 之后页面样式丢失或数据取不到

原因:forward 是服务器内部跳转,浏览器地址栏不变,如果目标页面用了相对路径引用 CSS 或 JS,基准路径会变。解决:用绝对路径${pageContext.request.contextPath}/css/style.css;如果数据取不到,检查request.setAttribute和request.getAttribute的 key 是否一致;forward 只能在响应未提交前调用,out.flush()之后会报 IllegalStateException。

6. 从实验报告到可运行项目:我的验证习惯和一条进阶路线

这份 JSP 上机实习报告的价值不在于代码有多复杂,而在于它把 JSP 开发技术课程里最核心的六个知识点串成了一条线:表达式输出、脚本片段、JavaBean 封装、工具类转义、表单处理、请求转发。我拿到任何一份实验报告类的资源,第一件事不是通读,而是挑第一题跑通。跑通的标准是:新建项目、粘贴代码、部署、浏览器看到预期输出。这一步过了,说明环境和代码基本匹配。然后我会把每道题的代码单独建一个 JSP 文件,按题目编号命名,比如task1.jsp、task4.jsp,这样排查问题时能快速定位是哪道题的代码有问题。

验证 JavaBean 的时候,我习惯在 JSP 里加一行<%= book.getClass().getName() %>,确认反射加载的类路径和预期一致。验证转义工具的时候,我会故意输入<script>alert(1)</script>,看页面是显示文本还是弹窗。验证登录转发的时候,我会分别用正确密码和错误密码各跑一次,确认 forward 的目标页面正确,并且地址栏没有变化。

如果要把这份报告里的代码升级成更接近实际项目的结构,下一步是把 JSP 里的 Java 逻辑抽到 Servlet 里,JSP 只负责展示。比如登录判断,可以写一个 LoginServlet,在doPost里处理参数和转发,JSP 只保留表单和提示信息。再进一步,用 JSTL 和 EL 表达式替代脚本片段,页面会更干净。但那是下一步的事,上机实验阶段先把这份报告里的六道题跑通,比什么都实在。

从那以后我每次拿到类似的实验报告资源,都会先跑第一题验证环境,再逐题拆解,最后把踩过的坑记在一个单独的 markdown 文件里。这个习惯帮我省下了大量重复排查的时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询