ARTICLE DETAIL

资讯详情

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

JavaWeb电商后台课设实战:从环境搭建到答辩避坑

JavaWeb电商后台课设实战:从环境搭建到答辩避坑 简介基于JavaWeb的电商后台管理系统完整课程设计源码包面向需要完成JavaWeb课程设计、毕业设计或希望学习电商后台开发流程的高校学生与初级开发者。项目围绕电商后台管理的常见业务场景进行设计代码完整且运行环境配置说明清晰解压后借助文档即可部署使用。压缩包共62个文件包含34个Java源码文件、9个Vue前端页面、5个JS脚本、3个CSS样式表以及HTML、properties配置、图片和字体资源等整体约65.22MB源码内可看到src/main等标准JavaWeb工程结构前端页面与后端代码目录区分明确便于逐个模块阅读与二次开发。随附项目文档对功能设计和实现要点进行梳理可作为课程设计报告和答辩准备的参考资料。目前已有335人学习下载整体完成度高适合作为高分课程设计的蓝本或课外练手项目。1. 一份95分的电商后台课设背后拼的是工程完整性JavaWeb电商后台管理系统是JavaWeb课程设计里最经典的项目方向它把Servlet、JSP、MySQL、Session、过滤器这些知识点全部串起来做完既能交差也能在答辩时讲出东西。很多同学下载源码后卡在跑不起来或者跑起来不敢细说问题往往不在代码本身而在对环境、表结构和请求链路的理解。我见过太多人打开源码第一件事就是点运行结果Tomcat报错、数据库连不上、页面404最后只能换项目。其实这套源码按顺序拆开先建库、再配连接、再导IDEA、最后启动验证二十分钟足够跑通。适合正在做课程设计、毕业设计或者想补JavaWeb短板的初级开发者。下面我就按这个顺序把源码里的关键设计、运行步骤和答辩前要避的坑一次性讲清楚。2. JavaWeb课设的技术骨架Servlet/JSP MySQL的分工与选型2.1 为什么这套组合仍然是课设主流虽然现在企业开发基本是Spring Boot一统天下但JavaWeb课程设计的评分标准其实更偏向“基础知识是否扎实”。Servlet生命周期、请求转发和重定向的区别、Session和Cookie的工作机制这些在Spring Boot里被封装到看不见的问题在Servlet JSP项目里全都要自己写。评委老师看到你能说清楚这些比看到你贴一个大而全的Spring Cloud更放心。最常见的课设技术组合是JSP做页面、Servlet做控制层、DAOJDBC做数据访问、MySQL存数据。这套MVC形态虽然原始但分层清晰。有些拿到手的源码是用Maven建的SSM项目也就是Spring SpringMVC MyBatis逻辑也是一样的只是多层框架多配几个XML。你拿到的是前者直接按JDBC连接配如果是后者配置文件集中在resources目录下改数据库账号密码就行。2.2 数据库设计六张表撑起一个电商闭环电商后台管理系统说白了就是对“人、货、单”的管理。人是指后台管理员和前台普通用户货是商品和分类单是购物车和订单。一个能拿高分的课设数据库至少要覆盖六张表用户表t_user、商品分类表t_category、商品表t_product、购物车表t_cart、订单表t_order、订单明细表t_order_item。打开一份课设源码的SQL脚本结构基本都是这个路子。先建用户表和分类表再建商品表最后才建订单。外键约束在课设里可以用但要小心删除商品时如果有订单引用会直接报外键冲突。很多源码的做法是不设物理外键只在应用层做逻辑关联演示时更不容易翻车。核心建表语句如下注意字段类型和注释-- 用户表role区分后台管理员和前台用户 CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, -- 存MD5哈希值不存明文 real_name VARCHAR(20), phone VARCHAR(20), role TINYINT DEFAULT 1, -- 0管理员 1普通用户 create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 商品分类表课设里一级分类足够 CREATE TABLE t_category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, description VARCHAR(200) ); -- 商品表price用DECIMAL避免浮点误差 CREATE TABLE t_product ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL, -- 与分类表逻辑关联 name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0, image VARCHAR(200), -- 存图片文件名不是二进制 description TEXT, status TINYINT DEFAULT 1, -- 1上架 0下架 create_time DATETIME DEFAULT CURRENT_TIMESTAMP );这里有一个细节值得在答辩时主动提图片字段只存文件名或相对路径实际图片放在WebContent/upload目录里。这么设计有两个原因一是数据库体积不会膨胀二是JSP页面用${pageContext.request.contextPath}/upload/xxx.jpg直接就能访问不用写任何文件流代码。很多同学把图片存成BLOB大字段页面加载又慢又难调试这属于典型的过度设计。订单表建议把订单状态作为int字段0待付款、1已付款待发货、2已发货、3已完成、4已取消。答辩时老师几乎必问“订单状态怎么流转”一个int加枚举注释就能讲清楚。订单明细表单独建是因为商品价格可能变动下单时的单价必须作为快照留在明细里否则日后对账对不上。2.3 源码目录结构看懂层次再动手下载源码包解压后第一件事不是急着导入IDE而是先看目录。典型的JavaWeb课设项目结构有两种Eclipse风格和IDEA Maven风格。Eclipse风格Dynamic Web Project常见长这样src/ -- Java源码 com.xxx.dao/ -- 数据库访问层 com.xxx.service/ -- 业务层课设里有时合并到DAO com.xxx.servlet/ -- 控制层Servlet com.xxx.util/ -- 工具类DBUtil、MD5Util WebContent/ -- 静态资源和JSP WEB-INF/web.xml -- 部署描述符 admin/ -- 后台管理页面 index.jsp sql/shop_db.sql -- 数据库初始化脚本IDEA Maven风格则是src/main/java/ -- 同上包结构 src/main/resources/ -- 配置文件jdbc.properties等 src/main/webapp/ -- 相当于WebContent sql/ -- 数据库脚本很多同学卡在一个问题上为什么导入IDEA后找不到Tomcat运行入口。Eclipse项目导入IDEA时要选“Import Project”而非“Open”并在Project Structure里把Web模块的Web Root指到WebContent目录。如果是Maven项目等待pom.xml依赖下载完配置Tomcat后就能运行。拿到源码后先把web.xml或Servlet注解扫一遍数一下有几个Servlet分别对应哪些功能。比如看到/admin/product/list、/admin/product/add、/admin/order/updateStatus这几个URL心里就已经有一张地图。之后跑起来每个按钮能跳到哪个URL先有预期再动手调试时不会被报错牵着鼻子走。这里说的调用链是固定套路JSP页面发请求到ServletServlet取下参数、调DAO层方法拿到结果后要么转发回JSP回显要么重定向到列表页。把这条链记熟了几乎整个后台项目的代码你都能读得懂。3. 把源码跑起来IDEA Tomcat MySQL的完整操作链3.1 环境版本怎么配才不会翻车JavaWeb课设源码最大的痛点是版本兼容。常见组合如下表组件推荐版本说明JDK1.8老源码在JDK 9下JSP编译或反射可能报警告Tomcat9.0.x项目里用javax.servlet包Tomcat 10是jakarta命名空间MySQL5.7 或 8.0驱动类名不同URL参数也不同IDEA社区版即可旗舰版有Servlet插件但社区版一样能跑Tomcat版本是一个高频坑。如果源码web.xml头部声明的是Servlet 3.0或更低用Tomcat 9完全没问题如果项目里出现javax.servlet字样用Tomcat 10默认会找不到类因为Tomcat 10开始将包名改为jakarta.servlet。市面上绝大多数JavaWeb课设源码还在用javax所以保守选择Tomcat 9最稳。JDK也别贪新JDK 17配合Tomcat 9在课设场景下偶尔会出现JSP编译警告直接锁JDK 8能省掉大量玄学问题。MySQL版本上5.7和8.0差别在驱动类名。5.7用com.mysql.jdbc.Driver8.0用com.mysql.cj.jdbc.DriverURL里的serverTimezoneAsia/Shanghai也是8.0的硬性要求缺了会报时区错误。如果你的系统装的是8.0源码里写的还是老驱动去Maven仓库把mysql-connector-java的jar换掉即可。3.2 导入项目到IDEA的三个关键步骤操作不复杂但顺序错了报错一堆。第一步用IDEA的Open打开源码目录。如果目录下有pom.xmlIDEA会识别成Maven项目右下角开始下载依赖如果没有pom.xml就是个普通目录不要慌。第二步右键项目选择“Add Framework Support”勾选Web Application。这一步的作用是给项目补上WEB-INF/web.xml结构让IDEA把它识别成Web项目。很多教程忽略这一步结果是在运行配置里根本找不到Tomcat选项。第三步打开Project StructureCtrlAltShiftS把Project SDK设为1.8Language Level保持8。如果是Eclipse风格导入的项目还要在Modules面板里选中Web模块把Web Resource Directory指到WebContent目录再新增一个Artifacts打包成war exploded。做完这些点击IDEA右上角Add Configuration选Tomcat Server - Local配置好Tomcat路径后在Deployment面板里添加该项目的war explodedApplication context建议改成/shop。这样启动后访问地址就是http://localhost:8080/shop/。这里解释一下war和war exploded的区别。war是压缩包每次改页面都要重新打包调试极其痛苦war exploded是解压目录JSP一改马上生效Java代码改动需要重启Tomcat。课设开发阶段一律选war exploded别给自己找不痛快。3.3 数据库初始化与连接配置源码里的sql目录通常有shop_db.sql或db.sql直接用命令行导入mysql -u root -p shop_db.sql导入后进去数据库看一眼确认六张表都在管理员账号是否已初始化。很多源码自带初始管理员比如admin/123456但如果SQL脚本里没有需要手动插一条-- 课设项目里密码一般用MD5123456的MD5是e10adc3949ba59abbe56e057f20f883e INSERT INTO t_user(username, password, role) VALUES(admin, e10adc3949ba59abbe56e057f20f883e, 0);数据库账号密码的配置位置需要找一下。老项目写在DBUtil.java的static字段里Maven项目写在src/main/resources/db.properties里。把URL、用户名、密码改成你本机的值注意URL要带上编码参数jdbc.urljdbc:mysql://localhost:3306/shop_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的数据库密码serverTimezoneAsia/Shanghai是MySQL 8.0驱动的基本要求不加这一项连接时会直接报错。useSSLfalse是省掉证书验证课设环境完全够用。如果你用Navicat导入SQL记得导入前先在Navicat里新建一个名为shop_db的数据库编码选择utf8mb4再运行SQL文件。否则脚本里的CREATE DATABASE语句可能因为权限问题执行失败。3.4 第一次启动失败时先看哪里Tomcat启动时控制台报错别急着翻代码。按顺序排查先看Tomcat Localhost LogIDEA底部Run窗口有单独Tab。如果报严重: Failed to initialize end point说明8080端口被占用把IDEA配置面板里的HTTP port改成8081同时改一下JMX port即可快速绕开。再看有没有ClassNotFoundException。如果是com.mysql.jdbc.Driver说明MySQL驱动jar没放到WEB-INF/lib下或者Maven依赖没下载。老项目最容易漏这一步驱动jar是手动拷贝的换电脑后忘了放。最后看数据库有没有真正连上。很多报错堆栈很长但关键就一句Access denied for user rootlocalhost这是密码不对还有Unknown database shop_db这是SQL脚本没导进去。跑通一次后建议把启动顺序记下来启动MySQL、确认库里表齐全、启动Tomcat、访问登录页、用管理员账号登录。这个顺序后面自查也省心。4. 核心业务模块拆解从登录到下单的四个必经环节4.1 登录与会话管理Session与Cookie的分工登录是后台系统的第一道门。几乎所有课设源码里都有一个LoginServlet处理逻辑是从前端表单取username和password对密码做MD5调用DAO查数据库查到就把用户对象放进Session并跳转到后台首页查不到就回到登录页显示错误。WebServlet(/login) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); // 参数取出来先做非空判断避免空字符串也去查一次库 if (username null || password null || username.isEmpty() || password.isEmpty()) { request.setAttribute(error, 用户名和密码不能为空); request.getRequestDispatcher(login.jsp).forward(request, response); return; } User user userDao.findByUsernameAndPassword(username, MD5Util.md5(password)); if (user ! null) { // 登录成功把用户对象放进Session request.getSession().setAttribute(loginUser, user); response.sendRedirect(index.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } }这里有一个值得说的点为什么不直接拿明文密码去比对因为登录失败时如果前端日志或数据库查询记录把明文密码带出来就是安全隐患。MD5虽然是不可逆哈希但有彩虹表风险正规做法还应该加盐。就算源码里只做了裸MD5答辩时你补一句“生产环境会用BCrypt加盐这里是课设简化处理”老师就知道你懂边界在哪里。登录成功后Session里存了用户对象。Session存在服务器端浏览器里只有一个JSESSIONID的Cookie作为钥匙串。默认Session 30分钟过期过期后用户再点页面就会跳回登录页。判断逻辑最好统一写在过滤器里而不是每个JSP页面里都写一段session.getAttribute(loginUser) null判断。每个页面各写各的漏了一两个页面就会出现“登录了但进入某个模块还是被弹回”的怪问题。4.2 商品管理从JSP到Servlet再到DAO的完整链路商品管理是后台系统的核心也是CRUD最能出彩的地方。列表页用一个table展示所有商品提供“新增”“编辑”“删除”“上下架”操作每个操作对应一个Servlet URL。以删除为例有两个细节要注意第一是权限校验后台操作必须确认当前登录用户是管理员第二是删除成功后必须重定向防止刷新页面时重复执行删除。WebServlet(/admin/product/delete) public class ProductDeleteServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 过滤器统一做权限控制这里再取一次Session作为兜底校验 User admin (User) request.getSession().getAttribute(loginUser); if (admin null || admin.getRole() ! 0) { response.sendError(403, 无权限); return; } String idStr request.getParameter(id); // 非数字id直接回列表不抛异常打断演示 if (idStr null || !idStr.matches(\\d)) { response.sendRedirect(request.getContextPath() /admin/product/list); return; } int id Integer.parseInt(idStr); productDao.deleteById(id); // 用重定向而不是转发防止刷新时再次执行删除 response.sendRedirect(request.getContextPath() /admin/product/list); } }这段代码里我特意用了正则\\d来校验id参数。课设项目里经常看到直接Integer.parseInt(request.getParameter(id))如果URL被别人改成?idabc页面直接抛NumberFormatException白底红字的报错页会让答辩减分。一个正则判断就能挡住这类低级崩溃是性价比极高的习惯。新增和编辑商品常见做法是共用一个表单页面。表单提交到同一个ServletServlet里判断product对象有没有id有id就先查出来再set新值执行update没有id就new一个Product执行insert。这种方式减少页面重复但要注意表单里的隐藏字段input typehidden nameid value${product.id}漏掉它时新增和编辑就会混淆明明点编辑却插了一条新记录。商品上下架不需要单独开页面列表页放一个链接或按钮把status字段翻转一下就行。4.3 购物车与订单用状态机视角看订单流转购物车在课设源码里有两种实现方式存Session里的List或者存数据库t_cart表。前者实现简单适合纯前台演示后者能保留下单记录适合当加分项。很多后台管理系统其实不包含前台购物车它的“订单管理”是后台直接查看用户下单记录。如果源码里带前台购物车项目完整度会高一大截。订单的字段设计要注意金额类型total_price用DECIMAL(10,2)status用int存状态码。状态流转的视角在答辩时特别有用可以用一条线描述待付款(0) - 已付款(1) - 已发货(2) - 已完成(3) \- 已取消(4)后台订单管理的核心操作就是改状态。比如点击“发货”按钮把status从1改成2点击“取消订单”把status改成4注意只有待付款状态允许取消其他状态要加判断条件。如果源码里没有加这个判断你可以在SA层补上查出来状态不是0直接提示“该订单不可取消”。这种防御式编程课设里做出来一眼就能看出你思考过。订单明细表t_order_item为什么单独建表这是一对多的经典设计。一个订单对应多个商品但t_order里存的是订单总价具体买了哪些商品、单价多少必须落到明细表。否则下单后商品改价历史订单金额就对不上了。这种“把下单时的商品信息做快照”的思想能在答辩时说清楚绝对是加分项。4.4 过滤器与权限控制一个Filter管住所有后台请求后台管理系统的权限控制最简单可靠的方案是写一个LoginFilter过滤掉所有/admin/下的请求。核心逻辑就一段从Session里取loginUser取不到就跳转到登录页。WebFilter(/admin/*) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; // 用false拿到已有Session不自动创建新的 HttpSession session req.getSession(false); User user session null ? null : (User) session.getAttribute(loginUser); if (user null) { resp.sendRedirect(req.getContextPath() /login.jsp); return; } chain.doFilter(request, response); } }注意req.getSession(false)这个细节。默认的getSession()如果发现当前请求没有Session会自动创建一个过滤器拦截时如果用户根本没登录也会白白生成空Session增加内存开销。加false之后只有真正登录过的请求才拿得到已有Session算是一个可以在答辩时随手讲出来的优化点。如果要区分管理员和普通用户可以再加一个user.getRole() ! 0的判断或者把后台URL分成/admin/product和/admin/order两层分别配置过滤器。课设阶段一个过滤器管住登录状态一个过滤器管住管理员角色已经足够。过滤器这节是老师最喜欢的追问点之一因为很多源码只写了Servlet没有Filter你如果能在答辩时主动说“我把权限控制统一放在过滤器中Servlet里只做业务”这个工程意识的评价会明显高于单纯“跑通了功能”。5. 课设阶段的避坑指南这五个坑我踩过你别再踩5.1 中文乱码从JSP页面到MySQL的一整条链路现象页面显示正常但从表单提交中文到后台存进数据库后变成问号。原因一条链路问题。浏览器提交表单时用的编码、Tomcat解析请求参数的编码、数据库表的字符集任何一环不一致都会乱码。常见情况是JSP页面已经是UTF-8但Servlet里读取请求参数时用的还是ISO-8859-1MySQL表字段是utf8但连接URL里忘了加characterEncodingutf8。解决三个位置一起设。一是Servlet里读取参数前写request.setCharacterEncoding(UTF-8)二是连接URL带useUnicodetruecharacterEncodingutf8三是SQL脚本建库时明确DEFAULT CHARSETutf8。JSP页面头部也要有% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %。我见过只改两处、漏了过滤器的结果时好时坏重新部署后又乱了。最稳的做法是写一个CharacterEncodingFilter过滤所有请求统一设置编码一劳永逸。5.2 启动后404上下文路径和资源路径搞混了现象登录成功跳转后地址栏是http://localhost:8080/admin/index.jsp结果404但手动加上项目名后访问又正常。原因重定向时写了相对路径/admin/index.jsp。注意以斜杠开头的路径是服务器根路径不包含项目上下文名。如果你的项目名是shop实际地址应该是http://localhost:8080/shop/admin/index.jsp。漏掉上下文名Tomcat自然找不到。解决把response.sendRedirect(/admin/index.jsp)改成response.sendRedirect(request.getContextPath() /admin/index.jsp)。JSP页面里引CSS和JS也要注意要么用${pageContext.request.contextPath}拼要么在页面头部加base href${pageContext.request.contextPath}/。这个错误在课设里几乎百分百会出现练熟了能直接排掉一半的404问题。5.3 数据库连接失败驱动、URL、时区三件套现象启动Tomcat时一切正常一登录就抛SQLException: Access denied for user或Communications link failure。原因前者是账号密码或权限不对后者往往是驱动和URL不匹配。比如用MySQL 8.0驱动连接5.7库没有问题但用老驱动连接8.0库或者URL里写了serverTimezone但驱动版本太老不认识这个参数。解决确认驱动包版本和MySQL版本对齐。MySQL 8.0对应com.mysql.cj.jdbc.DriverMySQL 5.7对应com.mysql.jdbc.Driver。URL里useSSLfalse在5.7上只是warning但连接8.0时没有serverTimezone一定报错。有时候源码的账号密码写死在DBUtil里换电脑忘了改打印一下连接URL就能一眼看出来。课后排错时用Navicat先手动连一下同账号同密码能通说明数据库侧没问题问题一定在应用的URL或驱动上。5.4 刷新后重复删除GET与重定向的教训现象删除一条商品后按F5刷新商品又被删了一条下单成功后刷新订单多了一单。原因删除和下单都通过GET请求实现GET天然可被地址栏重放。刷新网页其实就是再次发起同样的GET请求Servlet又执行了一遍。解决所有写操作都用POST提交删除也改成表单submit方式如果坚持用GET必须在Servlet处理完后立刻重定向到列表页这样刷新时刷新的是结果页而不是操作接口。下单成功的页面一定用response.sendRedirect跳到一个新的“下单成功”JSP不能用forward。这个习惯形成后答辩时讲“幂等性”也有素材。5.5 图片上传后不显示相对路径与服务器目录的坑现象后台选图片保存成功列表页图片框是个裂图检查数据库字段里也有文件名。原因图片确实存到了服务器磁盘但JSP页面拼的路径不对。常见错误是写成/upload/xxx.jpg少了项目上下文或者图片存在了IDEA编译后的target目录之外Tomcat访问的war解压目录和源码目录不是同一个地方。解决先确认Tomcat实际访问哪个目录。IDEA里war exploded会把WebContent目录作为Web资源根目录图片应该保存在这个目录下的upload子目录里保存时用相对路径而不是C:\...的绝对路径。页面里用img src${pageContext.request.contextPath}/upload/${product.image}访问。另外注意磁盘目录权限Linux环境下一旦upload目录不存在且无法创建保存就会报错Servlet里记得先new File(uploadPath).mkdirs()。之前帮别人排过一个图片间歇性不显示的案例最后发现是Tomcat被重启之后运行目录换到了另一个临时路径老图片全部找不到了。6. 答辩前的自检用一份验收清单稳住分数6.1 核心功能自检清单答辩前不要背功能手册要按“演示流程”过一遍。我建议的路径登录页面打开管理员账号登录进后台新增商品分类新增商品并上传图片商品列表看到新商品修改商品价格下架商品删除商品。这八步覆盖了登录、Session、CRUD、文件上传、列表查询是后台管理的最小闭环全程不超过三分钟。特别注意MySQL服务先启动别到现场打开IDEA发现数据库没起来浏览器用无痕模式打开排除Cookie残留干扰管理员账号密码写在SQL脚本或文档里当场找不到密码会很尴尬。6.2 演示时的三个加分动作不要全程点点点演示中穿插讲三句话。点删除时说“这里用POST提交并重定向到列表防止刷新时重复删除”看订单列表时说“订单状态用int字段存状态码每次改状态同时记录更新时间”翻到数据库表时点一下t_order_item说“订单明细单独建表是为了在商品改价之后还能还原下单时的快照”。这三句话能把答辩从“做了个管理系统”拉升到“理解了关键设计”。老师追问也不要慌高频问题无非围绕Session失效、数据库事务、密码加密三个点。Session失效就答“过滤器拦截无会话跳登录页”事务就答“下单时扣库存和生成订单要在Service层包进同一个Connection失败就rollback”密码加密就按前面说的加盐BCrypt扩展回答。6.3 一个让我少踩很多坑的习惯我每次拿到一套课设源码不是先急着跑而是先用SQL脚本把数据库建出来然后扫一遍web.xml或Servlet注解把URL和对应功能全部列成一张表。这张接口地图贯穿整个调试过程后端报错时看路径是不是在表里前端跳错时也能快速定位。这个习惯帮我省掉了大量瞎改的时间也让我在答辩时对每一个按钮背后的Servlet了如指掌。如果你拿到源码还绕不开版本兼容的坑建议顺手做一件事JDK锁1.8Tomcat锁9.0MySQL驱动版本和数据库版本对应。项目跑通之后再考虑换新框架跑不通之前一切美化都是空的。希望这篇笔记能帮你把课设稳稳拿下也希望你在跑通之后愿意花点时间把每一段代码看懂那才是这95分真正值钱的地方。本文还有配套的精品资源点击获取
返回列表