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

资讯详情

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

JSP智慧热力管理服务系统:从数据库到部署的完整实践

JSP智慧热力管理服务系统:从数据库到部署的完整实践 1. 这个系统到底能做什么智慧热力管理的前台与后台双视角拿到这套JSP智慧热力管理服务系统的时候我第一反应是这不就是典型的一个顶三个课程设计作品吗用户侧、管理侧、数据侧全在一个Web应用里用的还是JSPServletMySQL这套经典技术栈。但说实话把它完整跑起来之后我反而觉得这类项目在当下比很多花里胡哨的前后端分离项目更有教学价值。先说清楚这个系统是什么。它属于典型的MVC三层结构的Java Web项目载体是JSP页面运行在Tomcat容器里数据库用MySQL存储。整个系统的业务范围围绕热力管理展开热力公司或者物业冷暖站需要实时掌握用户采暖信息、设备运行状态、费用缴纳记录而用户需要一个界面查看自己家的供暖情况、在线报修、缴纳供暖费。这套系统拆开看前台用户端大概有这些功能模块用户注册与登录含验证码校验个人信息查询与修改供暖费用查询与在线缴纳记录报修工单提交与进度查看公告通知浏览后台管理端的功能则更偏数据治理方向管理员登录认证与权限拦截用户信息管理增删改查、条件模糊查询供暖设备台账管理设备编号、运行状态、检修记录费用标准配置与账单生成报修工单审核、派单、归档数据统计按小区、按月份的费用汇总这套系统适合什么人去研究我觉得有三类人最容易从中获益第一类是正在做Java Web课设或毕设的在校学生需要一套功能完整、能跑通、能答辩的项目第二类是刚接触JSP/Servlet/MySQL这套老技术栈想搞清楚传统MVC到底怎么工作的自学者第三类是工作后需要维护老系统、或者要把老系统做二次升级的开发者这类人对传统JSP项目的结构一点都不陌生。和Spring Boot前后端分离那一套对比起来这套JSP系统最大的特点是一体化页面、逻辑、数据访问都在同一个Web应用里协作没有跨域、没有前后端接口联调启动一个Tomcat就能看到完整效果。这种结构在2025年的今天看来很复古但它把请求从浏览器到Servlet到DAO再到数据库的完整路径暴露得一清二楚。你点一下登录按钮后台代码走过的每一条分支都能用断点抓住这对理解Web应用的本质非常有帮助。更关键的是这套系统带源码、带数据库脚本、带完整的部署调试步骤。它不是那种只给你看截图、实际上缺东少西的演示项目而是一套导入就能跑的东西。下面我会从技术选型、数据库设计、部署调试、二次开发几个层面把这套系统的里里外外拆开讲透。2. 技术选型为什么是JSP老四样从架构层面理解一个完整Web应用的合理边界很多刚接触这个项目的人会问现在不都是Spring Boot Vue吗为什么还要用JSP这套上古组合问出这个问题说明还没理解这类项目的定位。这套系统用的是标准Java Web技术栈清点一下就是四样东西JSPJava Server Pages负责页面展示支持Java代码和EL表达式混写本质是运行时编译成ServletServlet负责接收请求、调度业务逻辑、控制页面跳转是MVC里的Controller层JavaBean/DAO负责封装数据模型和数据库操作传统写法下用JDBC连接MySQLMySQL数据落地的关系型数据库提供用户表、设备表、账单表、工单表这些核心业务表这套技术栈组合在一起正好覆盖了一个Web应用的全部环节浏览器发起HTTP请求Tomcat把请求交给对应的ServletServlet调用DAO层方法操作数据库得到一个结果集再用forward或redirect把页面带到JSP渲染后响应给浏览器。为什么选这套而不是Spring Boot答案有三层第一层是学习价值。JSPServlet是Java Web的底层路段Spring Boot再方便本质上也是在Servlet规范之上做了封装。如果你连最基本的request.getParameter()都没写过一上来就搞Spring Boot的注解满天飞你根本不知道框架帮你干了什么。就好比你会开自动挡却不懂手动挡是怎么换挡的碰到顿挫感只能干瞪眼。第二层是项目定位。课程设计和毕业设计不等于企业级生产项目评委和导师要看的不是你用了多少高深技术而是你对基本技术的掌握程度和完整工程的把控能力。JSP项目把每个环节都暴露在明面上答辩的时候随便挑一个点都能深入讲透这是Spring Boot黑盒封装做不到的。第三层是运行环境要求低。一台普通的笔记本电脑装好JDK 8、Tomcat 8/9、MySQL 5.7就能把这个系统完整跑起来。不需要Maven拉依赖、不需要Redis、不需要消息队列对学校机房和老电脑特别友好。不过这里我要多说一句如果你未来要入行Java开发这套JSP项目只是地基而不是终点。但你在这个项目里积累的Servlet生命周期理解、Session管理经验、JDBC事务处理能力、SQL编写功底放到Spring Boot项目里照样复用。反过来一个只会在Spring Boot里写Autowired的人碰到传统JSP项目反而会手足无措。3. 数据库设计拆解五张核心表如何承载所有业务逻辑运行这套系统前第一步是要把数据库还原出来。拿到手里的SQL脚本一般包含建库语句、建表语句和初始数据用Navicat或者命令行执行即可。不要直接双击导入最好先打开脚本看一眼因为很多老项目的SQL文件里字符集设置五花八门直接导入容易出现中文乱码。以我对同类热力管理系统的了解这套项目的数据库大概包含五张以上核心表每张表都有明确的业务指向3.1 用户表t_user用户表是最基础也最关键的表承载三端数据个人基本信息、账号信息、状态信息。典型字段包括用户ID自增主键、用户名、密码多数用MD5加密存储、真实姓名、身份证号、手机号、小区ID、楼栋号、单元号、门牌号、供暖面积、用户状态正常/冻结、创建时间。这里有个值得注意的设计点供暖面积直接留在用户表里而不是单独放在房产表。因为供暖费用是按面积计算的选房时录入一次面积后续生成账单直接关联这个字段逻辑简单对课设项目来说够用。真实商用系统当然会拆出房产表、业主表但作为一套学习作品这种扁平化设计反而好懂。3.2 供暖设备表t_device设备表管理所有供热设施台账。字段大概包括设备ID、设备编号唯一编码如RL-2024-001、设备名称如板式换热器、循环水泵、所属小区、安装位置、设备状态运行/停机/检修/报废、供应商、安装日期、最近检修日期、备注。管理端在这个表上做的事情基本就是增删改查加条件搜索。这里我提示一个写查询的小技巧做设备搜索时状态筛选用下拉框关键字搜索用模糊匹配两个条件要动态拼接SQL。很多初学JDBC的人容易踩一个坑——无条件查询时SQL多出一个多余的WHERE解决方法是先拼SELECT * FROM t_device WHERE 11后续条件统一用AND衔接。3.3 计费规则表t_fee_rule这张表决定供暖费怎么算。核心字段规则ID、小区ID或区域、计费方式按面积/按户、单价元/平米/月或元/户/月、生效开始日期、生效结束日期、备注说明。费用生成逻辑并不复杂账单金额 用户表里的供暖面积 × 当前生效规则里的单价 × 供暖月份数。但实际写代码时要注意规则生效区间比如2024年11月到2025年3月执行的是某一个单价如果用户在12月变更了面积账单一拆二就能讲清楚合并算就不严谨。在这个项目里我建议规则配置做成前端可改、后端生成账单时动态读取近期生效规则。3.4 账单表t_bill账单表是用户和管理员都能看到的核心数据。字段包括账单ID、用户ID、账期如2024-11、应收金额、滞纳金、应缴总额、缴费状态未缴/已缴/已作废、缴费方式线上/线下/银行代扣、缴费时间、操作人ID。这套表设计里建议加一个唯一约束同一用户同一账期只能有一条账单记录。加这个约束的原因很实际——避免重复生成账单。做批量生成账单功能时先查一下目标账期是否已有数据有就提示该账期账单已生成不要重复生成避免直接往表里塞数据导致主键冲突。3.5 报修工单表t_repair工单表用于用户报修和维修人员处理。字段包括工单ID、用户ID、报修类型管道漏水/温度不达标/阀门故障等、报修描述、报修时间、报修图片路径、处理状态待派单/处理中/已完成/已关闭、处理人ID、完成时间、用户反馈满意度。从业务闭环角度看工单系统是整个智慧热力概念里最能体现交互深度的模块。用户在前台提交报修管理员在后台看到工单列表、分配维修人员、填写处理结果用户再回来查看进度。三个角色围绕一张表完成一次完整闭环这在答辩时是非常好的业务讲解点。3.6 额外补充公告表和操作日志表如果源码里带公告管理还会有一张t_notice表简单字段就是标题、内容、发布时间、发布人、置顶状态。操作日志表可能叫t_log用来记录管理员关键操作比如删除用户、修改价格、生成账单。日志表容易被忽略但它能体现管理留痕的安全意识建议保留并讲解给评委听。数据库还原的时候还需要注意一件事MySQL的sql_mode。新版MySQL 5.7以上默认启用ONLY_FULL_GROUP_BY导致老SQL里的GROUP BY语句会报错。如果你导入后运行统计功能时看到关于only_full_group_by的报错处理方式是在连接字符串后面加上sessionVariablessql_modeSTRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION或者直接改MySQL的my.ini配置文件。这个问题我在很多老项目上都碰到过属于典型的环境兼容性坑。4. 从导入工程到跑起来完整的调试部署实战记录拿到源码后从零起步到页面能正常打开需要经过一整套环境准备、项目导入、参数修改、启动验证的流程。很多人卡在这一步80%不是代码问题而是环境变量、编译版本、路径转义这些“隐形刺客”。4.1 环境版本搭配先说版本这是最容易出问题的部分。根据我的实操经验这套JSP系统的兼容性组合大概是这样的组件推荐版本原因JDK1.88u202以后版本均可JSP/Servlet老项目用JDK8最稳新JDK对Tomcat8兼容性较差Tomcat8.5.x 或 9.0.x支持Servlet 3.1/4.0规范能跑JSP和ServletMySQL5.7.x5.7对老SQL脚本兼容最高8.0需注意字符集和加密插件变化IDEEclipse IDE for Enterprise Java or IDEA UltimateIDEA社区版不支持Java EE内置极度推荐用企业版或Eclipse数据库工具Navicat 15/DBeaver用于执行SQL脚本、查看表数据有条件的建议直接下载JDK 8和Tomcat 8.5.9x别用太新的组件的核心原因是老项目没有处理好API兼容和依赖JDK11以上运行老Tomcat会遇到模块化访问报错。具体报错是java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException这是JDK11移除了Java EE模块导致的解决办法是手动补jar包折腾起来远不如直接切JDK8省心。4.2 项目导入与配置详解拿到工程后通常是整个文件夹包含src、WebRoot/WebContent、数据库脚本、文档用IDEA导入前先检查build path里的jar包是否齐全。常见缺失的有mysql-connector-java-x.x.jarJDBC驱动jstl.jar 和 standard.jarJSP标准标签库servlet-api.jarTomcat自带的不要打进工程如果发现少驱动去Maven中央仓库搜mysql-connector-java下载jar放进项目的WEB-INF/lib目录下再Add to Library即可。严格来说servlet-api这类容器提供的jar不应放lib里否则部署时可能出现类冲突老项目里倒是不太常见。接下来配置数据源连接信息。找到数据库连接工具类通常是JDBCUtil.java或DBHelper.java或者db.properties配置文件修改三处private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/heating_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456;关键是URL里必须带characterEncodingutf8否则页面里的中文会在存取后乱码。serverTimezone参数针对MySQL 8.0的时间区报错问题5.7环境不加也行。4.3 部署到Tomcat并启动在IDEA里配置Tomcat的方法我快速说一遍Run菜单 - Edit Configurations - 左上角 - Tomcat Server - LocalApplication server处选本机Tomcat目录Deployment标签页点 选Artifact - 选择war exploded包Application context填/heating或者留空根路径Server标签页勾选After launch打开浏览器默认URL填http://localhost:8080/然后点启动。第一次启动大概率会碰到端口占用问题。因为8080是Tomcat默认端口被其它程序占用的几率不低解决方式是在conf/server.xml里改Connector端口号比如改为8081改完重启即可。启动成功后控制台会看到类似信息信息: Server startup in [xxx] milliseconds。这时在浏览器地址栏输入http://localhost:8080/或你配置的应用路径就能看到系统首页。如果页面直接弹出500错误不要慌这是正常的按下面的链路排查。4.4 首次运行500错误排查链路我把实战中遇到最多的启动问题整理成一张排查表现象原因解决办法500 ClassNotFoundException: com.mysql.jdbc.DriverJDBC驱动jar没放到lib里下载mysql-connector-java并加入项目依赖500 Communications link failure数据库没启动或者URL端口/账号错确认MySQL服务已启动确认连接串参数无误数据库导入中文乱码SQL脚本编码和执行客户端编码不一致用UTF-8编码重新导入导入前设置SET NAMES utf8mb4404找不到页面app context路径不对或servlet映射写错检查web.xml里的servlet-mapping检查访问URL是不是context映射路径JSP只显示代码不渲染Tomcat没把工程当Web应用加载确认Artifact是war exploded并已部署其中404的错误需要多说一句很多JSP项目里登录表单的action写的是UserServlet?actionlogin或user/login在web.xml里对应配置了servlet和servlet-mapping。如果你改了项目部署名那访问路径也要跟着改。比如Application context设置成/heating那表单跳转就应该是/heating/UserServlet。老项目里写死了绝对路径的情况特别多这是404高发区。4.5 数据库初始化脚本执行顺序拿到SQL脚本后按顺序执行三步建库通常第一行是CREATE DATABASE IF NOT EXISTS heating_db DEFAULT CHARSET utf8;建表顺序执行多张CREATE TABLE语句导初始数据插入管理员账号、测试用户、若干设备、公告等初始数据里一般会有默认管理员账号比如admin/admin123。这组数据必须在数据库里提前确认存在否则后台登录永远进不去。可以用Navicat双击打开表直接查看记录。顺带提一个问题如果你在Navicat里执行脚本时提示“Unknown Collation: utf8mb4_0900_ai_ci”说明脚本来源环境的MySQL版本是8.0而当前MySQL是5.7。处理方法是把脚本里所有utf8mb4_0900_ai_ci替换成utf8mb4_general_ci不需要动其它内容。5. 一次完整的功能走通从用户注册到后台派单的业务链路代码能跑起来之后最关键的事情是把业务流程完整走一遍。这一步不只是验证系统有没有bug更重要的是帮你在答辩或者写报告的时候能画出一张完整的业务流转图。我建议按照下面这条链路去操作5.1 链路一用户侧自助办理打开首页点击“注册”填写用户名、密码、姓名、小区、楼栋、面积信息注册成功后自动跳转登录页用刚注册的账号登录进入用户中心查看个人信息、关联账单、提交一条报修工单这条链路检查的核心点包括注册时表单非空校验是否生效、密码MD5是否入库、登录后Session是否写入、查询账单列表是否只显示当前用户数据防止越权。这里浓缩一句经验排查用户数据越权是JSP项目评审时最容易被问到的点。如果账单查询SQL是SELECT * FROM t_bill而没有按用户ID过滤那么任何一个登录用户都能看所有人的账单这就是严重的越权漏洞。拿到项目后第一件事就该打开对应Servlet看DAO层SQL有没有带用户ID条件。5.2 链路二后台管理操作用admin账号登录后台查看用户列表测试模糊搜索按姓名或手机号新增一条设备记录状态选“运行”进入计费规则页配置一个单价点击“生成账单”在工单管理里查看用户提交的报修单点击“派单”填写处理人在统计页面查看费用汇总这条链路检查的核心点包括后台所有Servlet是否做了登录过滤用Filter实现、生成账单金额是否等于面积×单价×月份数、工单状态流转是否符合预设逻辑。有一个非常普遍的问题很多JSP项目只做了界面上的登录跳转但Filter过滤器没有写好导致用户在浏览器直接输入后台Servlet地址就能绕开登录。验证方法是退出登录后直接在地址栏输入后台列表页的完整URL看能不能访问。如果直接能进说明过滤器没生效或没配置。修复方式在第五章详述。5.3 链路三数据统计与报表统计功能是这类智慧管理系统的加分项。检查时看一下实现方式常见有两种SQL聚合查询GROUP BY SUM或者Java内存统计。推荐前者因为它把计算压力放在数据库层实现也更简洁。例如查询各小区当月采暖费总收入SQL大致长这样SELECT u.area_name AS 小区, SUM(b.total_amount) AS 总收入, COUNT(b.bill_id) AS 缴费笔数 FROM t_bill b LEFT JOIN t_user u ON b.user_id u.id WHERE b.pay_status 已缴费 AND b.period 2024-11 GROUP BY u.area_name ORDER BY 总收入 DESC;追加一句如果SQL执行报错大概率就是MySQL 5.7的only_full_group_by模式问题按第三章提到的sql_mode配置处理就行。执行成功后在JSP页面里用一个JSTL的forEach标签循环输出即可。6. JSP项目必须掌握的三个底层机制过滤器、会话管理和JDBC优化很多跑通这个项目的同学都会卡在同一个问题代码能跑但不知道自己写的代码为什么要这样写。其实这套系统里隐藏着三个Java Web核心机制搞懂了才算真正做过这个项目。6.1 过滤器Filter——登录拦截的那道门管理员后台必须做权限控制。常用的实现是写一个AuthFilter类在web.xml里配置或者用WebFilter注解。核心逻辑说白了三句话从Session里取当前登录用户如果用户不存在重定向到登录页如果请求路径是登录相关的Servlet或者静态资源放行实际开发时容易踩的坑是静态资源被误拦截。JSP页面里引用的CSS、JS、图片如果被过滤器拦了页面样式全丢。解决方法是排除路径匹配比如url-pattern用/back/*并在过滤器里加白名单判断isExcludedUrl方法。很多老项目直接把所有/*都拦了然后页面丑成一坨原因就在这里。6.2 HttpSession会话管理——认识用户上下文Session是JSP里最常用的对象之一用户登录成功后设置session.setAttribute(user, user)后续页面用session.getAttribute(user)读取。它为什么有效因为服务端会生成一个唯一JSESSIONID通过Cookie保存在浏览器端每次请求自动带着这个ID服务端根据ID找到对应的Session对象。需要提醒一个安全习惯用户退出时不要只跳转回登录页要执行session.invalidate()销毁会话否则Session还挂在服务端别人在同一浏览器继续访问后台还会以你的身份登录。这个细节在答辩时提到导师会认为你具备安全意识。6.3 JDBC连接管理——别用裸DriverManager项目里访问数据库如果直接在每个DAO里写Class.forName和DriverManager.getConnection我见过大量老项目就是这种写法那么每次请求都会创建一次数据库连接。在低并发下问题不明显但如果你自己模拟并发请求会发现连接迟迟释放不掉最终导致数据库端报Too many connections。合理的做法是写一个ConnectionUtil工具类把连接、关闭、结果集释放封装成一个静态方法每个DAO统一调用。更进一步是引入数据库连接池比如Druid或C3P0只需要在项目里加入对应jar包、配置一个properties文件然后用DataSource获取连接即可。这个改动工作量不大但对接下来的答辩和代码升级都有加分效果。给你一个最简Druid配置参考Properties prop new Properties(); prop.load(new FileInputStream(src/druid.properties)); DataSource dataSource DruidDataSourceFactory.createDataSource(prop); Connection conn dataSource.getConnection();druid.properties内容大概长这样driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/heating_db?useUnicodetruecharacterEncodingutf8 usernameroot password123456 initialSize5 maxActive20 maxWait10000换成连接池之后DAO里的其余代码可以完全不动改动成本非常低。而且这样做带来的好处是数量级的连接复用、获取时间缩短、并发能力提高。答辩时问到系统并发能力怎么优化你就可以拿这个当论据。7. 源码细节上的常见坑与对应修复方案把系统完整跑通只是开始。如果你准备在这个项目基础上写论文、改功能或者给客户做一个演示版下面几类源码层面的坑你迟早会遇到。我把比较有代表性的挑出来逐个说。7.1 页面中文乱码的三层排查法乱码问题在JSP老项目里是最高频问题。出现乱码你需要从上到下排查三层第一层JSP页面头部是否写了pageEncoding和contentType% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %第二层Servlet和过滤器里取参数前是否设置了请求编码request.setCharacterEncoding(UTF-8);重点说这个方法的生效条件必须在调用request.getParameter之前的代码执行而且只对POST请求体有效。如果是GET请求带中文参数需要在Tomcat的conf/server.xml里给Connector加URLEncoding属性Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /第三层数据库连接URL是否带characterEncodingutf8以及表结构本身字符集是否为utf8。三层逐项核对后九成乱码能解决。7.2 数据库连接密码明文问题源码里数据库账号密码都是明文写在Java类里的。这个做法在真实项目里很危险。做演示或交作业没关系但如果你要挂到公网或者部署到服务器上强烈建议至少把密码写在外部配置文件中比如config.properties然后用代码读取避免源码泄露时数据库也跟着暴露。7.3 页面间传参request.setAttribute与session.setAttribute的区别很多初学JSP的程序员在两个方法之间来回切换换来换去就乱了。我一句话讲明白request.setAttribute(name, obj) 是一次请求内有效设置后调request.getRequestDispatcher(xxx.jsp).forward(request, response)转发目标JSP页面能读到session.setAttribute(name, obj) 是同一浏览器的整个会话内有效即使跳到别的Servlet再跳回来只要Session没失效数据都在实际项目里查询列表页进入修改页时需要携带记录ID用request传参就够。而登录用户的完整信息适合保存在Session里因为很多页面都要读取当前登录人。这个选择没有绝对标准但遵循一个原则只在这一个页面用的数据用request跨越多个请求都要用的数据才能用session。Session里塞太多数据会占用服务器内存并发大时很容易爆。7.4 SQL注入与防注入老项目最怕的就是SQL注入。如果源码里的登录查询是直接拼接字符串String sql SELECT * FROM t_user WHERE username name AND password pwd ;那么只要在用户名框输入admin --就能绕过密码登录。这个漏洞在课设答辩时被评委逮住会直接影响评分。修复方案是改为PreparedStatementString sql SELECT * FROM t_user WHERE username? AND password?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, name); ps.setString(2, pwd); ResultSet rs ps.executeQuery();改完之后特殊字符只作为参数值传递不再参与SQL语句拼接注入路径就断了。我见过很多老项目在演示时一切正常但答辩老师随手一个单引号就能把系统打挂。趁早检查一遍自己的工程。7.5 密码MD5加密存储如果用户密码在数据库里是全明文需要改成加密存储。用MD5最简单的做法是在注册Servlet里调用String encoded DigestUtils.md5Hex(password);登录时也把输入密码做一次同样处理然后再查询比对。MD5本身不够安全但这套项目毕竟不是金融系统做基本的不可逆转换已经能说明安全意识。时间充裕的话可以把盐值salt拼接进去比如salt是用户名md5(username password)防彩虹表效果更好。8. 如何在这个项目上做二次开发三个有亮点的扩展方向基础跑通之后给项目加点自己的东西会让它在答辩或者展示时完全不一样。我按难度从低到高给三个扩展方向每个都是这类系统常见的真实痛点。8.1 扩展一数据可视化统计页面比起甩一张干巴巴的数字表把费用趋势、工单处理时长、设备状态分布做成图表观感完全不同。最简单的方式是集成ECharts只要在JSP页面里引入ECharts的CDN然后在前端用AJAX调用后台一个返回JSON的Servlet接口即可。后台可以新增一个StatsServlet接收参数比如last6Months返回当月费用的json数组response.setContentType(application/json;charsetUTF-8); response.getWriter().write(jsonStr);注意如果用原生Servlet输出JSON建议引入fastjson或Gson库不用自己手动拼字符串因为拼字符串时一个引号没转义就可能让前端报错。8.2 扩展二管理员操作日志审计前文提过t_log表现在把它的价值补上增加一个LogFilter或者在增删改的方法里统一记录操作者、操作时间、操作内容、操作IP。这个功能实现起来门槛很低却是政企类系统最基础的安全要求。具体做法是写一个LogUtil工具类封装一个record(操作人、模块、动作、描述)方法然后在管理员删除用户、生成账单、修改单价这些操作后面各调一次。连同记录登录成功/失败次数演示时给评委展示非法登录尝试留痕说服力很强。8.3 扩展三微信小程序或移动端H5对接如果你想把项目升级得更现代可以考虑在不动JSP后台的前提下给系统增加一个移动端入口。做法是把后台的Servlet接口按照JSON协议重写一套或者新增一套a/api/前缀的Servlet返回数据格式统一成{code:0, data:xxx, msg:ok}然后前端小程序或H5页面只负责渲染。这个扩展的工程量主要在前端后端改动其实很小。之前用request和response做页面跳转的地方只需要改成write JSON即可。如果你熟悉微信小程序值班表、费用查询、报修跟踪这些页面可以做得很精美整套系统立刻有了移动互联网的味道。9. 我的几点实操体会项目从解压到完全调通我自己折腾了两天中间踩过的坑写出来给大家参考最费时间的不是环境搭建而是搞清楚初始数据都存了什么。管理员账号藏在SQL脚本第几行、哪个菜单背后调用了哪张表这些内容光看代码不如实际跑一遍记得牢。建议拿到项目后把几张核心表导出成Excel随时对照。第二JSP项目调试时不要只靠System.out.println要学会用DEBUG模式打断点。IDEA里把Tomcat配成Debug模式后在Servlet的doPost方法里打上断点浏览器点登录光标就会停在断点处request里的参数、连接状态、SQL执行结果一步到位全部可见。这个技能对排查复杂bug价值极大。第三修改任何JSP或Java文件后如果不是热部署模式一定要重启Tomcat再刷新页面。曾经因为没重启反复看到未更新的老页面平白多花了半小时排查一个根本不存在的问题。第四备份数据库脚本。每次改完数据结构导出一份新的SQL文件存到bak目录里。这是我吃了多次亏之后的习惯性动作没有备份的情况下一个DELETE不加WHERE的失误就能让整个演示泡汤。
返回列表