尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

JSP酒店管理系统课设实战:从JSP+Servlet+JDBC到MySQL事务与分页

JSP酒店管理系统课设实战:从JSP+Servlet+JDBC到MySQL事务与分页 简介JSP酒店管理系统是一套基于B/S模式开发的Web项目资源适合正在学习JSP、Java网页编程与MySQL数据库的初学者也可作为软件工程或网络编程课程的结课设计参考。下载后可直接获得完整源代码与数据库文件JSP页面承担前台展示与交互CSS样式表控制界面外观Java类处理业务逻辑SQL脚本用于初始化数据库能帮助读者系统理解JSPMySQL项目的典型架构、页面与数据之间的调用关系以及在MyEclipse或Eclipse、JDK、Tomcat环境下的部署方式。压缩包为RAR格式共186个文件含96个JSP页面、37个GIF与31个JPG图片、4个CSS样式表以及Java源文件、SQL脚本、JAR包和数据库备份等整体仅1.28MB结构紧凑便于下载后快速拆分学习。目前已有381人学习/下载对需要掌握JSP开发流程和数据库联调思路的读者有直接的参考价值尤其适合用作入门级项目复盘和开发技术巩固。1. 这个标题背后是门什么课JSP 酒店管理系统在软件工程设计里的位置先给这类标题定个性它是软件工程或 Java Web 课程的结课设计技术栈是 JSP MyEclipse MySQL中间还会涉及网络编程里最基本的 HTTP 请求与响应模型。适合刚学完 Java 语法、需要交一个能跑通增删改查的完整系统的学生也适合想用最小成本把 Web 应用从页面到数据库串一遍的入门开发者。这个系统看似只有房间、客户、订单几张表但要把它在浏览器里完整地管理起来从前台 JSP 到 Servlet 控制再到 JDBC 持久层每一层都有各自的坎。我也是连着带过几个学期的课设踩过的坑大多集中在环境配置、中文乱码和数据库连接上代码本身的 bug 反而不难查。JSP 酒店管理系统要解决的核心问题就两个第一把客房、客户、订单这些数据在网页上完成增删改查第二让不同身份的人看到不同功能。能做到这两点课设已经能拿不错的分。但前提是别急着写代码先把数据库表关系、目录结构、请求路径规划清楚否则中途改起来会非常痛苦。下面顺着这条主线从选型到建表、从搭工程到写页面把整个落地路径拆开讲。2. 先从选型说起为什么这套课设要用 JSP MyEclipse MySQL2.1 课程设计选 JSP 而不是 Spring Boot 的真实原因不少同学的第一反应是现在企业里都用 Spring Boot为什么课设还让我用 JSP这个问题其实反映了课程设计的目标——它不是让你做一个生产级系统而是让你把「软件工程设计」里那套需求分析、模块划分、数据库设计的流程走一遍。JSP 的特点是页面里可以直接写 Java 代码HTTP 请求从浏览器到服务器的路径非常直观一个表单提交过来在 JSP 里用request.getParameter()就能拿到参数。这种直白对理解 Web 工作原理特别有帮助尤其适合新手建立「请求 - 响应」的脑图。Spring Boot 当然更贴近真实开发但它已经把 Tomcat 内嵌、依赖管理、自动配置这些事全部封装好了。对课设场景来说这反而把最该练习的部分——Servlet 生命周期、JDBC 连接管理、Session 控制——都藏起来了。所以我的建议是如果你是在做课程作业老老实实按 JSP Servlet JDBC 这套来答辩时老师问到你每个请求怎么被处理的你能答得比用框架更清楚。企业开发的事等工作了再用 Spring Boot 补不冲突。2.2 三层架构拆解JSP 展示层、Servlet 控制层、DAO 数据层JSP 酒店管理系统虽然小但也要按三层来组织代码否则所有逻辑堆在 JSP 页面里改一个查询条件要在十几个页面里找。最常见的分层方式是展示层JSP 页面负责显示数据和接收用户输入。页面里尽量只做循环输出不写复杂业务。控制层Servlet负责接收请求、调用业务方法、决定跳转到哪个 JSP。数据层DAO 类负责和 MySQL 交互把 ResultSet 转成 Java 对象。这套结构里网络编程的痕迹就在 Servlet 上——每个 Servlet 对应一个 URL 路径浏览器请求hotel/roomList时Tomcat 根据 web.xml 里的映射找到对应类调用doGet或doPost方法。你可以在 Servlet 里通过request.setAttribute()把数据放进请求作用域再 forward 给 JSP 渲染。这里有个新手容易踩的坑sendRedirect是重定向浏览器会发起第二次请求用request.setAttribute()存的数据在重定向后会丢失必须改用session或者直接拼 URL 参数。2.3 数据库先行酒店管理系统的四张核心表我习惯先建表再写代码因为表结构决定 DAO 层怎么写。一个典型的 JSP 酒店管理系统至少需要四张表t_user系统用户表存员工账号和角色角色决定登录后看到哪些菜单。t_room客房表存房号、类型、价格、状态。t_customer客户表存客户姓名、手机号、身份证号。t_order订单表存客户订了哪间房、入住和退房日期、订单金额。订单表通过外键关联t_customer和t_room这就在课设里完整体现了实体关系设计。建表时有个细节MySQL 5.7 和 8.x 的默认字符集不同8.x 默认已经是utf8mb4但如果是 5.7建库时最好显式指定。CREATE DATABASE hotel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, real_name VARCHAR(32), role VARCHAR(16) DEFAULT receptionist COMMENT receptionist前台, manager经理 ) ENGINEInnoDB; CREATE TABLE t_room ( id INT PRIMARY KEY AUTO_INCREMENT, room_no VARCHAR(8) NOT NULL UNIQUE, room_type VARCHAR(16) COMMENT single单人间, double双人间, suite套房, price DECIMAL(8,2) NOT NULL, status TINYINT DEFAULT 1 COMMENT 1可订, 0已入住, 2维修 ) ENGINEInnoDB; CREATE TABLE t_customer ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, phone VARCHAR(16) NOT NULL, id_card VARCHAR(18) ) ENGINEInnoDB; CREATE TABLE t_order ( id INT PRIMARY KEY AUTO_INCREMENT, customer_id INT NOT NULL, room_id INT NOT NULL, check_in_date DATE NOT NULL, check_out_date DATE, total_amount DECIMAL(8,2), status TINYINT DEFAULT 0 COMMENT 0进行中, 1已完成, 2已取消, FOREIGN KEY (customer_id) REFERENCES t_customer(id), FOREIGN KEY (room_id) REFERENCES t_room(id) ) ENGINEInnoDB;这段 SQL 的关键点有两个一是所有表都用 InnoDB 引擎支持事务和外键后面做订单提交时需要事务保证数据一致性二是订单金额不要用 FLOAT用 DECIMAL(8,2)否则累计多次订单后会出现精度误差这在答辩演示时很难解释。另外我加了字段注释因为 MySQL 的COMMENT会在数据字典里体现老师看设计文档时这是一个加分项。3. 用 MyEclipse 把工程搭起来从新建项目到能连上 MySQL3.1 新建 Web Project 时那三个必调的环境参数MyEclipse 是 Eclipse 的 Java EE 扩展版新建 Web 项目的入口在File - New - Web Project。这里有三处配置直接决定后面能不能跑起来很多人在这里就放弃了。第一是 Project Location 里的 Web Root 名字默认可能是web或WebRoot。这个目录名会出现在最终部署路径里比如部署到 Tomcat 后访问地址可能是http://localhost:8080/酒店项目名/。如果你起了中文项目名这里也会出现中文目录Tomcat 对中文路径的支持在不同版本表现不一致建议一律用英文字母。第二是 Java EE 版本。MyEclipse 不同版本默认的 Java EE 版本不一样如果你用的是 MyEclipse 2017 以上版本默认 Java EE 7对应 Servlet 3.1可以不写 web.xml 直接靠注解配置 Servlet。但课设里我还是建议保持生成 web.xml因为一方面你需要在里面配置欢迎页和 Servlet 映射另一方面如果老师要求画系统部署图web.xml 是现成的素材。第三是字符编码。这一步不做后面写中文注释、往 MySQL 里插中文数据全是乱码。新建项目时把项目的 Text File Encoding 设为 UTF-8JSP 页面第一行也写上% page contentTypetext/html; charsetUTF-8 %MySQL 连接 URL 里加上characterEncodingutf8。这三处编码保持一致中文问题基本就解决了一半。3.2 配置 web.xml 与 JDBC 驱动先跑通「Hello 数据库」工程建好后先别急着写业务页面。我的习惯是先做一个「连接测试」写一个 JDBC 工具类在浏览器里用一个 Servlet 输出数据库版本号。这样做的好处是如果环境有问题在写业务代码之前就暴露出来而不是等写了一百行增删改查后才发现连不上库。先放 web.xml配置欢迎页和第一个测试 Servlet?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 display-nameHotelManagementSystem/display-name welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list servlet servlet-nameDbTestServlet/servlet-name servlet-classcom.hotel.servlet.DbTestServlet/servlet-class /servlet servlet-mapping servlet-nameDbTestServlet/servlet-name url-pattern/dbTest/url-pattern /servlet-mapping /web-app这个配置要注意的是url-pattern里的斜杠。/dbTest是绝对路径访问地址是http://localhost:8080/项目名/dbTest。如果写成dbTest不带斜杠会被解析成相对路径在某些 Tomcat 版本下会直接 404。然后是 JDBC 连接工具类把连接 MySQL 的代码集中到一个类里管理package com.hotel.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/hotel_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new RuntimeException(MySQL 驱动加载失败, e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这个工具类有两个容易被忽略的细节。第一serverTimezoneAsia/Shanghai是 MySQL 8.x 必须带的参数因为 8.x 驱动要求时区必须明确。我用的是 MySQL 8.0.33 和 MySQL Connector/J 8.0.33 驱动不带这个参数会直接报The server time zone value Öйú±ê׼ʱ¼ä is unrecognized。第二Class.forName放在静态块里是因为 JDBC 4.0 以后虽然可以自动注册驱动但 MyEclipse 里的 Tomcat 在某些情况下类加载顺序会把驱动 jar 漏掉显式加载更稳妥。3.3 用连接池还是直接用 DriverManager课设怎么选才不翻车MySQL 连接池是面试常问的点但课设阶段要不要用我的建议很直接看你们课程进度。如果老师还没讲连接池直接用 DriverManager 就够了一个课设系统的并发量不会让连接成为瓶颈。但如果课程里讲了 C3P0 或 Druid那建议还是用连接池因为答辩时这是一个能聊的技术亮点。用连接池的代价是配置文件的复杂度。以 Druid 为例你需要一个druid.properties文件还要在工程里引入两个 jar 包。很多新手在做这一步时会把 jar 包放进WEB-INF/lib后忘记 Build Path导致运行时报ClassNotFoundException。我的做法是先把druid.jar复制到WEB-INF/lib然后右键项目 - Build Path - Configure Build Path - Add JARs两步缺一不可。如果直接用 DriverManager只需要把一个mysql-connector-java.jar放进 lib 目录省掉 Build Path 这一步。4. 把功能一行行写出来登录、客房列表与订单提交的完整链路4.1 登录页 JSP 与 Session 权限控制的写法登录是整个系统的入口。JSP 页面里需要一个表单提交到 LoginServletServlet 里查t_user表验证用户名密码再把用户对象放进 Session。% page contentTypetext/html; charsetUTF-8 languagejava % html head title酒店管理系统登录/title /head body form action%request.getContextPath()%/login methodpost label用户名input typetext nameusername/labelbr label密 码input typepassword namepassword/labelbr button typesubmit登 录/button /form %-- 这里显示登录失败的错误信息 --% span stylecolor:red${error}/span /body /html这里有一个很多教程不会强调的细节form的action路径应该用%request.getContextPath()%拼接而不是写死/hotel/login。因为项目名如果在部署时变了写死的路径直接失效。request.getContextPath()返回的是当前项目的根路径这样无论部署名改成什么表单都能正确提交。对应的 LoginServlet 核心逻辑package com.hotel.servlet; import com.hotel.dao.UserDAO; import com.hotel.entity.User; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { private UserDAO userDAO new UserDAO(); Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); User user userDAO.findByUsernameAndPassword(username, password); if (user ! null) { // 登录成功把用户放进 session并跳转到主页 request.getSession().setAttribute(currentUser, user); response.sendRedirect(request.getContextPath() /roomList); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); } } }注意登录成功用的是sendRedirect失败用的是forward。原因在于forward是服务器内部转发浏览器地址栏不变刷新时会重复提交表单造成重复插入数据sendRedirect会告诉浏览器发起新的 GET 请求刷新页面不会重复提交。这两个方法在面试里也是经常被一起问的点。Session 权限控制的思路是在roomList.jsp页面顶部加一段验证代码判断 Session 里有没有currentUser没有就跳回登录页。很多新手会把这段代码放进每个页面我建议抽成一个checkLogin.jsp公共文件然后在需要保护的 JSP 页面顶部用% include filecheckLogin.jsp %引入。这个include是静态包含会把被包含的代码原样复制到当前页面适合这种没有参数传递需求的场景。4.2 客房列表分页Servlet 里处理页码参数的常见做法客房列表是系统的核心展示功能数据量一旦超过几十条就必须分页。分页的设计涉及三个思考当前是第几页、每页多少条、总共有多少页。这三个值分别由浏览器参数、常量、数据库查询结果决定。常见的 URL 设计是roomList?page2。Servlet 里接收page参数注意要做空值处理int pageNum 1; String pageParam request.getParameter(page); if (pageParam ! null !pageParam.isEmpty()) { pageNum Integer.parseInt(pageParam); } int pageSize 10; int offset (pageNum - 1) * pageSize;这里Integer.parseInt有一个隐藏风险如果用户手动在地址栏里输入roomList?pageabc程序会直接抛NumberFormatException。虽然课设里一般不会有人恶意构造这种请求但答辩时如果老师手动改了 URL 测试你的容错能力你就得能答上来。稳妥做法是用 try-catch 包裹解析失败时默认第一页。DAO 层对应的分页查询 SQL 是SELECT * FROM t_room LIMIT ?, ?用 PreparedStatement 设置参数时LIMIT的两个参数分别是 offset 和 pageSize。这里有个 MySQL 的语法细节LIMIT后的两个参数都必须是整数不能是表达式所以LIMIT (page-1)*size, size这种写法会直接报语法错误必须在 Java 里先算出 offset 值。4.3 订单提交PreparedStatement 防注入与事务边界订单提交是最容易出现数据一致性问题的功能。用户在前台选中一间房填写客户姓名和手机号提交后系统要做三件事写入客户记录、写入订单记录、把房间状态改成已入住。这三件事必须在一个事务里完成否则可能出现订单写了但房间状态没改的情况。package com.hotel.dao; import com.hotel.entity.Order; import com.hotel.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class OrderDAO { /** * 创建订单并更新房间状态整个过程在一个事务内 */ public boolean createOrder(Order order) { Connection conn null; PreparedStatement psCustomer null; PreparedStatement psOrder null; PreparedStatement psRoom null; ResultSet rs null; try { conn DBUtil.getConnection(); // 关闭自动提交开启事务 conn.setAutoCommit(false); // 1. 先按手机号查客户不存在则插入 String findCustomerSql SELECT id FROM t_customer WHERE phone ?; psCustomer conn.prepareStatement(findCustomerSql); psCustomer.setString(1, order.getCustomerPhone()); rs psCustomer.executeQuery(); int customerId; if (rs.next()) { customerId rs.getInt(id); } else { String insertCustomerSql INSERT INTO t_customer(name, phone, id_card) VALUES (?, ?, ?); psCustomer conn.prepareStatement(insertCustomerSql, PreparedStatement.RETURN_GENERATED_KEYS); psCustomer.setString(1, order.getCustomerName()); psCustomer.setString(2, order.getCustomerPhone()); psCustomer.setString(3, order.getIdCard()); psCustomer.executeUpdate(); rs psCustomer.getGeneratedKeys(); rs.next(); customerId rs.getInt(1); } // 2. 插入订单 String insertOrderSql INSERT INTO t_order(customer_id, room_id, check_in_date, total_amount) VALUES (?, ?, ?, ?); psOrder conn.prepareStatement(insertOrderSql); psOrder.setInt(1, customerId); psOrder.setInt(2, order.getRoomId()); psOrder.setDate(3, new java.sql.Date(order.getCheckInDate().getTime())); psOrder.setBigDecimal(4, order.getTotalAmount()); psOrder.executeUpdate(); // 3. 更新房间状态为已入住 String updateRoomSql UPDATE t_room SET status 0 WHERE id ? AND status 1; psRoom conn.prepareStatement(updateRoomSql); psRoom.setInt(1, order.getRoomId()); int rooms psRoom.executeUpdate(); // 如果房间已经被别人订走影响行数为 0回滚事务 if (rooms 0) { conn.rollback(); return false; } conn.commit(); return true; } catch (SQLException e) { try { if (conn ! null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); return false; } finally { // 关闭资源先关 rs再关 ps最后关 conn try { if (rs ! null) rs.close(); } catch (SQLException e) { } try { if (psCustomer ! null) psCustomer.close(); } catch (SQLException e) { } try { if (psOrder ! null) psOrder.close(); } catch (SQLException e) { } try { if (psRoom ! null) psRoom.close(); } catch (SQLException e) { } try { if (conn ! null) conn.close(); } catch (SQLException e) { } } } }这段代码是整套系统的定海神针几个关键点值得反复看。第一setAutoCommit(false)之后所有 SQL 执行都只在本事务内可见必须在commit()后才真正生效。任何一步抛出异常rollback()都能把已执行的语句撤销。第二用手机号判断客户是否已存在避免了重复插入客户记录。这在真实场景里就是「老客户直接续住」的逻辑。第三更新房间状态时加了AND status 1从数据库层面防止同一间房被两个人同时订走。这是最简单的一种乐观锁虽然课设里并发量不高但这个设计思路在答辩时是亮点。5. 避坑与排查MyEclipse MySQL 开发里最常翻车的 5 个现场5.1 现象页面和数据库里全是中文乱码这是 JSP 开发里最经典的问题。页面显示的是问号MySQL 里存的是????控制台输出的日志也是乱码。原因有三个JSP 文件本身的编码不是 UTF-8MySQL 连接 URL 没带characterEncodingutf8数据库表默认字符集不是 utf8mb4。任何一个环节断掉中文就保不住。解决方法是把三层全部统一成 UTF-8。JSP 页面第一行写% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %MyEclipse 的项目编码和文件编码都改 UTF-8MySQL 连接 URL 加上characterEncodingutf8建库建表时显式指定 utf8mb4。最后在 MyEclipse 里选择Project - Clean重启 Tomcat 后再测试。很多时候改了代码不重启服务器乱码依旧。5.2 现象启动 Tomcat 后访问页面报 ClassNotFoundException 或 404java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver这个报错有两种触发时机第一次访问数据库相关页面时或者 Tomcat 一启动就报错。如果是启动就报错说明你的 jar 包没打进WEB-INF/lib。右键项目 - Properties - Deployment Assembly确认WEB-INF/lib在部署列表里。如果 jar 在却还是报错检查 jar 版本MySQL 5.x 驱动类是com.mysql.jdbc.DriverMySQL 8.x 驱动类是com.mysql.cj.jdbc.Driver两者的类名不一样写错就加载不了。404 的情况多半是 web.xml 里的url-pattern写错。曾经有个学生把/roomList写成了roomListServlet少了前置斜杠直接变相对路径Tomcat 找不到对应的 Servlet。这类问题最有效的排查方式是看 Tomcat 的localhost.log里面会明文打印请求映射失败的详细原因。5.3 现象MyEclipse 部署的项目总是访问不了MyEclipse 部署 Web 项目有自己的一套逻辑它会把项目发布到 Tomcat 的 webapps 目录但项目名是从 Deployment Assembly 里读的。如果你发现浏览器访问http://localhost:8080/酒店/roomList永远 404但http://localhost:8080/RoomWeb/roomList能通说明部署名和你以为的不一致。解决方法是双击项目里的Web Project Settings把 Context Root 改成你想要的路径。改完以后重启 Tomcat注意是真正停止再启动而不是点 Remove 后 Add。MyEclipse 有时会缓存旧的部署记录最彻底的做法是删掉 Tomcat 的 webapps 目录下对应文件夹同时清理 Tomcat 的work目录重启后问题基本能解决。5.4 现象分页点击第二页后数据是空的或者一直停留在第一页这个 bug 的根源通常是分页链接里没带上page参数或者参数名和 Servlet 里getParameter的不一致。一种典型错误是分页链接写成了?page%page%但 Servlet 里读的是currentPage两边名字对不上。另一种错误是LIMIT语句里用了LIMIT ? * 10这种表达式MySQL 语法根本不允许。排查思路很简单在 Servlet 方法第一行打印request.getParameter(page)看看能不能拿到值。5.5 现象MySQL 8.x 连接报 Public Key Retrieval is not allowed这个问题在使用 MySQL 8.x 时很常见报错信息是Public Key Retrieval is not allowed。原因是 8.x 默认的caching_sha2_password认证插件在某些场景下需要在连接 URL 里显式允许公钥检索。解决方法是连接 URL 加上allowPublicKeyRetrievaltrue注意要和useSSLfalse组合使用。完整地址类似jdbc:mysql://localhost:3306/hotel_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8allowPublicKeyRetrievaltrue有同学问过为什么本地连接不用加也能通这是因为本地驱动本地客户端走的是安全通道不需要走公钥交换。一旦部署到局域网另一台机器就会触发这个问题。6. 让系统更完整把登录、分页、事务串成一条可演示的闭环到这里核心链路已经通了。但课设如果想从「能跑」变成「能演示」我建议再补一个小功能在前台页面用 JavaScript 校验订单表单在提交前检查手机号位数和退房日期是否晚于入住日期。这个功能不需要改后端代码但演示时能明显减少「页面刷新后才发现日期填反了」的尴尬。做法是在orderForm.jsp里加一段简单的前端校验script function validateOrderForm() { var phone document.getElementById(phone).value; var checkIn document.getElementById(checkIn).value; var checkOut document.getElementById(checkOut).value; if (!/^1[3-9]\d{9}$/.test(phone)) { alert(请输入正确的手机号); return false; } if (new Date(checkOut) new Date(checkIn)) { alert(退房日期必须晚于入住日期); return false; } return true; } /script这段代码用正则限制了手机号格式前端拦截了一部分无效请求减轻了后端的异常处理压力。正则里\d在 JSP 中不需要转义直接写即可。我个人的习惯是把这个校验函数放在页面底部form的onsubmit事件里返回validateOrderForm()。如果返回 false表单不会提交返回 true 才走正常的 POST 流程。这也是做课设时第一次接触到「前端校验只是用户体验后端校验才是安全保证」的机会可以多在报告里提一句。做完这一步整个系统的功能就形成一个完整的业务闭环登录、看房、订房、改房态、管理端权限控制都有了。回顾我带的课设凡是最后能把这些细节写进报告的答辩时老师都会追问「如果我绕过前端校验直接 POST 怎么办」能答出「后端还有同步校验」的基本都能拿高分。希望这条 JSP MyEclipse MySQL 的路径能帮你少走几段弯路把课设稳稳落在地上。本文还有配套的精品资源点击获取
返回列表