ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JSP+Servlet+MySQL学生信息管理系统源码:课设高分改造指南

JSP+Servlet+MySQL学生信息管理系统源码:课设高分改造指南 简介一份基于JSP、Servlet与MySQL技术栈的学生信息管理系统完整项目适用于JavaWeb期末大作业、课程设计及学习参考。系统已完整实现学生信息维护、教师管理、登录注册、验证码校验、用户头像与个人信息展示等模块可满足基础教学管理场景。代码按servlet、dao、vo等层面清晰分层SQL数据库脚本可直接导入使用前端JSP页面配合CSS样式与JavaScript脚本形成完整交互流程整体结构规范适合初学者对照学习。压缩包内共82个文件包含20个Java源码、15个JSP页面、6个CSS样式、5个JavaScript脚本、3个Jar依赖库并附数据库脚本、说明文本及图片字体等资源整体体积约12.04MB。该项目已经老师指导并通过属于95分以上的高分设计作品目前已有627人学习下载。下载后可直接获得可运行源码、数据库脚本与配套说明文件能显著节省搭建环境和排查问题的时间是期末大作业或课程设计的实用参考。1. 学生信息管理系统源码JSPServletMySQL这条老技术栈为什么还没过时每到课程设计季总有人拿着“JSPServletMySQL”四处问能不能做学生信息管理网上给的要么是半成品要么缺数据库脚本。这份《学生信息管理系统源码数据库高分项目》的zip之所以经久不衰是因为它精准踩中了高校javaweb课程验收的全部要求用传统JSP作为页面层、Servlet当控制器、MySQL落数据三件套齐全没有Spring全家桶的黑匣子每一行代码都能在答辩时讲清楚。对于刚入门jsp没写过完整项目的学生以及需要一个“能跑、能改、能讲”的java课程设计案例源码的人来说这套结构就是最可靠的起点。别急着解压运行先花十分钟把目录、表和请求流转看懂后面所有改造都是在这条主线上加东西。2. 先读懂项目骨架目录结构、数据库表和请求流转2.1 拿到zip先不要解压运行先分辨war、src和SQL脚本解压后你通常会看到两种形态一种是已经编译好的war包一种是原始的Web工程目录。war包适合直接扔进Tomcat的webapps里验证效果但要交作业、改代码必须用后者。老式JSP项目的标准布局是src目录放Java源码Servlet、Service、DAO、entity、WebContent或webapp目录放JSP页面和静态资源、WEB-INF下面有web.xmlServlet映射和过滤器配置、lib目录里放着mysql驱动jar包根目录或db目录下会有一个.sql文件——这就是数据库脚本是整个项目能不能跑起来的地基。我第一次拿到这种课设包时上来就双击startup.bat结果页面一片空白最后发现是忘了导入student_db.sql数据库一张表都没有。所以正确顺序是先把SQL脚本导入MySQL再确认lib里有mysql-connector-java驱动再用IDEA或Eclipse打开工程最后启动Tomcat。这套顺序能帮你避免一半的启动报错。如果工程里没有lib目录驱动jar就得自己补装后面第4章会专门说这件事。2.2 MySQL建库建表学生表、用户表、成绩表的字段与约束学生信息管理系统的表设计不复杂但字段能不能扛住答辩提问是另一回事。常见做法是三张表t_user存放登录账号和角色t_student存放学生基本信息t_score存放成绩并和t_student做外键关联。数据库脚本一般类似下面这样CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE student_db; DROP TABLE IF EXISTS t_score; DROP TABLE IF EXISTS t_student; DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 用户ID, username VARCHAR(32) NOT NULL UNIQUE COMMENT 登录名, password VARCHAR(64) NOT NULL COMMENT 登录密码, role VARCHAR(16) NOT NULL DEFAULT student COMMENT 角色: admin/student, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB COMMENT系统用户表; CREATE TABLE t_student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学生ID, student_no VARCHAR(16) NOT NULL UNIQUE COMMENT 学号, name VARCHAR(32) NOT NULL COMMENT 姓名, gender VARCHAR(4) NOT NULL DEFAULT 男 COMMENT 性别, class_name VARCHAR(32) COMMENT 班级, phone VARCHAR(16) COMMENT 手机号, email VARCHAR(64) COMMENT 邮箱, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 录入时间 ) ENGINEInnoDB COMMENT学生信息表; CREATE TABLE t_score ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, subject VARCHAR(32) NOT NULL COMMENT 课程, score DECIMAL(5,1) NOT NULL COMMENT 成绩, exam_time DATE DEFAULT NULL, KEY idx_student (student_id), CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES t_student(id) ON DELETE CASCADE ) ENGINEInnoDB COMMENT学生成绩表;这里的几个参数值得细看。字符集用utf8mb4而不是utf8是因为utf8在MySQL里是utf8mb3存不了emoji学生信息里的特殊符号和生僻字会变成问号如果你用的是MySQL 5.7以上版本mysql设置默认值为0这种事也会在字段约束里体现比如gender用DEFAULT 男而不是靠业务代码补写。成绩字段用DECIMAL(5,1)是因为float和double有精度误差答辩时老师问“为什么成绩不丢精度”就能答上这一句。外键fk_score_student带了ON DELETE CASCADE意思是删除学生时成绩自动跟着删避免出现孤儿数据。很多低分课设为了省事不做外键答辩被追问“你怎么保证数据一致性”就卡住。这部分设计是你拿到源码后第一处能讲出深度的东西。导入脚本用Navicat或MySQL Workbench都可以记住要先用USE切换库再建表如果脚本里没有CREATE DATABASE你就得手动建一个同名库再导入。2.3 一次请求的生命周期JSP页面到Servlet、Service、DAO再回来看懂这个项目的运行逻辑比看懂每一行代码更重要。以后台登录为例用户在login.jsp填用户名密码点提交表单把数据POST到web.xml里映射好的LoginServletServlet的doPost被容器调用它取出request参数交给UserDao去查t_user表查到了就把用户对象塞进session然后重定向到首页查不到就forward回登录页并带一个error信息。这是最典型的JSPServlet请求流转没有任何花哨操作。这个过程中隐含了servlet生命周期的四个节点加载和实例化Tomcat启动时或首次请求时、init初始化、service处理请求、destroy销毁。答辩时你只需要说清楚init只执行一次用来读配置service根据请求方法分发到doGet或doPost整个生命周期由Tomcat容器管理不是在Servlet里new出来的。对应的JSP本质上也是一个Servlet第一次被访问时由JSP引擎翻译成Java类再编译执行——这句话说出来老师就知道你不是只会抄代码。搞清楚了请求怎么走后面所有改造都有着落了要加功能就加Servlet和Service方法要改页面就动JSP要加权限就在Servlet里判断登录状态。下一章直接进入落地环节把环境搭起来让项目在你电脑上先跑起来。3. 本地跑通项目JDK、Tomcat、MySQL的版本匹配与最小启动命令3.1 JDK与Tomcat版本搭配老项目对版本极其敏感JSP项目跑不起来八成是版本组合出了问题。这个zip是老式javaweb结构不是SpringBoot那种内嵌Tomcat的玩法所以JDK、Tomcat、Servlet API三者必须互相兼容。常见可用的搭配是JDK 8 Tomcat 8.5或9.0 MySQL 5.7如果你用JDK 11建议配Tomcat 9.0Servlet规范是4.0javax.servlet包名没变。最大的坑是Tomcat 10它把包名从javax.servlet改成了jakarta.servlet老项目编译直接报“程序包javax.servlet不存在”不要在这个版本上浪费一下午。我一般会先看web.xml的schema头里面写的版本号能反推项目用的Servlet规范。如果是2.5或3.0的老头老老实实配Tomcat 7或8如果是3.1Tomcat 9完全没问题。还有个小细节项目里如果引用了jstl标签库Tomcat 9默认不带JSTL实现要确认lib里有jstl-1.2.jar和standard.jar否则页面会出现“无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri”的报错。IDE里新建Tomcat Server时顺便检查lib目录比启动后报错再排查快得多。3.2 MySQL安装与初始化字符集、密码和驱动缺一不可MySQL安装教程网上很多但针对课设项目的核心需求只有三条安装时选utf8mb4字符集、记住root密码、启动MySQL服务。Windows下安装MySQL 8.0时安装器会让你选认证方式选第二个“Use Legacy Authentication”能避免老驱动连不上因为MySQL 8默认的caching_sha2_password认证对旧版mysql-connector-java不友好。如果你下载安装后发现连接报错“Unable to load authentication plugin caching_sha2_password”就去驱动jar上找原因或者把root用户的认证方式改回mysql_native_password。装好后用命令行验证连一次mysql -uroot -p验证的目的是区分“MySQL没启动”和“密码不对”两种报错。如果出现ERROR 2002 (HY000): Cant connect to local MySQL server through socket说明server根本没跑起来去服务管理器里启动mysql服务再试如果出现Access denied才考虑密码问题。导入SQL脚本时用source比如mysql -uroot -p student_db.sqlWindows下CMD里这种方式偶尔会因为编码问题导致中文注释乱码但数据表结构和数据通常没问题。导入完成后用SHOW TABLES看一下三张表都在才算完成。数据库的连接信息一般集中在项目的配置文件中常见的名字是db.properties、jdbc.properties或者直接写在JDBCUtil.java里下一节就动它。3.3 IDEA新建jsp项目与导入源码把老工程挂到Tomcat上很多新手卡在这idea新建jsp项目能用但导入别人的老工程就不知道怎么挂服务器。其实IDEA不需要你新建工程直接Open这个zip解压后的文件夹如果是纯JSP项目IDEA会识别出Web模块等右下角索引跑完在Project Structure里确认Project SDK选了JDK 8再确认Artifacts里有一个war exploded或者war包。接着配置TomcatRun/Debug Configurations里点加号选Tomcat Server LocalDeployment选项卡点加号添加刚才的ArtifactApplication context建议设成项目的上下文路径比如/student这样访问地址就是http://localhost:8080/student。这里有一步决定生死一定要检查WEB-INF/lib里有没有mysql-connector-java.jar。如果lib目录没有这个jar就需要右键选择Add as Library手动引入驱动。不引入驱动启动时不会报错等页面一提交登录就会秒抛ClassNotFoundException: com.mysql.jdbc.Driver到时候你又要回头找原因。检查完驱动再启动Tomcat看到控制台输出“Server startup in [xxx] milliseconds”才算成功。老项目还有一种特殊姿势传统jsp项目打包war然后直接丢到Tomcat的webapps目录下启动Tomcat自动解压部署。这种部署方式适合最后交项目时做演示不需要IDE甚至卸载掉IDE也能跑。命令很简单# 假设Tomcat在 /opt/tomcat9war包放在 webapps 目录 cd /opt/tomcat9/bin ./startup.sh # 等两三秒后看启动日志 tail -f ../logs/catalina.outstartup.sh是后台启动logs/catalina.out是核心日志出现Exception或Caused by都要仔细看。Windows对应的是catalina.bat run前台启动的好处是报错直接打在控制台排错阶段我一直用它确认没问题再改回startup后台模式。启动后curl验证一下HTTP响应头200就说明Tomcat起来了curl -I http://localhost:8080/student/能拿到HTTP/1.1 200再打开浏览器输地址项目就算在本机落地了。如果页面报404先检查上下文路径是否和Deployment里配置的一致这是最简单的翻车原因。3.4 数据库连接四要素JDBC URL的编码、SSL和时区跑通Tomcat还差最后一步确保Java能连上MySQL。连接配置一般长这样jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456参数说明driver这项MySQL 5.x驱动类名是com.mysql.jdbc.DriverMySQL 8.x必须写com.mysql.cj.jdbc.Driver写错会在Class.forName那里直接报ClassNotFoundException。url里的useUnicode和characterEncodingutf8是保证中文读写不乱码的标准组合useSSLfalse对应mysql jdbc usessl 与 sslmode 使用问题——本地开发无所谓不显式关闭的话MySQL 8客户端会默认尝试SSL握手遇到老驱动可能告警或失败。serverTimezoneAsia/Shanghai是MySQL 8的硬性要求不设这个会报“The server time zone value Öйú±ê׼ʱ¼ä is unrecognized”这种看着像乱码的时区异常。username和password必须和安装MySQL时设置的一致特别是root用户如果设了复杂密码注意转义特殊字符。这套配置改完项目启动和登录就不会再在“连接数据库”这一步翻车了。4. 核心改造成自己的登录、权限拦截和分页的关键代码细节4.1 登录Servlet的写法为什么doPost比doGet靠谱登录接口是唯一一个每位评委都会看的代码。一个标准的LoginServlet大致是这样WebServlet(/login) public class LoginServlet extends HttpServlet { private UserDao userDao new UserDao(); Override public void init() throws ServletException { // 加载配置或初始化资源整个生命周期只执行一次 super.init(); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); User user userDao.findByUsernameAndPassword(username, password); if (user ! null) { HttpSession session request.getSession(); session.setAttribute(loginUser, user); response.sendRedirect(request.getContextPath() /student/list); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); } } Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 直接访问/login时转发到登录页避免空白页面 request.getRequestDispatcher(/login.jsp).forward(request, response); } }逻辑说明doPost里第一行request.setCharacterEncoding(UTF-8)是解决POST乱码的关键放在取参数之前doGet单独做了处理直接访问登录地址不会抛405。登录成功后用sendRedirect重定向到列表页URL地址会变化刷新页面不会重复提交表单失败时用forward转发request里的error属性还能继续用。这里的init方法虽然没有写实际逻辑但保留了生命周期入口——答辩时你可以说自己用init加载过数据库连接池配置比裸eye的构造方法初始化更符合Servlet规范。4.2 数据库连接池别再用DriverManager裸连注意最大等待时间低分项目往往在DAO里写一个getConnection()就new一个连接用完不关页面稍微多点请求就卡死。高分项目的标准做法是引入数据库连接池常见的就Druid或C3P0。课设里最轻量的是Druid一个jar加上一个配置文件import com.alibaba.druid.pool.DruidDataSourceFactory; public class JdbcUtils { private static DataSource dataSource; static { try (InputStream in JdbcUtils.class.getClassLoader() .getResourceAsStream(druid.properties)) { Properties props new Properties(); props.load(in); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { throw new ExceptionInInitializerError(初始化连接池失败 e.getMessage()); } } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }druid.properties里的核心参数是下面这几个driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/student_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai usernameroot password123456 initialSize5 maxActive20 maxWait3000参数说明initialSize是池子初始化时就建好的连接数5个够用maxActive是池子里最多同时活动的连接数20是课设环境的稳妥值maxWait是拿连接的最大等待毫秒数3000毫秒超过这个时间拿不到连接会抛异常而不是无限卡住这是排查性能问题的第一道警示灯。注意连接池必须在静态代码块里初始化只做一次不能每次getConnection都new一个DataSource否则连接池等于摆设。4.3 分页查询的SQLLIMIT边界和总条数统计学生列表页几乎肯定会做分页这也是DAO层最常被问到的代码。分页需要两条SQL一条查当前页数据一条查总数核心逻辑如下-- 第pageNum页每页pageSize条pageNum从1开始 SELECT id, student_no, name, gender, class_name, phone, email, create_time FROM t_student ORDER BY id ASC LIMIT ?, ?;SELECT COUNT(*) FROM t_student;Java侧我用PreparedStatement边界条件是offset (pageNum - 1) * pageSize注意LIMIT的第一个参数是偏移量第二个是条数。这里最常见的翻车点有两个第一pageNum从页面传来时是字符串要Integer.parseInt前先判空否则非数字输入会抛NumberFormatException第二用户点“上一页”到负数页码时SQL不报错但查不出数据需要在Service层做clamp页码小于1强制改成1大于总页数强制改成总页数。统计总数时MySQL的COUNT(*)在InnoDB下是全表扫描数据量只有几千条时无所谓但答辩时你要能说出“如果数据量大可以单独建计数缓存或用覆盖索引优化”这句话证明你不是只会照抄。4.4 列表页与个人信息展示页EL表达式和JSTL替代Scriptlet很多老项目在JSP里直接写% %拼HTML这是课设评分的大扣分项。高分的做法是用EL表达式和JSTL标签循环输出jsp个人信息展示页面也靠这个实现。列表页核心片段% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table thead trth学号/thth姓名/thth性别/thth班级/thth操作/th/tr /thead tbody c:forEach items${page.list} varstu tr td${stu.studentNo}/td td${stu.name}/td td${stu.gender}/td td${stu.className}/td td a href${pageContext.request.contextPath}/student/edit?id${stu.id}编辑/a a href${pageContext.request.contextPath}/student/delete?id${stu.id} onclickreturn confirm(确定删除该学生吗)删除/a /td /tr /c:forEach /tbody /table说明${page.list}取自Servlet里request.setAttribute(page, pageData)EL表达式不需要getter方法名匹配但JavaBean的属性必须有对应getter。${pageContext.request.contextPath}动态拼上下文路径这样项目不管部署成/student还是根路径链接都不会断。c:forEach每遍历一次varstu就代表当前student对象。删除按钮上的onclick是前端二次确认防止手滑一条delete请求就把学生删了这是低成本的安全加成。JSP里不写Java代码看起来清爽答辩时说“我用了MVCJSP只负责展示”比“页面里全是% %”有说服力得多。下一页讲的是那些最掉链子的运行时问题先看现象再给解法。5. 避坑与排查JSPServlet项目最常见的5个翻车点5.1 页面中文全部乱码现象登录页正常但登录后列表页的学生姓名变成“信比SQL导入后也是乱码。原因三层编码不一致。页面响应没设置UTF-8、Servlet里没设置request编码、MySQL连接没加characterEncodingutf8这三处只要有一处不一致就会乱码。老项目中还有一个隐蔽坑Tomcat的GET请求参数默认用ISO-8859-1解码POST靠request.setCharacterEncodingGET必须改Tomcat的URIEncoding。解决先在Tomcat的server.xml里给Connector加URIEncodingUTF-8再在web.xml里配一个全局的CharacterEncodingFilter实现如下filter filter-nameencodingFilter/filter-name filter-classcom.example.filter.EncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping配合第4章的连接URL参数三处统一之后乱码绝迹。这个过滤器映射到/*覆盖所有Servlet和JSP请求是课设里性价比最高的“后悔药”。5.2 Tomcat启动报端口被占用现象启动时控制台出现“Port 8080 was already in use”或“java.net.BindException: Address already in use”。原因上一次启动的Tomcat没关干净或其他程序占用了8080端口。常见的是之前用catalina.bat run启动后直接关窗口Java进程还在后台。解决Windows下用netstat查占用进程netstat -ano | findstr :8080最后一列是PID记下来后到任务管理器里结束对应进程或者用命令taskkill /PID 1234 /FLinux用lsof -i:8080。如果想一劳永逸把Tomcat的HTTP端口改成8081在server.xml里把Connector的port改掉顺便把application context改成一个不撞车的名字。注意改完端口后访问地址也要跟着变。5.3 MySQL报ERROR 2002 (HY000)现象执行mysql -uroot -p时直接跳ERROR 2002根本不给你输密码的机会。原因MySQL服务没启动或者JDBC里的URL写的host/port和实际服务不匹配。Linux下还有个常见情况是MySQL装在另一台机器或Docker容器里socket路径不同导致本地客户端连不上。解决Windows去服务管理器启动MySQL80服务Linux用systemctl status mysqld查看状态然后systemctl start mysqld。如果Status里显示Failed去看MySQL错误日志重点看datadir目录权限和my.cnf里的socket路径。JAVA里如果连接的是远程MySQLurl要把localhost改成对应IP不能拿本地socket路径思维去套远程连接。5.4 ClassNotFoundException: com.mysql.jdbc.Driver现象Tomcat正常启动页面也出来了一提交登录表单就报这个类找不到。原因驱动jar没有真正进入运行时classpath。很多idea新建jsp项目时lib目录是空的驱动jar只是被IDEA以Library形式引用但war包构建时没有把jar打进去部署到Tomcat就找不到。如果是直接扔war到webapps就检查war里WEB-INF/lib有没有驱动。解决把mysql-connector-java-8.0.x.jar复制到项目的WEB-INF/lib目录IDEA提醒Add as Library就确认然后在Project Structure的Artifacts里确认WEB-INF/lib已经包含了这个jar。重新构建再部署一次问题消失。这步做完连接池里第4章的druid.jar也要一并放进去否则又会冒出Druid的NoClassDefFoundError。5.5 IDEA部署后404上下文路径与URL不匹配现象Tomcat启动成功控制台没报错但浏览器访问localhost:8080显示404或者访问localhost:8080/看不到项目首页。原因IDEA的Deployment里没有设置Application context或者设置了/student而项目里所有链接都是按根路径写的。解决在Run Configuration的Deployment页签里确认了Artifact后下面的Application context一定要填上下文名例如/student。然后访问http://localhost:8080/student/login.jsp。如果项目内部用绝对路径写死的方式去连Servlet就在所有地方统一使用${pageContext.request.contextPath}这是根治404的静默杀手。这条排查经验来自我第一次独立部署课设项目页面白屏整整浪费了一个晚上最后发现只是少了个斜杠。6. 让项目从“能跑”变成“高分”加分项清单与自测方法6.1 评审眼中的加分清单课设验收不只是看功能点全不全更看有没有“超出预期”的细节。这里列一份可以直接对着改的加分清单功能点加分做法常见低分配实现登录密码加密存储登录成功后进入session并做角色判断明文存数据库登录流程不区分管理员/学生增删改查学生删除用户外键关联的级联处理编辑时回显数据直接del by id无任何确认分页页码、总页数、上一页/下一页齐全LIMIT写死只有第一页参数校验学号格式、手机号正则、成绩范围0-100空值直接insert报错靠异常堆栈异常处理统一跳转error.jsp并打印友好提示500白屏没有任何提示数据库使用连接池字段有注释每次请求new连接表设计无注释密码加密是最容易的加分项在UserDao里查密码前对输入的密码做一次SHA-256或加盐MD5库里的密码也存加密后的值答辩时这就是一个完整的安全点。参数校验则兼顾前后端前端用正则拦截格式错误提交后端再检查一遍空值和长度这段代码可以直接写在Servlet入口处。6.2 自测路径照着验收流程走一遍项目改完后不要直接交给老师按下面路径自测先用管理员账号登录检查是否能跳转到学生列表依次新增加入一条中文姓名的数据看列表是否乱码编辑这条数据看表单是否回显删除时取消和确定各点一次确认删除逻辑正常然后退出登录直接访问列表页URL确认会被重定向回登录页——这个拦截逻辑是课设必问项。最后用MySQL Workbench看一下三张表的数据确认删除学生的同时成绩被级联删除。我自己的习惯是每次拿这份清单过一遍再在浏览器里按F12看Console有没有红色报错因为评分时老师也会看一眼。页面样式可以不用复杂但表单对齐、按钮反馈、空列表提示这三件事必须做到位。这套方案我从课程设计用到了毕业设计期间踩过的坑都写在前面几章里了照着做的话这套JSPServletMySQL的项目不仅能跑而且能在验收时讲得清清楚楚。希望帮到你。本文还有配套的精品资源点击获取
返回列表