ARTICLE DETAIL

资讯详情

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

JSP+SqlServer网上购物系统开发详解:从建表到部署的完整实践指南

JSP+SqlServer网上购物系统开发详解:从建表到部署的完整实践指南 简介基于JSPSqlServer的网上购物系统设计与实现资源包面向计算机相关专业学生完成毕业设计、课程设计或大作业也适合入门级开发者作为首个全栈项目进行学习。包内提供完整源代码与配套论文覆盖购物车、图书选购、订单处理等典型电商模块前端以JSPHTML页面为主并配有大量GIF图片素材数据库备份、Java类文件及JSP备份文件可帮助理解SQL Server表结构、业务逻辑与编译运行细节同时配有购物车、图书购买等页面的交互演示便于直观对照流程亦可用作课程报告或答辩说明的参考素材。资源压缩包共108个文件大小642KB包含37个JSP页面、6个HTML页面、53个GIF图片、论文文档及配置与类文件等目录结构紧凑便于按功能定位代码。目前已有101人学习下载适合需要一套可运行、可讲解的完整案例用于快速搭建原型、梳理业务流程并辅助论文撰写与答辩展示。1. JSPSqlServer网上购物系统是什么一个能跑通全流程的Java Web原型看到“基于JSPSqlServer的网上购物系统”这个标题我第一反应是“又有人要把 Java Web 的一整条链路亲手跑一遍了”。它不是一个花哨的前后端分离项目而是典型的传统 Java Web 原型JSP 写页面Servlet 控流程SqlServer 管数据和事务三者串成一个最小的电商闭环。这个系统能解决的实际问题是让一个只写过课程小 demo 的人能在同一套代码里看到注册登录、商品展示、购物车、生成订单、后台管理这些完整业务而不是背一堆框架概念。它尤其适合两类人需要以“源代码论文”完成毕设的在校生以及想补传统 Web 基础、之后再去啃 Spring Boot 的转行者。下面我按开发顺序把表结构、连接、核心代码、部署和坑位一次讲完。2. 数据库与JDBC层用SqlServer把购物系统的表结构和连接先打牢我拿到任何一套 JSP 项目源码都不会先翻 Servlet而是先找 .sql 脚本。购物系统的表不多但由“用户-商品-订单”这条主线展开的表关系一旦乱后面所有查询都会跟着乱。下面这套建表结构是我觉得改动最小、又足够支撑完整业务的版本。2.1 用户、商品、购物车、订单四张核心表先按这个建-- 用户表避免使用 user 关键字用 shop_user CREATE TABLE shop_user ( id INT IDENTITY(1,1) PRIMARY KEY, username NVARCHAR(50) NOT NULL UNIQUE, password NVARCHAR(64) NOT NULL, nickname NVARCHAR(50), phone VARCHAR(20), address NVARCHAR(200), create_time DATETIME DEFAULT GETDATE() ); -- 商品分类 CREATE TABLE category ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50) NOT NULL ); -- 商品表价格用 decimal不要用 float CREATE TABLE goods ( id INT IDENTITY(1,1) PRIMARY KEY, category_id INT NOT NULL, name NVARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, image_url NVARCHAR(255), description NVARCHAR(MAX), CONSTRAINT FK_goods_category FOREIGN KEY (category_id) REFERENCES category(id) ); -- 购物车 CREATE TABLE cart ( id INT IDENTITY(1,1) PRIMARY KEY, user_id INT NOT NULL, goods_id INT NOT NULL, quantity INT NOT NULL DEFAULT 1, CONSTRAINT UQ_cart_user_goods UNIQUE (user_id, goods_id), CONSTRAINT FK_cart_user FOREIGN KEY (user_id) REFERENCES shop_user(id), CONSTRAINT FK_cart_goods FOREIGN KEY (goods_id) REFERENCES goods(id) ); -- 订单主表 CREATE TABLE orders ( id INT IDENTITY(1,1) PRIMARY KEY, order_no NVARCHAR(32) NOT NULL UNIQUE, user_id INT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status TINYINT NOT NULL DEFAULT 0, create_time DATETIME DEFAULT GETDATE() ); -- 订单明细保存下单那一刻的商品名称与价格这是快照不能回表查 goods CREATE TABLE order_item ( id INT IDENTITY(1,1) PRIMARY KEY, order_id INT NOT NULL, goods_id INT NOT NULL, goods_name NVARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, quantity INT NOT NULL, CONSTRAINT FK_order_item_order FOREIGN KEY (order_id) REFERENCES orders(id) );逻辑上一张订单对应多条order_item。order_item里冗余goods_name和price是为了防止商品改名或调价后历史订单金额跟着变。购物车表加了unique(user_id, goods_id)同一个用户对同一个商品只维护一行重复加购时只更新数量。字段类型上凡是金额和数量都用decimal和int后面做价格区间筛选时才不会出现“sqlserver 字符串转数字”的运行时错误。如果你拿到的 .sql 脚本里goods.price是nvarchar或varchar先换成decimal(10,2)再继续。这一步可以在动手看代码前就排除掉一个最容易引爆的问题。2.2 SqlServer 安装与连接配置先开 TCP/IP再谈登录SQL Server 安装好之后第一件事不是建表而是打开“SqlServer配置管理器”。在“SQL Server 网络配置”里找到当前实例把 TCP/IP 协议启用默认端口保持 1433。如果只装数据库不开 TCP/IPTomcat 在虚拟机或另一台机器上永远连不上这是很多项目第一次启动就翻车的直接原因。登录认证建议在安装时选择“混合模式”也就是 SQL Server 身份验证和 Windows 身份验证都要开。Tomcat 在 Windows 上以系统服务启动时登录身份未必是你当前桌面用户用 Windows 认证经常会碰到“Login failed for user”这类玄学问题。我一般直接用 sa 账号或者单独建一个shop_user数据库账号。需要注意sa 密码不要留空也不要带分号和 这类与连接串冲突的字符。如果密码确实有特殊字符把账号密码放到db.properties文件里用 Properties 读取不要在 Java 代码里硬编码。-- 如果 sa 被禁用先启用并重置密码 ALTER LOGIN sa WITH PASSWORDDemo123, CHECK_POLICYOFF; ALTER LOGIN sa ENABLE;这段 SQL 适合在刚安装好的开发机上执行。CHECK_POLICYOFF可以跳过 Windows 密码复杂度策略避免设置123456这类简单密码被拒绝。正式环境不要这么做开发和学习场景下能少一个拦路虎。2.3 JDBC 驱动与连接串驱动 jar 放对位置再说连接池package com.shop.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER com.microsoft.sqlserver.jdbc.SQLServerDriver; private static final String URL jdbc:sqlserver://localhost:1433;DatabaseNameshop;encryptfalse;trustServerCertificatetrue; private static final String USER sa; private static final String PASSWORD 你的数据库密码; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new RuntimeException(缺少SQLServer JDBC驱动请把 sqljdbc-x.x.jar 放到 WEB-INF/lib 下, e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }连接串里几个参数值得说明。encryptfalse是 SQL Server JDBC 驱动在较新版本里的要求否则连接 2019 及以上版本时会因为 SSL 握手失败报一堆看不懂的错trustServerCertificatetrue配合encryptfalse使用让本地开发环境不需要额外配置证书。DatabaseNameshop要和数据库名完全一致大小写不敏感但拼写不能错。localhost:1433可以写成serverNamelocalhost;portNumber1433两种写法等价。参数示例说明serverNamelocalhost数据库主机地址远程部署时换成 IP 或域名portNumber1433SqlServer 默认端口改过端口要同步修改DatabaseNameshop登录后默认连接的库名encryptfalse本地开发关掉加密减少 TLS 相关报错trustServerCertificatetrue信任自签名证书避免证书校验失败这套代码里直接用DriverManager是为了让事务边界更直观。到后面做下单时一个Connection能贯穿多张表的操作比一上来就引 HikariCP 或 DBCP 更不容易把新手绕晕。连接池切换其实成本很低核心替换点是getConnection()方法业务代码不用大改。3. 核心交易链路用ServletJSP完成登录、分页、购物车与下单传统 JSP 项目的分层我一般按“JSP 页面 - Servlet 控制器 - DAO 数据访问”来拆。业务逻辑尽量往 DAO 或 Service 里放JSP 页面里不写 Scriptlet。这么做的原因很实际JSP 一旦混入复杂 Java 代码改样式的人看不懂业务改业务的人嫌样式碍事一个购物系统能活活写出两套维护成本。3.1 登录流程与 Session从 LoginServlet 到个人信息展示页面WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); UserDao dao new UserDao(); User user dao.findByUsernameAndPassword(username, password); if (user null) { // 登录失败回到登录页并带上错误参数 resp.sendRedirect(login.jsp?error1); return; } req.getSession().setAttribute(user, user); resp.sendRedirect(index.jsp); } }登录成功后用sendRedirect而不是forward是为了防止用户刷新页面时把同一份表单重复提交。Session 里存的是User对象后续个人中心和购物车都能直接从 session 取用户 ID。这个设计很常规但它决定了“个人信息展示页面”怎么读取数据。在userinfo.jsp里我一般直接用 EL 表达式展示而不是% out.println(...) %% page contentTypetext/html;charsetUTF-8 % p欢迎${sessionScope.user.nickname}/p p手机号${sessionScope.user.phone}/p p收货地址${sessionScope.user.address}/pEL 表达式在 session 里取不到值时会输出空白不会像 Scriptlet 一样直接把异常抛到页面上。JSP 是模板不是业务层这个习惯能帮你在写论文时把“表现层”和“业务层”的边界讲得更清楚。密码字段我建议至少用 MD5 加盐存不要明文存库这不是性能问题是论文查重时一眼就能看出的低级设计。3.2 商品列表与分页SqlServer 用 OFFSET/FETCH 而不是 LIMITMySQL 用LIMIT ? , ?但 SqlServer 不支持这是刚转过来的新手最常犯的错。SqlServer 2012 及以上版本的标准分页写法是OFFSET ... FETCH。public ListGoods findPage(int page, int pageSize) throws SQLException { String sql SELECT id, category_id, name, price, stock, image_url FROM goods ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, (page - 1) * pageSize); ps.setInt(2, pageSize); try (ResultSet rs ps.executeQuery()) { ListGoods list new ArrayList(); while (rs.next()) { Goods g new Goods(); g.setId(rs.getInt(id)); g.setCategoryId(rs.getInt(category_id)); g.setName(rs.getString(name)); g.setPrice(rs.getBigDecimal(price)); g.setStock(rs.getInt(stock)); g.setImageUrl(rs.getString(image_url)); list.add(g); } return list; } } }page从 1 开始但OFFSET从 0 开始所以偏移量计算是(page - 1) * pageSize。除了列表还要一条SELECT COUNT(*) FROM goods算出总记录数才能在页面上生成页码。如果数据库是 SqlServer 2008不能用 OFFSET/FETCH改成ROW_NUMBER() OVER (ORDER BY id)包一层子查询。商品列表页还有一个容易忽略的点价格区间筛选。前端input nameminPrice拿到的是字符串直接拼进 SQL 会被注入或报“字符串转数字”错误。正确做法是用BigDecimal min new BigDecimal(request.getParameter(minPrice))转成数字再传给 PreparedStatement 的setBigDecimal。所有参数都走 PreparedStatement 占位符这个习惯几乎能规避掉一半的报错。3.3 购物车、订单与事务价格必须从数据库读购物车可以放 Session也可以放数据库表。课程项目通常用数据库表因为它能体现外键关系和 SQL 更新逻辑论文里也好画 ER 图。加入购物车最常见的 SQL 逻辑是先查存在不存在存在就加数量不存在就插入IF EXISTS (SELECT 1 FROM cart WHERE user_id ? AND goods_id ?) UPDATE cart SET quantity quantity ? WHERE user_id ? AND goods_id ? ELSE INSERT INTO cart(user_id, goods_id, quantity) VALUES (?, ?, ?)这段逻辑放在CartDao里用 PreparedStatement 按顺序设置参数。SqlServer 2016 以上可以用 MERGE 一句写完但 MERGE 在课程答辩时不如 IF EXISTS 好解释可读性也差一些我一般不强求换。真正考验功底的是下单。下单要同时操作四张表orders 插入主记录、order_item 插入明细、goods 扣库存、cart 清空购物车。任何一个失败整个订单都应该回滚。public void createOrder(int userId) throws SQLException { Connection conn DBUtil.getConnection(); ListCartItem items cartDao.findItemsByUser(conn, userId); conn.setAutoCommit(false); try { String orderNo UUID.randomUUID().toString().replace(-, ).substring(0, 16); BigDecimal total BigDecimal.ZERO; for (CartItem item : items) { // 价格以数据库商品表为准不用页面提交的金额 total total.add(item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); } int orderId orderDao.insert(conn, orderNo, userId, total); for (CartItem item : items) { orderItemDao.insert(conn, orderId, item); goodsDao.updateStock(conn, item.getGoodsId(), item.getQuantity()); } cartDao.clearByUser(conn, userId); conn.commit(); } catch (SQLException e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); conn.close(); } }事务的关键是这个conn必须从 Service 层传到 DAO而不是每个 DAO 内部各自getConnection()。如果 DAO 内部每次新建连接事务就完全失效了。orderDao.insert返回自增主键底层要用PreparedStatement.RETURN_GENERATED_KEYS这样才能把 order_id 带给 order_item。价格和库存都以数据库当前值为准前端页面上显示的单价只能用作展示不能参与后端计算。扣库存这条更新语句最好写成条件更新防止超卖UPDATE goods SET stock stock - ? WHERE id ? AND stock ?stock ?这个条件会保证库存不够时不更新并且返回值是 0 行程序可以据此判断库存不足。这是多用户并发时最便宜的兜底方案。3.4 后台管理与图片上传相对路径的正确姿势后台无非是分类管理、商品上下架、订单状态修改这三块。商品管理里最容易出错的是图片上传。很多课程项目把图片保存到本地磁盘的绝对路径比如D:/upload/xxx.jpg然后把完整路径存进数据库。问题是页面上img srcD:/upload/xxx.jpg浏览器根本不认。正确做法是把图片写到 Web 应用的upload目录下数据库只存upload/xxx.jpg这种相对路径页面展示时再拼上下文路径String uploadDir getServletContext().getRealPath(/upload); String fileName System.currentTimeMillis() _ part.getSubmittedFileName(); part.write(uploadDir File.separator fileName); goods.setImageUrl(upload/ fileName);getRealPath(/upload)返回的是 Tomcat 里这个应用的实际物理目录图片落到这里后才能被 Web 容器直接访问。文件名加时间戳前缀是为了避免不同用户上传同名文件互相覆盖。如果项目里已经用了 Commons-FileUpload替换成Part接口的写法也是兼容的只是返回值略有不同。4. 传统JSP项目的部署与打包war包、Tomcat与Nginx代理很多新手在 IDEA 里点了绿色三角能跑通但换到服务器上就一脸懵。JSP 项目部署的痛点和 Spring Boot 不一样Spring Boot 一个 jar 跑起来传统 JSP 项目要先把“源代码论文”里的源代码变成标准 war 包再交给 Tomcat。4.1 IDEA/Eclipse 打包 war 包检查 WEB-INF/lib 是否带全IDEA 打包 war 的常见路径是File - Project Structure - Artifacts新增一个Web Application: Archive名字比如shop.war。然后在菜单栏Build - Build Artifacts - Rebuild产物会在 out/artifacts 目录下。Eclipse 则是右键项目Export - WAR file。war 包本质上是个 zip打包后第一件事是用jar命令检查依赖jar tf shop.war | grep WEB-INF/lib这条命令的输出里必须有sqljdbc-x.x.jar否则发布到服务器后必然报ClassNotFoundException。很多人打包后本地能跑是因为 IDEA 在编译期把 jar 加到了 classpath但 war 包里的WEB-INF/lib是空壳等于把粮草留在家里、人去了前线。还需要确认src/main/webapp/WEB-INF/web.xml存在。即使 Servlet 用注解web.xml 也可以是空的描述文件但它决定了这个 war 是不是合法的 Web 应用。4.2 部署到 Tomcat 并连接 SqlServer日志和驱动版本决定成败把shop.war丢进tomcat/webapps/目录启动startup.bat。Tomcat 会在启动时自动解压 war。如果没解压检查conf/server.xml里 Host 的unpackWARs是不是true。启动后要看两类日志。第一类是 Tomcat 自身的logs/catalina.日期.log第二类是应用抛出的异常堆栈通常也写进同一个文件。搜Caused by能最快定位底层原因。如果日志里出现“此驱动程序版本不支持你使用的服务器版本”之类的信息说明 sqljdbc 太老去微软官网下载对应 SqlServer 版本的 JDBC 驱动替换 jar 后重启。驱动 jar 放在WEB-INF/lib和放在tomcat/lib效果不一样。放tomcat/lib是全局共享多个应用如果依赖不同版本会互相干扰放WEB-INF/lib只对当前应用生效这是部署单个项目的更安全选择。4.3 用 Nginx 给 JSP 做反向代理Nginx 不解析 JSPTomcat 才解析“nginx 支持 jsp 吗”是我被问过很多次的问题。Nginx 本身不解析 JSP它只能处理静态文件和转发请求。JSP 文件的编译和响应由 Tomcat 完成Nginx 只是把 HTTP 请求转发给 8080 端口。常见配置是 Nginx 监听 80动态请求代理到 Tomcatserver { listen 80; server_name shop.example.com; location /shop/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }proxy_pass后面不再追加路径保持http://127.0.0.1:8080的写法这样/shop/开头的请求会完整转给 Tomcat。如果加了proxy_pass http://127.0.0.1:8080/shop/路径会被二次拼接很容易出现 404。配置完成后要nginx -s reload生效。如果访问页面后 Session 总是丢失检查proxy_set_header Host是否正确Tomcat 的 Session Cookie 默认按域名绑定。5. JSPSqlServer项目的5个高频坑现象、原因与解决下面这几条坑是我帮人调这种“源代码论文”项目时总结出来的高频故障。每条都按“现象 - 原因 - 解决”的顺序写方便你对照排查。5.1 部署后报 ClassNotFoundException驱动 jar 根本没进 WEB-INF/lib现象Tomcat 启动日志报java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver或者浏览器页面直接抛 500。原因最可能的不是代码问题而是 jar 包没被打进WEB-INF/lib。很多新手在 IDEA 里建项目时把 jar 放在外部 lib 目录IDEA 编译能通过但打 war 包时没有把外部依赖引入 Artifacts。解决打开Project Structure - Artifacts在输出目录里手动添加lib文件夹并把 sqljdbc jar 选进去。然后重新打 war用第 4 章的jar tf命令复核。这个坑最大的迷惑性是本地跑得好好的一换环境就崩。5.2 价格字段报“字符串转数字”错误建表时就在埋雷现象后台按价格排序或按价格区间查询商品时报将 varchar 转换为数据类型 numeric 时出错更隐蔽的是下单总价算出来变成100510这种拼接结果。原因数据库表设计时把price字段建成了varchar或nvarchar。JSP 页面传上来的价格是字符串DAO 里又用了100 5这种字符串拼接数字运算就变成了文本拼接。金额和数量永远不该用字符串存这不是查询性能问题是语义错误。解决表结构改成price DECIMAL(10,2)后端用BigDecimal.valueOf(Double.parseDouble(...))转换如果库已经被脏数据污染先用TRY_CONVERT(DECIMAL(10,2), price)清洗出非法值再改字段。这条坑在新建项目时最容易避免却也是最常见的返工点。5.3 页面中文全变问号编码问题不只是 jsp 顶部加一行现象JSP 页面在浏览器打开是中文提交表单后写入数据库变成???或者页面本身显示就是乱码。原因多层编码不一致。JSP 文件保存时是 UTF-8但页面声明是 GBK或者 Servlet 里没调setCharacterEncoding(UTF-8)导致request.getParameter拿到乱码。SqlServer 建库时排序规则如果不是Chinese_PRC_CI_AS即使 Java 侧编码正确数据库存储时也可能发生隐式转换。解决三联操作。JSP 页面顶部写% page contentTypetext/html;charsetUTF-8 %在 web.xml 里配一个 CharacterEncodingFilter强制所有请求和响应用 UTF-8建库时显式指定排序规则COLLATE Chinese_PRC_CI_AS。做完这三步再测试不要只改一处。5.4 sa 登录失败不是密码错是认证模式和协议没开现象SSMS 能连数据库但 Tomcat 启动后日志报Login failed for user sa或者连接时提示端口 1433 无响应。原因SqlServer 安装时选了“仅 Windows 身份验证模式”sa 根本没启用或者 TCP/IP 协议在配置管理器里是禁用状态。sa 账号在 SQL Server 身份验证模式下被禁用时SSMS 内用 Windows 认证进去看不出异常应用一用 SQL 认证就翻车。解决在 SSMS 中执行EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 0;然后把服务器属性里的“身份验证模式”改成混合模式确认 sa 不是禁用状态重启 SqlServer 服务。再用ALTER LOGIN sa WITH PASSWORD你的密码重设密码。如果网络层连不上检查配置管理器里的 TCP/IP 是否已经启用。5.5 改完 JSP 不生效Tomcat 的 work 缓存比浏览器缓存更顽固现象修改 JSP 文件后重新打 war 发布浏览器强制刷新还是旧页面感觉像代码没改。原因Tomcat 不会直接运行 JSP 源码而是先把 JSP 编译成 Servlet 再执行。编译产物缓存在work/Catalina/localhost/应用名目录下。如果你只覆盖了 war 包老的解压目录和编译缓存还在Tomcat 会优先用旧文件。解决部署前先停 Tomcat删除webapps/shop整个目录和work/Catalina/localhost/shop整个目录再放新的 war 包启动。不要图省事只覆盖 war 文件这种“旧缓存”问题在传统 JSP 项目里比 Spring Boot 常见得多因为 Spring Boot 的 jar 内部结构不容易残留独立目录。6. 快速验收与进阶如何确认系统可用以及迁往Spring Boot的思路6.1 把验收做成一张表论文测试章节直接用手工点几遍页面不算验收至少要有可复现步骤和预期结果。下面这张表可以当作验收清单也能直接改成论文里的“系统测试”小节场景操作预期结果数据校验方式注册填写注册表单并提交跳转登录页shop_user 表新增一行密码为哈希值登录输入正确账号密码首页显示用户名session 中存在 user 对象加入购物车商品页点击“加入购物车”购物车徽标数量 1cart 表唯一键冲突时 quantity 累加下单选择购物车商品并结算跳转订单成功页orders 和 order_item 各新增记录cart 记录清空库存扣减下单成功后查看商品库存库存减少对应数量goods.stock 与订单前差值一致多用户并发时重点验证“超卖”。可以写一个简单循环脚本同时发多个下单请求观察 goods.stock 是否出现负数。如果库存变成负数说明扣库存没加WHERE stock ?条件这是系统是否真正可交付的分水岭。6.2 从传统 JSP 迁到 Spring Boot 集成 JSP 目录如果后续想往框架方向走最平滑的路是迁到 Spring Boot 2.x 集成 JSP 目录而不是一步跨到前后端分离。Spring Boot 官方默认不支持 JSP 打包成 jar需要把项目打 war 包并把 JSP 放到src/main/webapp/WEB-INF/jsp/下引入两个依赖spring-boot-starter-tomcat和tomcat-embed-jasper。迁移时不需要重写 JSP 页面只需要把 Servlet 改成Controller把doPost里的逻辑搬到方法里返回值改成视图名。数据库访问层可以继续用 MyBatis 或直接写 JdbcTemplate业务事务从手动管理 Connection 改为Transactional。这套迁移路线保留原有页面资产又让代码结构更接近公司里的真实项目。做这个方向时我犯过最蠢的错是在正式环境用 sa 超级账户跑应用后来被扫描工具爆破成功。如果你只是练手最好建一个shop_user低权限账号只授予增删改查权限。另一个让我少熬许多夜的教训是改完 JSP 记得先停 Tomcat 再删 work 缓存这个动作比改代码本身更常救命。希望帮到你。本文还有配套的精品资源点击获取
返回列表