ARTICLE DETAIL

资讯详情

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

SSM+JSP知识产权管理系统源码解析:部署、代码走读与避坑指南

SSM+JSP知识产权管理系统源码解析:部署、代码走读与避坑指南 简介一套基于SSMSpringSpringMVCMyBatis与MySQL的知识产权管理系统完整源码面向JavaWeb学习者、毕业设计或课程设计人员覆盖前台用户、后台管理员/员工/注册用户三类角色的完整业务闭环。压缩包共1071个文件约31.7MB以JSP页面、Java类、XML配置、JS/CSS前端资源及GIF演示图为主并附数据库脚本与支付宝接口文件便于本地部署和二次开发。系统除常规用户注册登录、公告查看、知识产权检索外还实现免费/付费资料下载含租借时长、申报结果公示、员工审核与失败反馈等典型场景管理员可维护员工、用户、公告及付费下载内容角色权限分离清晰。资源运行于JDK1.8、Tomcat7、Maven3.3.9等常用环境已有238人学习下载适合需要完整项目参考、理解SSM整合流程与在线付费下载模块的读者使用。1. 知识产权管理系统一份SSMJSP完整源码能解决什么问题拿到一个“java项目之知识产权管理系统完整源码ssmmysqljsp.zip”很多人第一反应是解压、导入IDE、点运行然后对着404页面发半小时呆。这套系统的定位其实很清晰它是一个典型的JavaWeb后台管理系统业务对象是专利、商标、著作权这些知识产权客体技术栈锁定在SSMSpringSpringMVCMyBatisMySQLJSP数据访问用MyBatis页面渲染用JSPJSTL。它适合三类人正在做毕设或课程设计的学生、准备Java面试需要拿完整项目讲业务链路的初级工程师、以及要给公司快速搭一个内部流程管理后台的开发。你能从这套源码里得到的不只是“能跑”而是一整套从登录鉴权到多表写入、从请求路由到列表分页的成熟写法——很多做法在面试题里被问过无数次但只有真正读一遍代码才知道答案长什么样。2. 拆解技术栈与业务SSM三件套在这个系统里各管什么拿到压缩包之后先别急着点运行先搞清楚SSM三个框架在知识产权管理系统里的分工后面改代码、换页面、加功能时才不会迷路。2.1 Spring容器与事务申报流程为什么离不开声明式事务知识产权管理系统的核心业务不是单表增删改查而是一连串跨表操作。以专利申请为例用户提交一份申请系统要同时写入申请表主记录、发明人明细、费用记录还要生成一条待审核的操作日志。如果写第三张表时SQL报错前面两张表的数据已经落库了下次查列表就会出现“有费用但没申请单”的脏数据。Spring容器在这个工程里做的第一件事是统一管理数据源、SqlSessionFactory、Service层Bean和事务管理器。常见做法是在spring.xml里配置DataSource和transactionManager然后在Service实现类上打Transactional注解。我一般会把事务边界放在Service层而不是Controller层因为Controller只负责收参数和返回视图Service才是业务规则的执行者。一次申报动作涉及的多张表写入要么全部成功要么全部回滚。Service public class PatentApplyServiceImpl implements PatentApplyService { Autowired private PatentApplyMapper patentApplyMapper; Autowired private PatentInventorMapper inventorMapper; Autowired private PatentFeeMapper feeMapper; Transactional(rollbackFor Exception.class) public int submitApply(PatentApplyVO vo) { // 1. 插入申请主表拿到自增主键 patentApplyMapper.insertApply(vo); int applyId vo.getApplyId(); // 2. 批量插入发明人明细依赖主键做关联 inventorMapper.batchInsert(vo.getInventors(), applyId); // 3. 写入首年年费记录状态为待缴费 feeMapper.insertFirstYearFee(applyId, vo.getFeeAmount()); return applyId; } }这段代码里最关键的是Transactional(rollbackFor Exception.class)。rollbackFor指定了运行时异常和一般异常都触发回滚不写这个参数的话Spring默认只在RuntimeException时回滚SQLException这类受检异常不会自动回滚很容易出现事务“假成功”。初学者最容易犯的错就是把Transactional加到Controller方法上Controller被SpringMVC代理事务虽然能生效但事务粒度太粗一个请求里所有操作都绑在一起并发高峰期锁持有时间过长不推荐。2.2 SpringMVC请求路由与JSP视图一次完整请求的流转路径SSM项目的请求链路是固定的浏览器发起HTTP请求Tomcat根据web.xml里配置的DispatcherServlet把请求交给SpringMVCHandlerMapping找到对应的Controller方法方法执行完返回一个逻辑视图名ViewResolver拼接出物理JSP路径JSP引擎渲染后把HTML回给浏览器。这个系统里的知识产权业务都会遵循同样的路由模式。比如访问“专利列表页”URL是/patent/listController方法里return一个patent/list字符串InternalResourceViewResolver配置的prefix是/WEB-INF/views/suffix是.jsp实际渲染的就是/WEB-INF/views/patent/list.jsp。Controller RequestMapping(/patent) public class PatentController { Autowired private PatentApplyService patentApplyService; RequestMapping(/list) public String list(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, Model model) { // 分页查询申请列表结果放进Model PageResultPatentApplyVO page patentApplyService.queryApplyPage(pageNum, pageSize); model.addAttribute(page, page); // 这个字符串会被ViewResolver解析成 /WEB-INF/views/patent/list.jsp return patent/list; } }注意return的字符串不能以/开头也别写.jsp后缀这两件事都交给ViewResolver处理。项目里如果出现“Controller明明返回了视图名但页面就是404”的情况多半是prefix或suffix配错了。还有一个细节WEB-INF目录下的JSP页面不能通过URL直接访问这样设计是为了防止用户绕过Controller直接打开页面也是这套系统把JSP放进WEB-INF而不是webapp根目录的原因。2.3 MyBatis的SQL边界多表联查和条件拼接写在哪一层更合理知识产权管理系统的列表页几乎都是条件查询按专利类型过滤、按申请状态过滤、按申请日期范围过滤、按关键词模糊搜标题。这类需求如果用JDBC硬拼SQL会非常痛苦MyBatis的where和if标签就是为这种场景设计的。常见做法是Controller只接收查询参数Service做参数校验和默认值填充真正的SQL写在Mapper XML里。动态SQL的边界划在Service层——组装查询条件对象Mapper只负责根据条件对象拼接SQL。不要在Controller里写任何SQL片段也不要为了复用把查询条件直接传成MapMap会让SQL的可读性大幅下降后面维护的人根本不知道key叫什么。select idselectApplyPage resultTypecom.xxx.entity.PatentApply SELECT a.id, a.title, a.type, a.status, a.create_time FROM patent_apply a where if testtype ! null and type ! AND a.type #{type} /if if teststatus ! null and status ! AND a.status #{status} /if if testkeyword ! null and keyword ! AND a.title LIKE CONCAT(%, #{keyword}, %) /if if teststartDate ! null AND a.create_time gt; #{startDate} /if if testendDate ! null AND a.create_time lt; #{endDate} /if /where ORDER BY a.create_time DESC /selectXML里的where标签会自动处理AND前缀第一个条件成立时不会把AND拼到最前面这是MyBatis最实用的一个特性。CONCAT(%, #{keyword}, %)比直接写%${keyword}%安全后者存在SQL注入风险这个系统里凡是用户输入的内容都应该用#{}传参。gt;和lt;是XML里对和的转义不转义的XML文件在Idea里直接飘红Tomcat启动时解析XML也会报错——看到这里报错别慌不是SQL语法问题是XML转义问题。3. 把源码跑起来IDEATomcatMySQL的本地部署全流程这一章是照着做就能跑通的部分。我默认你在Windows上操作用的IDE是IDEA数据库客户端是Navicat或者命令行都行。3.1 前置环境对齐JDK、Maven、Tomcat版本怎么选SSM是2015年前后最流行的组合这套技术栈对版本非常敏感。我在本地跑老项目用的稳定组合是JDK 8、Maven 3.6.x、Tomcat 8.5或9.0、MySQL 5.7或8.0。如果你的机器装的是JDK 17大概率会在启动时遇到JSP编译报错或者Bean创建异常因为老项目里很多反射和字节码操作没做过高版本兼容。先别急着升级老老实实装一个JDK 8在IDEA里把Project SDK和Modules的Language Level都切成8。Maven的版本不需要太新3.6.3足够关键是conf/settings.xml里的镜像配置。默认中央仓库在国内下载很慢一个spring-webmvc的jar可能要下载几分钟。常见做法是把镜像换成阿里云公共仓库这个放后面坑点里细说。Tomcat不要用10.xTomcat 10把javax.servlet改成了jakarta.servletSSM项目的依赖全是基于javax的直接用会报ClassNotFoundException: javax.servlet.Filter。3.2 导入工程与认识目录结构从一个zip到可运行工程解压zip后先看根目录确认里面有pom.xml。有pom.xml说明是Maven工程这是最省心的导入方式。如果是.classpath和.project文件那是Eclipse工程IDEA导入前需要用Maven重新构建。我一般这么做# 解压后进入项目根目录先看一眼目录结构 cd knowledge-property-system ls -la # 执行Maven的依赖下载和编译验证工程是否完整 mvn clean compile -DskipTestsmvn clean compile这一步非常关键它会把pom.xml里的依赖全部拉下来并暴露出缺依赖、依赖冲突、Java编译级别不对等问题。第一次执行大概需要几分钟看到BUILD SUCCESS再进入IDEA。如果BUILD FAILURE先把报错信息中的jar包名字记下来用mvn dependency:tree查看是哪个依赖传递引入的后面第5章会细说。IDEA打开工程后重点看三个目录src/main/java放Java源码src/main/resources放Spring配置、MyBatis映射文件和properties数据库配置src/main/webapp放JSP页面、js、css和web.xml。这三个目录必须被IDEA标记为对应的Sources Root、Resources Root和Web Resources Directory否则编译时找不到类启动时找不到页面。3.3 初始化数据库执行SQL脚本的顺序与连接配置项目的db或sql目录下通常有一个init.sql或knowledge_property.sql里面建库、建表、插初始数据。执行顺序有讲究先建库再建表先建主表再建关联表。如果脚本里用了外键顺序反了会直接报错。我用命令行执行一般是这样的mysql -uroot -p123456进入MySQL后执行CREATE DATABASE IF NOT EXISTS knowledge_property DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE knowledge_property; SOURCE D:/knowledge-property-system/sql/init.sql;utf8mb4一定要和项目里jdbc.properties的characterEncoding对应。老项目脚本里如果写的是utf8数据库表里存emoji会变问号但中文没问题可以不动。初始化完成后用SHOW TABLES;看一眼核心表有没有建出来重点看patent_apply和sys_user这两张表一个有业务数据一个管登录。然后打开src/main/resources下的jdbc.properties有的项目叫db.properties核对数据库连接参数jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/knowledge_property?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456如果你是MySQL 5.7驱动类名可以保持com.mysql.jdbc.Driver如果是MySQL 8.0必须改成com.mysql.cj.jdbc.Driver并且连接串里加上serverTimezone和allowPublicKeyRetrieval。密码改成你自己的。这四条配置是项目连不上数据库时最先要核对的内容。3.4 发布到Tomcat并验证从404到首页出现的排查顺序IDEA里部署SSM项目我一般不用spring-boot的内嵌Tomcat方式而是走传统的External Tomcat war exploded。操作路径是Run → Edit Configurations → 点加号 → Tomcat Server → Local在Deployment页签里点加号选择Artifact选项目名:war explodedApplication context填/。填/的意思是访问根路径直接进登录页填/kp就需要通过http://localhost:8080/kp/login.jsp访问这个看个人习惯我建议填/少一层路径。启动前先确认Tomcat的JMX端口没被占用启动后看IDEA控制台日志重点等这一行Deploying web application archive ...以及最后出现的Server startup in [xxxx] milliseconds启动成功后先用命令行验证HTTP响应别急着开浏览器curl -I http://localhost:8080/login.jsp返回200 OK说明Tomcat对JSP的解析正常。如果返回404检查webapp目录下是否真的存在login.jsp以及Artifact的output directory是不是指向了target下的exploded目录——这是IDEA部署老项目最常见的翻车点代码改了但Tomcat跑的还是旧文件补丁打在了别人身上。4. 核心代码阅读路径从登录拦截到专利申报的一条完整链路系统能跑起来之后下一步是读代码。建议不要按目录顺序读而是按一条业务链路读我选的是“登录→权限拦截→专利申报→列表回显”这条主线它覆盖了SSM项目里最常见的四种代码形态。4.1 登录与权限拦截拦截器还是Filter老项目更依赖哪种方式知识产权系统里不同角色权限不同管理员能审核专利普通用户只能提交和查看自己的记录。老SSM项目里做登录验证和权限控制最常见的是SpringMVC的HandlerInterceptor配在spring-mvc.xml里比Servlet的Filter更贴近业务层因为能直接拿到Handler对象判断是哪个Controller方法。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { // 未登录重定向到登录页 response.sendRedirect(request.getContextPath() /login.jsp); return false; } return true; } }mvc:interceptors mvc:interceptor !-- 拦截所有请求 -- mvc:mapping path/**/ !-- 放行登录和静态资源 -- mvc:exclude-mapping path/login.jsp/ mvc:exclude-mapping path/user/login/ mvc:exclude-mapping path/css/**/ mvc:exclude-mapping path/js/**/ mvc:exclude-mapping path/images/**/ /mvc:interceptor /mvc:interceptorspreHandle返回false请求就终止了直接用sendRedirect跳回登录页。exclude-mapping是必须的不然用户还没登录登录页面本身的css和js也被拦了——页面会变成纯文字样式残废。这里有个容易混淆的点JSP页面放在WEB-INF下时浏览器直接访问不到登录页所以登录页通常放在webapp根目录或者单独配一个放行的Controller跳转。4.2 专利申报的保存流程Controller-Service-Mapper三层的数据流从页面上填一张专利申报表到数据库里多了三条记录中间经过的三层代码是SSM项目的骨架。Controller收参数不写业务逻辑Service管事务和组装数据Mapper只做单表或明确的多表操作。Controller RequestMapping(/patent) public class PatentApplyController { Autowired private PatentApplyService patentApplyService; RequestMapping(/save) public String save(PatentApplyVO vo, HttpSession session) { // 从Session里拿当前登录用户作为申请人 SysUser loginUser (SysUser) session.getAttribute(loginUser); vo.setUserId(loginUser.getUserId()); // 默认状态待审核 vo.setStatus(1); patentApplyService.submitApply(vo); // 保存成功后重定向到列表防止表单重复提交 return redirect:/patent/list; } }两个关键点。第一save方法接收的PatentApplyVO是表单对象的直接映射SpringMVC会自动把请求参数里的title、type、inventors绑定到VO的同名字段所以JSP里表单控件的name属性必须和VO字段名一致否则绑定出来的对象全是null。第二return用redirect:而不是直接返回JSP视图是为了解决刷新页面重复提交的问题——PRG模式Post/Redirect/Get在这里落地了这是JavaWeb面试题里的高频考点。PatentApplyVO里如果包含发明人列表表单里的name要写成inventors[0].name、inventors[1].name这种下标格式SpringMVC才绑得进去。很多人在这一步翻车表单提交后后端收到的发明人列表是空的但主表数据却保存成功了——排查时先从浏览器Network里看请求参数是不是这种数组格式。4.3 JSP页面的数据回显EL表达式与JSTL的配合方式数据保存进数据库后列表页要把数据库记录回显到表格里。SSM项目的JSP页面通常不写Java脚本片段% %而是用EL表达式${...}取数据配合JSTL的c:forEach循环渲染表格行。% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % % taglib prefixfmt urihttp://java.sun.com/jsp/jstl/fmt % table classtable table-hover thead tr th申请号/th th专利名称/th th类型/th th状态/th th申请日期/th /tr /thead tbody c:forEach items${page.list} varitem tr td${item.applyNo}/td td${item.title}/td td c:choose c:when test${item.type 1}发明专利/c:when c:when test${item.type 2}实用新型/c:when c:otherwise外观设计/c:otherwise /c:choose /td td${item.status 1 ? 待审核 : 已授权}/td tdfmt:formatDate value${item.createTime} patternyyyy-MM-dd HH:mm:ss//td /tr /c:forEach /tbody /tablepage.list来自Controller里放进Model的PageResult对象EL表达式会沿着getter方法自动取值。c:choose标签适合做多分支判断比嵌套的c:if可读性好得多。fmt:formatDate用来格式化日期否则数据库里的时间会显示成Tue May 14 10:24:33 CST 2024这种英文格式用户体验很差。JSP页面的坑集中在两处一是% taglib %指令漏写页面上c:forEach直接变成一行纯文本二是EL表达式在Servlet 2.4以下的web.xml里默认不开启老项目要检查web.xml的schema版本至少是2.5才能直接用${}——如果页面原样输出${item.title}多半就是这个问题。5. 部署与二次开发的避坑指南五个高频问题与排查顺序SSM项目部署和改造每一步都有固定套路但每一个套路都对应一个常见反例。下面这五个坑是我帮人看这类系统时遇到最多的每条都按“现象→原因→解决”的顺序说清楚。5.1 数据库连接失败时区、SSL、驱动版本三个老坑现象Tomcat启动时没有报错但页面一查列表就抛Communications link failure或者Access denied for user rootlocalhost。原因分成两类。一类是权限问题也就是Access denied此时用户名密码或远程访问权限不对root默认只允许localhost登录如果你改成%通配还要确认MySQL的mysql.user表里确实有对应记录。另一类是连接串问题error message是通信链路失败大概率是MySQL 8的驱动和连接参数没配对。解决优先按下面的连接串走一遍。serverTimezone必须指定否则驱动会拿本机时区跟MySQL会话对比差出8小时甚至直接报错useSSLfalse是关闭SSL握手本地开发没必要开allowPublicKeyRetrievaltrue是MySQL 8驱动第一次连接时获取公钥的必要参数。jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/knowledge_property?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password你的密码5.2 页面404但接口正常web.xml里DispatcherServlet的映射范围现象登录页面能打开但提交登录请求后跳转的页面404或者Controller里return的JSP页面找不到。原因DispatcherServlet的url-pattern配成了/*导致所有请求包括JSP页面的渲染请求都被DispatcherServlet接管而DispatcherServlet只能处理Controller看到JSP请求找不到对应的Handler直接404。正确配置是/这样只有非JSP请求才走SpringMVCJSP请求交给Tomcat的JSP引擎渲染。解决打开src/main/webapp/WEB-INF/web.xml把servlet-mapping的url-pattern改成/。改完后重启Tomcat注意是重启不是热部署web.xml的改动必须重启才能生效。5.3 中文乱码请求编码过滤器与连接串的字符集缺一不可现象页面显示中文正常但在输入框输入中文保存后数据库里变成???或者整个页面直接乱码。原因三处字符集设置有一处不一致就会出问题。第一处是JSP页面本身的pageEncoding第二处是请求的编码过滤器第三处是数据库连接串的characterEncoding和MySQL表字符集。最常见的是只配了页面编码没配Spring的CharacterEncodingFilterPOST请求里的中文在进入Controller前就是乱码。解决在web.xml里加下面这个过滤器并且forceEncoding必须为true否则只有GET请求会走编码转换POST请求还是会乱码。filter filter-namecharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-namecharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping另外确认MySQL表字符集用SHOW CREATE TABLE patent_apply;看DEFAULT CHARSET是不是utf8mb4不是的话执行ALTER TABLE CONVERT TO CHARACTER SET utf8mb4;。数据库连接串里的characterEncodingutf8也不要删两个地方必须同时满足中文才不会变问号。5.4 改了代码不生效IDEA热部署与Tomcat缓存目录现象改了Java代码重新编译后重启Tomcat页面还是旧逻辑或者改了JSP文件刷新浏览器没变化。原因IDEA里Tomcat部署方式选的是war整包部署每次都要重新打包增量改动没进war包另外浏览器缓存了旧的JSP渲染结果看起来像“代码没改”。解决部署方式改成war exploded简单说就是解压目录部署Tomcat直接跑target里的class和页面Java代码改动配合Update Classes就能热加载比整包方式调试效率高很多。JSP改动不需要重启直接刷新浏览器但要注意IDEA的Build Automatically是否开启没开启的话JSP改了也不会拷贝到target的webapp目录。二来浏览器强刷一次CtrlShiftR排除页面缓存干扰。这里最玄学的情况是代码看着改了但Tomcat的work目录里缓存了JSP的翻译类这种情况在Tomcat安装目录的work/Catalina下把对应项目目录删掉重启就好。5.5 Maven依赖解析失败镜像、私服与本地仓库的三角关系现象mvn clean compile时报Cannot resolve ...或者Could not find artifact org.springframework:spring-webmvc:jar:5.x。原因本地仓库没有这个jar同时Maven连接默认中央仓库超时或下载被中断。中央仓库对国内网络的稳定性一直不太理想下载到一半失败会产生.lastUpdated后缀的缓存文件导致后续重试仍然失败——这是Maven最磨人的一个毛病。解决修改Maven安装目录下conf/settings.xml的mirror配置加入阿里云镜像。mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror如果本地仓库里已经有坏掉的.lastUpdated文件光改镜像可能不生效因为Maven看到本地有记录就不重新下载了。删除本地仓库org/springframework目录下对应的失败文件再重新mvn clean compile。这个“删掉失败缓存再重下”的操作是Maven依赖问题的万能后悔药。6. 把管理系统源码改造成能拿得出手的样子三个低成本增强点系统跑通、代码读懂之后还需要做几处增强让这个知识产权管理系统在答辩或面试时能讲出亮点。三个改动都不大但每个都能拿出来单独讲几分钟。第一个增强点是把列表页的分页换成真正的分页组件。原生的SSM项目很多用RowBounds做假分页或者直接查全量数据一多性能就崩。常见做法是接入PageHelper一行插件配置加一行查询代码就能用。反映在代码里是这样Autowired private PatentApplyMapper patentApplyMapper; public PageResultPatentApplyVO queryApplyPage(int pageNum, int pageSize) { // PageHelper.startPage后面紧跟的第一个查询会被增强为分页SQL PageHelper.startPage(pageNum, pageSize); ListPatentApplyVO list patentApplyMapper.selectApplyByCondition(new PatentApplyQuery()); PageInfoPatentApplyVO pageInfo new PageInfo(list); return new PageResult(pageInfo.getList(), pageInfo.getTotal(), pageNum, pageSize); }第二个增强点是用定时任务做年费到期提醒。知识产权系统里专利年费是刚需业务每年要交一旦忘缴就失效。Spring的Scheduled注解就能实现这种场景不用引入Quartz复杂度可控。Component public class PatentFeeRemindTask { Autowired private PatentFeeMapper patentFeeMapper; // 每天上午9点执行一次扫描30天内到期且未缴费的记录 Scheduled(cron 0 0 9 * * ?) public void remindExpiringFees() { ListPatentFee list patentFeeMapper.selectExpiringFees(30); for (PatentFee fee : list) { // 这里只打印正式使用落消息或邮箱通知 System.out.println(专利 fee.getApplyNo() 年费即将到期截止日 fee.getDeadline()); } } }第三个增强点也是最占便宜的是把登录页换成当前主流的前端风格。SSM系统对应的JSP页面大多还停留在Bootstrap 3时代只改一个login.jsp引入原生CSS或者手写几个样式类整个项目的外观质感立刻不一样。JSP页面跟Vue/React不同它是服务端渲染所以改造成本极低——页面静态部分改样式动态部分继续用EL表达式原来怎么回显现在还怎么回显。如果不想在JSP里零散加样式也可以把公共导航抽成% include file/common/header.jsp %这种包含文件改一个文件全站生效。这套源码最值得投入的地方不在它本身多强大而在于它完整覆盖了JavaWeb从请求到数据库再到页面渲染的全链路。把第4章那条链路逐行读懂、把第5章那些坑亲手踩一遍你再去看Spring Boot项目时会觉得好多东西似曾相识因为SSM打底的那套MVC思想和事务边界换什么框架都没变过。我自己的习惯是每收到一套老源码先花半小时画一个“页面→Controller→Service→Mapper→表”的清单再动手改代码——这个习惯帮我避掉了好几次“改了三天发现改错模块”的尴尬。希望帮到你。本文还有配套的精品资源点击获取
返回列表