首页 / 资讯中心 / 文章详情

JSP专利管理系统案件管理模块的设计与实现

JSP专利管理系统案件管理模块的设计与实现 ★ FEATURED ARTICLE
1. 项目概述与技术定位1.1 核心需求解析做专利管理系统这类题目很多同学第一眼看到JSP就觉得是旧时代的东西但实际上高校的课程设计和毕业设计里JSPServletJavaBean这套组合依然是出镜率最高的方案。原因很简单一是教学体系里Java Web是必修主线二是这类项目需要的是看得见、摸得着的完整业务闭环而JSP这种服务端渲染模式天然适合展示型管理系统。这个项目的标题是JSP专利管理系统的设计与实现——案件管理模块关键词落在案件管理三个字上。专利管理系统说白了是对专利从申请、审查、授权到维护的全生命周期进行跟踪而案件管理就是这个生命周期里最核心的运转中枢。它管的不只是案件信息读读写写而是围绕一件专利从提交申请开始到中间的各种审查意见、费用缴纳、时限监控、文件归档等一系列操作。所以这个模块绝不是简单做个增删改查而是要能支撑起专利代理人和流程管理人员日常处理案件的工作台。从交付物来看程序源码数据库调试部署开发环境意味着这是一个完整可跑通的毕设或课设项目不是PPT式的概念设计。也就是说下面所有内容都要能落到实际运行的系统上代码能启动、页面能访问、数据库能初始化。1.2 整体功能边界案件管理模块在专利系统里通常承担哪些职责我梳理一下案件登记新专利申请案件的立案录入包括申请号、申请日、案件名称、申请人信息、代理人分配等。案件状态跟踪从新立到审核中到已递交再到审查中授权驳回终止等状态流转。期限监控专利案件对期限非常敏感比如优先权期限、答复审查意见的期限、缴费期限逾期会导致权利丧失。文件管理每个案件关联的官方来文、客户指示、内部工作文档等需要上传归档。案件查询与统计支持按申请号、案件名称、代理人、状态等多条件检索并有简单的统计看板。操作日志谁在什么时间对案件做了什么操作留痕可追溯。这些功能组合在一起才能支撑一个真实的专利代理机构或企业知识产权部门的日常流程。如果只做一个简单的案件信息表格CRUD那这个设计在答辩时很容易被老师追问到答不上来。2. 系统架构与设计思路拆解2.1 为什么选JSPServletJavaBean三层的组合先说说技术选型的考虑。这个项目名字里直接写了JSP所以表现层已经定死了。但在配套的架构上我推荐的是经典的Model 2架构也就是MVC模式的JSP变体JSP只负责视图渲染Servlet承担控制器JavaBean作为模型层。数据访问单独抽一层DAO不直接写在Servlet里。可能有人觉得这个架构老但对一个管理信息系统来说这种分层有几个实打实的好处职责分离清晰JSP里不写业务逻辑只做数据展示和表单交互页面维护成本低。Servlet作为控制器统一接收请求、调用业务方法、控制页面跳转流程清晰出问题好排查。JavaBeanDAO封装数据库操作一个案件相关的业务方法可以被多个Servlet复用避免代码重复。答辩时架构图好画老师一听就能明白项目的技术含金量也立得住。对比直接硬写JSP脚本片段那种把数据库连接写在JSP页面里的做法这种分层虽然前期代码量多一点但后期改动和维护的体验完全不一样。我自己带过的很多学生项目就是因为在JSP里直接写了一堆JDBC代码到了加功能的时候页面乱成一团改一个字段要翻三四个文件。2.2 案件状态机设计案件管理最核心的业务逻辑是状态流转。我给这个模块设计了一套状态机状态之间存在明确的转换关系而不是一个简单的字符串字段。状态定义新立案件刚录入还没开始处理。审核中内部质检人员正在核对案件信息。待递交已完成内部审核等待向官方提交。已递交申请文件已提交官方。审查中官方已经受理进入实审或形式审查阶段。答复中收到审查意见代理人正在准备答复文件。授权官方已下发授权通知。驳回案件被驳回。终止案件权利终止可能是驳回生效、视为撤回或者主动放弃。这些状态不是随便定义的每一个都对应专利案件生命周期里的真实节点。状态转化的触发条件在代码里做控制比如只有新立能转审核中已递交才能转审查中审查中可以转答复中也可以转驳回但答复中不能直接跳回新立。这种设计的好处有两个第一业务流程被代码强制约束用户不能随意乱改状态数据的可信度高第二状态之间的流转可以记录操作日志后期统计每个状态停留时间、案件处理周期都有数据支撑。2.3 数据库设计思路案件管理涉及的数据表我建议至少包含以下几张案件主表case_info存储案件的基本信息包括案件编号、申请号、申请日、案件名称、案件类型发明专利/实用新型/外观设计、当前状态、优先级等。主键使用自增ID同时维护一个唯一的业务编号比如CN年份流水号。申请人与发明人表case_parties一个案件可能对应多个发明人申请人和发明人分开存避免字段冗余。通过案件ID关联。代理人与分配表case_agency记录代理机构内部指派的代理人、流程人员以及分配时间和状态。案件文件表case_files存储案件相关的文档路径、上传人、上传时间、文件类型等。文件本身的二进制内容建议存服务器磁盘数据库里只存路径这样数据库体积可控备份也方便。期限任务表case_deadlines记录各类法定期限、指定期限包括期限类型、起始日期、截止日期、提醒状态、处理状态。操作日志表case_logs记录用户ID、案件ID、操作类型、操作内容、操作时间。这里有一个关键点案件主表不要把所有扩展信息都堆在一张表里。比如多个发明人、多个文件、多条期限记录这些如果用逗号拼接存到一个字段里后面做统计和关联查询会非常痛苦。宁可多建几张子表用外键关联也不要一开始图省事。3. 案件管理核心功能详细设计与实现3.1 案件登记功能实现案件登记是这个模块里用户每天都在用的功能。布局上分成几个区域申请人信息区、案件基本信息区、发明人信息区、代理人分配区。前端用表单提交后端Servlet接收后做数据校验再调用业务方法写入数据库。关键实现点表单重复提交问题。用户点一次保存按钮由于网络延迟或手误可能点好几次后端如果没做处理数据库里就会插入多条重复记录。解决方案很简单前端保存时把按钮置灰后端在insert前先校验申请号是否已存在做唯一性约束。申请号是专利案件的唯一业务标识这个号码必须做重复校验。我见过不止一个项目没做这个限制结果同一个申请号被录入两三次后面所有的统计和查询全乱套了。数据库层面不仅要建唯一索引代码里也要做一次判断双重保险。案件登记页面的核心字段清单字段类型说明案件编号VARCHAR(32)系统自动生成格式如CP2025序列号申请号VARCHAR(20)官方申请号全局唯一必填申请日DATE官方受理日期案件名称VARCHAR(200)与申请文件保持一致案件类型VARCHAR(10)发明专利/实用新型/外观设计当前状态VARCHAR(10)默认新立申请人VARCHAR(100)申请人名称代理人VARCHAR(50)分配的内部代理人账号备注TEXT可填写内部指示或补充说明3.2 案件列表与多条件检索案件列表不能只是简单地把所有数据拉出来分页显示。用户实际使用中检索频率最高的是申请号模糊查询、案件名称模糊查询、代理人的下拉筛选、状态的精确筛选以及申请日期的起始区间查询。这些检索条件最终要拼成动态SQL。手写拼接有一个坑如果条件为空就不应该出现在WHERE子句里。我的习惯是先用一个字符串列表收集条件片段最后统一拼接而不是一开始就写成固定模板ListString conditions new ArrayList(); ListObject params new ArrayList(); if (StringUtils.isNotBlank(caseNo)) { conditions.add(case_no LIKE ?); params.add(% caseNo.trim() %); } if (status ! null !status.isEmpty()) { conditions.add(status ?); params.add(status); } if (startDate ! null) { conditions.add(apply_date ?); params.add(startDate); } if (endDate ! null) { conditions.add(apply_date ?); params.add(endDate); } String whereSql conditions.isEmpty() ? : WHERE String.join( AND , conditions);这样写不仅安全防注入而且代码可读性很好后续加检索字段就加一个条件块不用改模板。列表页的每行操作按钮建议设计成查看详情、编辑、状态流转、上传文件、操作日志。一次把所有操作铺在列表上用户不用反复进详情页。3.3 案件详情页与状态流转操作详情页是案件管理模块的信息聚合中心。页面顶部放案件基本状态卡片展示当前状态、代理人、最近操作时间。中间分Tab展示详细信息、期限任务、关联文件、操作日志。状态流转在详情页里单独做成一个操作区域。用户点击状态流转按钮弹出一个下拉框列出当前状态下所有合法的目标状态选择后填写流转备注点击确认后状态更新并记录日志。后端实现状态流转时必须做合法性校验。不能信前端传什么就更新什么要维护一张状态流转规则表private static final MapString, ListString STATUS_TRANSITIONS new HashMap(); static { STATUS_TRANSITIONS.put(NEW, Arrays.asList(REVIEWING, TERMINATED)); STATUS_TRANSITIONS.put(REVIEWING, Arrays.asList(PENDING_SUBMIT, TERMINATED)); STATUS_TRANSITIONS.put(PENDING_SUBMIT, Arrays.asList(SUBMITTED, REVIEWING)); STATUS_TRANSITIONS.put(SUBMITTED, Arrays.asList(EXAMINING, REJECTED)); STATUS_TRANSITIONS.put(EXAMINING, Arrays.asList(RESPONDING, REJECTED, GRANTED)); STATUS_TRANSITIONS.put(RESPONDING, Arrays.asList(EXAMINING, TERMINATED)); STATUS_TRANSITIONS.put(GRANTED, Arrays.asList(TERMINATED)); STATUS_TRANSITIONS.put(REJECTED, Collections.emptyList()); STATUS_TRANSITIONS.put(TERMINATED, Collections.emptyList()); }这份流转规则表是整个案件管理模块的业务核心。运转正常时用户可能感受不到它的存在但它一旦缺失状态就可以任意跳转比如从新立直接跳到授权整个案件流程就失控了。3.4 期限监控与预警专利案件管理里最怕的就是错过期限。比如答复审查意见的期限是发文日起四个月内缴费期限是授权通知日起两个月内逾期未处理直接导致权力丧失这是没法挽回的损失。所以案件管理模块里的期限监控功能并不是锦上添花而是刚需中的刚需。实现方案是每种期限类型在系统中配置一个默认的期限模板。比如答复审查意见的默认期限是120天年费缴纳是当月最后一天。在案件进入对应状态时系统自动生成一条期限记录起始日期设为状态变更当天截止日期按模板自动计算。这些期限记录生成之后还需要一个任务调度来自动检查到期情况。在JSP这种传统Web项目里可以用一个监听器在项目启动时启动一个定时任务比如每天凌晨扫描一次数据库把一周内到期和已过期的案件提取出来在系统登录后的首页做醒目的提醒列表。这样的实现不需要引入额外框架用JDK自带的定时任务就能完成。我自己在实际项目里测试过期限提醒不要只做一次最好分三个梯度提前30天提醒、提前7天紧急提醒、过期立即提醒。代理人看到的感受完全不同。只做一次提醒的话很容易在忙碌中被淹没。3.5 文件上传与下载管理案件关联文件的上传后端接口要注意几个细节文件重命名、文件类型限制、文件大小限制、上传目录按案件汇总。前端Form表单里enctype必须设成multipart/form-data用Commons FileUpload或Servlet 3.0的Part接口接收。我在项目里用的是Servlet 3.0自带的Part接口配合注解配置上传路径MultipartConfig(location tmp, maxFileSize 50 * 1024 * 1024, maxRequestSize 60 * 1024 * 1024)文件落到磁盘时不要把原始文件名直接用容易造成中文乱码和路径冲突。我习惯用UUID重新生成存储名原始文件名存到数据库表里下载时再把原始名设置回去。String storedName UUID.randomUUID().toString().replace(-, ); String originalName part.getSubmittedFileName(); String storePath uploadBase File.separator caseId File.separator storedName;根据caseId做一个子目录一是避免单目录文件过多影响IO性能二是导出或备份的时候可以直接按案件整体拷贝。下载时的中文文件名处理是文件下载功能里最容易翻车的地方String encodedName URLEncoder.encode(originalName, UTF-8).replace(, %20); response.setHeader(Content-Disposition, attachment; filename\ encodedName \; filename*UTF-8 encodedName);这样写兼容了老版本浏览器和新版本浏览器中文文件名不容易变成下划线或乱码。4. 环境搭建与调试部署全流程4.1 开发环境组合与版本匹配这是整个项目中坑最多的地方。JSP项目最怕的就是环境版本不匹配Tomcat版本、JDK版本、MySQL驱动版本任何一个不兼容都可能导致项目起不来或者跑起来之后莫名报错。我推荐一套稳定组合JDK 1.8稳定、兼容性好市面上大多数老项目都在这个版本。Tomcat 8.5 或 9.0Servlet 3.1/4.0规范支持Part接口上传完美匹配JDK 1.8。MySQL 5.7InnoDB引擎事务支持完善教学和中小项目首选。Eclipse 或 IntelliJ IDEAIDEA对Maven项目更友好但JSP传统项目两个都能用。数据库驱动mysql-connector-java 5.1.49对应MySQL 5.7或者8.0版本配cJdbc驱动串。一个常见的坑用MySQL 8.0的驱动连接MySQL 5.7连接串里Driver类要写com.mysql.cj.jdbc.Driver并且URL后面要加serverTimezoneAsia/Shanghai否则会报时区错误。用5.1.x的驱动则写com.mysql.jdbc.Driver不需要时区参数。两套配置别混着用混了就起不来。4.2 数据库初始化脚本编写数据库脚本是整个项目能否顺利跑起来的前置条件。建议把所有建表和初始数据的SQL放到一个init.sql文件里提交的时候一起给到。这样别人拿到项目后直接用命令行或Navicat导入就能跑不需要手动去建表。案件管理模块的核心建表脚本我写出如下结构CREATE TABLE case_info ( id INT NOT NULL AUTO_INCREMENT COMMENT 主键ID, case_no VARCHAR(32) NOT NULL COMMENT 案件编号, apply_no VARCHAR(20) NOT NULL COMMENT 申请号, apply_date DATE DEFAULT NULL COMMENT 申请日, case_name VARCHAR(200) NOT NULL COMMENT 案件名称, case_type VARCHAR(10) NOT NULL COMMENT 案件类型, status VARCHAR(20) NOT NULL COMMENT 当前状态, applicant VARCHAR(200) DEFAULT NULL COMMENT 申请人, agent_id INT DEFAULT NULL COMMENT 代理人ID, remark TEXT COMMENT 备注, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_apply_no (apply_no), KEY idx_case_no (case_no), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT案件主表;这里说两个细节字符集建议直接用utf8mb4不要在utf8上纠结。utf8mb4是utf8的超集能存emoji排序规则用general_ci就够了。另外每个表都要有create_time和update_time虽然是老生常谈但我见过太多项目没有这两个字段后面排查数据问题只能干瞪眼。申请号字段建唯一索引非常关键。上面说过这是全局业务唯一标识不建唯一索引数据库层面就没法兜底防止重复录入。4.3 项目部署到Tomcat的步骤实际的部署流程走一遍大概是这样第一步把项目打包成WAR包。如果用的是IDEA在Build菜单里执行Build Artifacts选择项目对应的WAR即可。如果用的Eclipse右键项目Export为WAR文件。第二步把WAR包拷到Tomcat的webapps目录下。启动Tomcatbin目录下的startup.batWindows或startup.shLinuxWAR包会自动解压。启动完之后访问http://localhost:8080/项目名/能看到首页就说明部署第一步成功。第三步如果项目里配置了数据源要检查conf目录下server.xml或者项目自己的context.xml里的数据库连接参数与实际环境是否一致。直接用JDBC连接池的项目最常见的问题就是密码改了没同步连接池初始化报错Tomcat启动时能看到无法获取连接的异常。这里有一个特别实用的调试经验Tomcat启动后第一时间打开logs目录下的catalina.out或localhost.YYYY-MM-DD.log查看有没有报错。大多数人部署完直接刷页面发现404或500就开始蒙了其实日志里早就把原因写清楚了。养成启动后先看日志的习惯排查效率能提升一大半。4.4 数据库连接配置的常见写法JDBC工具类是JSP项目里被打开最多次的文件之一。连接参数不要硬编码在Java代码里而是放在一个配置文件里比如jdbc.propertiesjdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/patent_sys?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456代码里用静态代码块加载配置private static Properties props new Properties(); static { try (InputStream in DBUtil.class.getClassLoader().getResourceAsStream(jdbc.properties)) { props.load(in); Class.forName(props.getProperty(jdbc.driver)); } catch (Exception e) { e.printStackTrace(); } }使用数据库连接池也能让系统在高并发下更稳定。在传统JSP项目里可以配置Druid或者C3P0如果不想引入额外包用Tomcat自带的JNDI数据源也是一种方式。但对课程设计和毕业设计来说写一个简单的单例连接池工具类就够用了没必要上太重的东西。5. 常见问题与调试排查实录5.1 中文乱码问题乱码是JSP项目出现频率最高的问题没有之一。源头有四处JSP页面编码、Servlet读取请求参数编码、数据库连接编码、数据库表字符集。任何一处不一致都会乱码。排查顺序建议从前往后看。先确认JSP页面顶部的page指令% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %再确认Servlet或者Filter里设置了请求和响应的编码request.setCharacterEncoding(UTF-8); response.setContentType(text/html; charsetUTF-8);然后看数据库连接URL有没有带characterEncodingutf8最后看建表语句的charset是否utf8mb4。这四处都对齐之后乱码问题基本不会出现。在实际项目里我发现一个规律很多人只在JSP页面里设置了UTF-8但Servlet里没有设置request的编码结果表单提交的中文到了后端全变问号。Servlet设置请求编码这一步最容易被漏掉。5.2 JDBC驱动加载失败报ClassNotFoundException: com.mysql.jdbc.Driver是新手最常见的错误。原因一般是驱动JAR包没有放到WEB-INF/lib目录下。检查方式展开项目里的WEB-INF目录确认mysql-connector-java-x.x.x.jar文件在lib文件夹里。如果项目是基于Maven管理的还要检查pom.xml里依赖的scope是否写了provided或test写了的话打包时驱动JAR就不会包含进WAR包部署到Tomcat自然就找不到类了。5.3 Tomcat端口被占用Tomcat默认8080端口被占用启动时报Address already in use。解决办法有两个一是杀掉占用进程Windows下用netstat -ano | findstr 8080查出PID再taskkill /F /PID二是改Tomcat端口在conf/server.xml里找到Connector节点把port改成8081或其他没有被占用的端口。这种问题在开发机和服务器上出现的频率都很高尤其是机器上已经装了其他Web服务或IDE自带的Tomcat时。改端口操作很简单但别忘了后端代码里如果定了回调地址或跳转链接也要同步改。5.4 静态资源404STS或CSS文件404优先看JSP页面里引用的路径写法。在JSP项目里建议所有静态资源引用都用绝对路径从项目根开始link relstylesheet href%request.getContextPath()%/css/style.css用相对路径很容易出现在外层目录的页面能访问、内层目录的页面样式丢失的情况。这个问题的本质是浏览器解析相对路径时基准URL不同导致的。另外如果项目配置了Servlet过滤器要检查过滤器是不是把CSS和JS的请求也拦截了。有些初学者在过滤器里统一做登录判断对静态资源也执行跳转结果样式表全被重定向到登录页页面变得奇丑无比。过滤器的排除路径里一定要加上/css、/js、/images这些静态资源目录。5.5 数据库连接池连接不上Tomcat上部署后如果控制台报Cannot create connection大概率是数据库本身没启动或者连接参数写错了。排查步骤先在本机命令行用mysql -u root -p测试连接是否正常再从Tomcat所在机器上用telnet测试数据库端口最后检查项目里的连接URL的IP、端口、库名和账号密码。很多同学在本地开发时用localhost连接没任何问题部署到另一台机器上就报连不上一查发现URL里写的是localhost而不是服务器的实际IP或者数据库所在IP。这种问题与实际项目的部署环境关系很大配置务必改成目标环境对应的值。还有一个隐蔽的坑数据库本身的max_connections满了导致新连接被拒绝。排查时用SHOW PROCESSLIST查看已建立的连接数如果接近上限考虑调整数据库配置或优化连接池的连接数设置。6. 个人实操心得与经验总结做这类JSP管理系统项目我自己的体会很直接技术本身不复杂复杂的是把业务流程理解到位再用代码把流程固化下来。案件管理模块尤其如此表面上是几张表的增删改查实际上每个状态字段、每条期限记录背后都有专利业务的约束。做项目的时候多花点时间把状态机画清楚、把表结构设计得合理一些后面写代码会顺很多。关于答辩或汇报层面有一个很实用的建议不要一上来就讲用了什么框架、什么数据库而是先从业务角度讲清楚专利案件的生命周期是什么样的、管理系统的核心痛点在哪里再落到我的系统怎么解决这些问题。这样的讲述逻辑比单纯念功能列表要打动人多。最后分享一个小技巧案件管理模块里的期限预警功能不要只做数据库扫描还可以配合登录首页的高亮提示和代理人的个人代办列表。一个代理人打开系统第一眼就能看到自己名下有哪些案件快要到期这比在案件列表里翻找要高效得多。这个设计在答辩时是一个亮点在实际使用中也确实能体现系统的实用价值。
阅读完成 · 觉得有帮助?
咨询建站