ARTICLE DETAIL

资讯详情

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

Java Web合同管理系统:SQL Server+Servlet实战闭环

Java Web合同管理系统:SQL Server+Servlet实战闭环 简介这是一套面向Java初学者与毕业设计学生的完整企业级合同管理系统实战资源基于Java Web技术栈与SQL Server数据库构建覆盖系统开发、部署与文档全流程。资源包含157个文件总大小30.41MB其中JSP页面16个实现前端交互Java类10个与Class字节码10个构成核心业务逻辑SQL Server数据库文件mdf/ldf支持一键还原配套GIF操作演示47个与MP4讲解视频1个直观呈现功能运行效果另有CSS、JS、XML等支撑文件保障系统完整性。已有112人学习下载适合课程设计、工程实训或毕设快速启动。用户可直接导入Eclipse运行源码查看登录验证、合同增删查改、收款提醒配置及密码修改等模块的完整实现同时获得配套论文与详细目录结构显著降低环境搭建与功能理解门槛。1. 这不是又一个“登录增删改查”的Java Web Demo而是一套可直接跑通、带业务闭环的合同管理最小可行系统很多刚学完Servlet和JDBC的同学面对“课程设计”“毕设选题”时常卡在「功能太单薄撑不起文档」「数据库建得随意导致后期改不动」「前后端混写调试像在猜谜」这三道坎上。这套基于Java SQL Server实现的企业合同管理系统恰恰绕开了这些坑——它用Thetong.class封装合同主业务逻辑用Ttixing.class和TAdmin.class分层处理提醒与权限所有Servlet如hetong_servlet.class、tixing_servlet.class都遵循单一职责原则不掺杂DAO或页面跳转硬编码数据库SQL脚本已预置完整表结构含外键约束、默认值、索引连DB.class里的连接池参数都按SQL Server JDBC驱动最新实践配置更关键的是它把「收款提醒」这个真实业务点做成了可触发、可查询、可删除的闭环模块而非静态列表。适合需要快速验证Java Web工程化能力、理解MVC分层边界、或为毕业答辩准备可演示系统的开发者——尤其当你发现论文里“系统采用B/S架构”这种话写得发虚时这套源码能让你指着运行中的收款提醒弹窗说“这里就是业务逻辑落地的地方”。2. 从SQL Server建库到Java Web项目部署环境链路必须打通的四个关键节点2.1 SQL Server数据库初始化不只是执行SQL而是验证约束与数据一致性该系统配套的database.sql脚本并非简单建表语句堆砌。它包含三类关键结构业务主表contract_info合同主表、payment_reminder收款提醒表、admin_user管理员表均定义了NOT NULL字段、CHECK约束如合同金额amount 0、以及FOREIGN KEY关联payment_reminder.contract_id → contract_info.id索引优化在contract_info.create_time和payment_reminder.due_date上建立非聚集索引支撑高频查询场景测试数据注入脚本末尾插入5条模拟合同记录和3条收款提醒确保首次启动即有数据可查。提示执行前务必确认SQL Server实例已启用TCP/IP协议并在SQL Server Configuration Manager中将SQL Server (MSSQLSERVER)服务设为自动启动。若使用SQL Server Express LocalDB需在DB.class中将连接字符串jdbc:sqlserver://localhost\\SQLEXPRESS;...改为jdbc:sqlserver://(localdb)\\mssqllocaldb;...。执行脚本时推荐使用SQL Server Management StudioSSMS以管理员身份连接右键数据库→“新建查询”粘贴脚本后执行。若报错Cannot drop the database xxx because it is currently in use需先执行USE master; ALTER DATABASE [hetong_db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [hetong_db];再重新创建。此步骤确保旧库残留连接被强制释放避免因连接未断导致建库失败。2.1.1 验证建库结果用T-SQL确认核心约束是否生效执行完建库脚本后运行以下查询验证外键约束是否激活SELECT fk.name AS foreign_key_name, OBJECT_NAME(fk.parent_object_id) AS table_name, COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name, OBJECT_NAME(fk.referenced_object_id) AS referenced_table FROM sys.foreign_keys AS fk INNER JOIN sys.foreign_key_columns AS fkc ON fk.object_id fkc.constraint_object_id WHERE fk.parent_object_id OBJECT_ID(payment_reminder);预期返回一行结果referenced_table列为contract_info。若无结果说明外键未创建成功需检查建表语句中REFERENCES contract_info(id)是否拼写正确且contract_info表是否在payment_reminder之前创建。2.2 Java Web项目结构解析Servlet、Service、DAO三层如何解耦项目源码未使用Spring框架而是通过纯ServletJDBC实现MVC分层。其核心类职责明确类名所属层核心职责关键方法示例hetong_servlet.classController处理合同相关HTTP请求调用Service层doPost()中根据request.getParameter(action)分发至contractService.add()或contractService.delete()liuService.classService封装业务规则协调DAO操作addContract()校验合同编号唯一性调用contractDao.insert()Thetong.classDAO直接操作数据库执行SQLinsert(String name, BigDecimal amount, Date signDate)生成INSERT语句并执行注意EncodingFilter.class是全局字符编码过滤器必须在web.xml中配置为filter-mapping否则中文参数如合同名称会乱码。其doFilter()方法中request.setCharacterEncoding(UTF-8)和response.setCharacterEncoding(UTF-8)缺一不可。2.2.1 DB.class连接池配置为什么不用DriverManager而用BasicDataSourceDB.class中使用Apache Commons DBCP2的BasicDataSource而非DriverManager.getConnection()原因在于连接复用避免每次请求都新建/销毁连接降低SQL Server连接开销超时控制setMaxWaitMillis(5000)防止线程无限等待空闲连接预编译缓存setPoolPreparedStatements(true)开启PreparedStatement缓存提升重复SQL执行效率。关键配置代码段DB.class中private static BasicDataSource dataSource new BasicDataSource(); static { dataSource.setUrl(jdbc:sqlserver://localhost:1433;databaseNamehetong_db;encryptfalse;trustServerCertificatetrue;); dataSource.setUsername(sa); dataSource.setPassword(your_password); // 生产环境严禁明文密码 dataSource.setInitialSize(5); dataSource.setMaxIdle(10); dataSource.setMinIdle(2); dataSource.setMaxOpenPreparedStatements(200); // 缓存200个PreparedStatement }参数说明encryptfalse和trustServerCertificatetrue适用于本地开发环境SQL Server未配置SSL证书生产环境必须启用加密并配置可信证书否则连接会被拒绝。2.3 Tomcat部署与路径映射解决404和中文乱码的实操步骤将项目打包为WAR包部署到Tomcat时常见问题及修复方案如下问题现象根本原因解决步骤访问http://localhost:8080/hetong/login.jsp返回404web.xml中Servlet URL-pattern未匹配请求路径检查servlet-mapping中url-pattern/login/url-pattern是否与JSP中表单actionlogin一致若JSP在/WEB-INF/下需通过Servlet转发访问登录后跳转main.jsp显示中文为??JSP文件本身编码非UTF-8或响应头未声明charset在main.jsp顶部添加% page contentTypetext/html;charsetUTF-8 %同时确认EncodingFilter已对所有*.jsp路径生效点击“添加合同”按钮无反应hetong_servlet.class未在web.xml中注册检查servlet块中servlet-class是否为com.hetong.hetong_servlet注意包名与class文件路径匹配部署后验证启动Tomcat在浏览器访问http://localhost:8080/hetong/login.jsp输入默认账号admin/123456见admin_user表初始数据成功登录即证明Servlet映射、数据库连接、字符编码三者全部贯通。3. 合同信息管理模块实战从页面交互到SQL执行的全链路拆解3.1 合同添加功能表单提交→Servlet接收→Service校验→DAO入库用户在add_contract.jsp填写合同名称、金额、签订日期后点击提交流程如下3.1.1 前端表单关键字段与验证逻辑form actionhetong methodpost input typehidden nameaction valueadd !-- 区分不同操作 -- input typetext namecontractName required placeholder合同名称 input typenumber nameamount step0.01 min0.01 required placeholder金额 input typedate namesignDate required button typesubmit提交/button /form提示step0.01确保金额输入框支持小数min0.01防止零或负数required属性由浏览器原生校验但后端liuService.addContract()仍需二次校验防绕过。3.1.2 hetong_servlet.class中请求分发逻辑protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); ContractService contractService new ContractService(); // Service实例 if (add.equals(action)) { String name request.getParameter(contractName); BigDecimal amount new BigDecimal(request.getParameter(amount)); Date signDate new SimpleDateFormat(yyyy-MM-dd).parse(request.getParameter(signDate)); boolean success contractService.addContract(name, amount, signDate); request.setAttribute(msg, success ? 添加成功 : 添加失败请检查合同编号是否重复); request.getRequestDispatcher(add_result.jsp).forward(request, response); } }逻辑说明request.getParameter()获取表单值后立即转换为BigDecimal避免double精度丢失和Date需指定SimpleDateFormat格式contractService.addContract()返回布尔值决定跳转至成功或失败页面。3.2 合同查询功能模糊搜索与分页实现细节contract_list.jsp提供按合同名称模糊查询功能后端liuService.searchContracts()实现如下3.2.1 SQL Server模糊查询的正确写法public ListThetong searchContracts(String keyword) { String sql SELECT * FROM contract_info WHERE contract_name LIKE ?; // 使用参数化查询防止SQL注入 return queryForList(sql, % keyword %); }注意SQL Server中LIKE通配符为%非MySQL的*且?占位符必须与queryForList()第二个参数类型匹配。若keyword为空字符串% %即%%会匹配所有记录符合“无条件查询”需求。3.2.2 分页查询的SQL Server特有语法系统未实现物理分页但预留了扩展接口。若需在SQL Server 2012中实现高效分页应替换为SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time DESC) AS row_num FROM contract_info WHERE contract_name LIKE ? ) AS t WHERE t.row_num BETWEEN ? AND ?;其中?依次为keyword、startRow起始行号、endRow结束行号。例如查第2页每页10条startRow11,endRow20。此写法比OFFSET-FETCH兼容性更广且避免TOP N无法跨页的缺陷。3.3 合同删除功能软删除还是硬删除业务场景决定技术选型当前系统采用硬删除DELETE FROM contract_info WHERE id ?但实际企业应用中需考虑审计要求。若需改造为软删除步骤如下修改表结构为contract_info添加is_deleted TINYINT DEFAULT 0字段0未删除1已删除更新DAO查询所有SELECT语句追加AND is_deleted 0条件重写删除逻辑contractDao.delete()改为UPDATE contract_info SET is_deleted 1 WHERE id ?新增恢复功能在管理界面添加“已删除合同”Tab页执行UPDATE contract_info SET is_deleted 0 WHERE id ?。提示软删除后payment_reminder表需同步处理。若payment_reminder外键指向contract_info.id则ON DELETE CASCADE不生效因未真删需在Service层手动将关联提醒标记为is_deleted1或建立独立的deleted_contract_reminder归档表。4. 收款提醒模块深度优化从定时任务到SQL Server Agent的平滑迁移4.1 当前提醒机制分析基于用户主动触发的被动模式系统现有Ttixing.class仅提供“添加收款提醒”和“展示提醒列表”功能提醒是否到期完全依赖用户手动刷新页面。其payment_reminder表结构含due_date DATE和status TINYINT0未提醒1已提醒但无自动检测逻辑。这种设计适合低频、人工核对场景但无法满足“到期前3天邮件通知”等自动化需求。4.1.1 手动触发提醒的SQL验证在SSMS中执行以下语句可模拟“检查今日到期提醒”UPDATE payment_reminder SET status 1 WHERE due_date CAST(GETDATE() AS DATE) AND status 0;GETDATE()返回当前日期时间CAST(... AS DATE)截取日期部分确保只匹配due_date等于当天的记录。执行后status变为1前端payment_reminder.jsp中WHERE status 0的查询将不再返回该条目。4.2 迁移至SQL Server Agent用作业调度替代Java轮询Java层轮询如TimerTask存在资源浪费和精度问题而SQL Server Agent可精准调度T-SQL作业。迁移步骤如下4.2.1 创建提醒检测作业在SSMS中展开“SQL Server Agent”→“作业”→右键“新建作业”“常规”页填写作业名称CheckPaymentReminders“步骤”页添加新步骤类型选“Transact-SQL 脚本(T-SQL)”命令为-- 检查未来3天内到期的提醒状态设为1待通知 UPDATE payment_reminder SET status 1 WHERE due_date BETWEEN GETDATE() AND DATEADD(DAY, 3, GETDATE()) AND status 0; -- 可选将待通知记录写入日志表 INSERT INTO reminder_log (reminder_id, check_time, action) SELECT id, GETDATE(), NOTIFY FROM payment_reminder WHERE status 1 AND last_notified IS NULL;“调度”页设置为每天9:00执行一次。注意DATEADD(DAY, 3, GETDATE())计算3天后日期BETWEEN包含首尾日期last_notified IS NULL防止重复通知需在payment_reminder表中新增该字段。4.2.2 Java层适配从“查状态”到“查日志”前端payment_reminder.jsp的查询SQL应从SELECT * FROM payment_reminder WHERE status 0;改为SELECT r.*, l.check_time FROM payment_reminder r LEFT JOIN reminder_log l ON r.id l.reminder_id WHERE r.status 1 AND l.action NOTIFY;这样页面展示的是“已被系统标记为待通知”的提醒而非用户手动标记的状态实现业务逻辑与调度逻辑分离。4.3 关键参数调优表SQL Server Agent作业稳定性配置参数推荐值说明最大步长重试次数3防止网络抖动导致作业失败重试后仍失败则告警输出文件路径C:\SQLAgentLogs\CheckPaymentReminders.log记录每次执行的SQL影响行数便于排查漏扫警报选项启用“作业失败时发出警报”绑定DBMail失败时邮件通知管理员代理账户使用sqlagent专用Windows账户避免用sa账户执行作业最小权限原则配置完成后在SSMS中右键作业→“启动作业”观察日志文件是否生成。若日志中出现0 row(s) affected说明当日无到期提醒属正常若持续为0需检查due_date字段数据是否为未来日期。5. 毕设/课程设计答辩必备技巧三分钟讲清技术选型与可扩展点5.1 面试官最可能追问的两个技术点及应答话术5.1.1 “为什么用SQL Server而不是MySQL”标准回答“选型基于三点第一企业级合同管理对事务完整性要求高SQL Server的READ_COMMITTED_SNAPSHOT隔离级别能有效减少读写阻塞比MySQL默认的REPEATABLE READ更适合高并发查询场景第二SQL Server Management Studio的图形化调试能力如实时执行计划、死锁图极大缩短了DAO层SQL优化周期第三本系统后续要对接OA系统而客户OA数据库正是SQL Server避免异构数据库同步的ETL成本。”提示若面试官追问“那SQL Server 2022新特性用了吗”可答“本次实现基于SQL Server 2019兼容性但已预留JSON_VALUE()函数接口未来可将合同附件元数据以JSON格式存于contract_info.ext_data字段利用2022的OPENJSON()快速解析。”5.1.2 “如果合同量达到百万级当前架构怎么优化”分层应答数据库层将contract_info按年份分区PARTITION BY RANGE (YEAR(create_time))冷数据3年前自动归档至历史库应用层Thetong.class中getContractById()方法增加Redis缓存Key为contract:${id}TTL设为30分钟命中率可达70%以上架构层剥离payment_reminder为独立微服务用RabbitMQ接收合同创建事件异步生成提醒避免主业务链路阻塞。5.2 论文写作隐藏技巧用代码注释生成UML类图多数同学手绘UML类图耗时且易错。其实liuService.class和Thetong.class的Javadoc已隐含结构信息。用IntelliJ IDEA打开源码右键liuService.java→“Diagrams”→“Show Diagram”选择“Java Class Diagram”IDEA会自动生成包含继承关系、方法签名、字段类型的类图。导出为PNG后插入论文“系统设计”章节比Visio手绘更专业。5.2.1 关键注释规范示例供你修改源码时参考/** * 合同业务服务类 * p职责协调DAO层完成合同全生命周期操作/p * p依赖{link Thetong}DAO、{link DB}数据源/p * author YourName * version 1.0 */ public class liuService { /** * 添加合同 * param name 合同名称长度1-100字符 * param amount 合同金额精度2位小数 * param signDate 签订日期格式yyyy-MM-dd * return true表示添加成功false表示合同编号重复 */ public boolean addContract(String name, BigDecimal amount, Date signDate) { // 实现略 } }此类注释经IDEA解析后类图中会自动生成param标注的参数类型、return描述的返回值含义大幅提升图表信息密度。5.3 视频演示黄金30秒脚本让评委一眼看懂系统价值录制答辩视频时开头30秒决定第一印象。建议脚本“各位老师好这是我设计的企业合同管理系统。请看——切换屏幕共享登录后进入合同管理页我新增一份‘软件开发合同’金额50万元签订日期2024-06-01。停顿2秒现在切换到收款提醒页添加一条‘首期款30万元到期日2024-07-01’的提醒。再停顿2秒重点来了系统已自动将该提醒加入待办列表且后台SQL Server Agent作业每早9点扫描到期前3天触发通知。鼠标悬停提醒条目您可以看到这条提醒的‘状态’字段已由0变为1证明自动化机制正在运行。整套系统从数据库建模、Java分层编码到生产级调度全部自主实现。”这段演示覆盖了“功能完整性”“技术深度”“业务价值”三个得分维度且所有操作均可在1分钟内完成杜绝拖沓。本文还有配套的精品资源点击获取
返回列表