ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于WEB的毕业生网络招聘信息系统:JSP+JavaBean+JDBC三层架构源码深度解析

基于WEB的毕业生网络招聘信息系统:JSP+JavaBean+JDBC三层架构源码深度解析 简介面向高校Java毕业设计的网络招聘系统完整项目采用B/S三层结构与JSP、JavaBean、JDBC等主流技术围绕求职者、用人单位和管理员三类用户从登录认证、职位发布、简历投递到后台管理等环节进行设计兼具代码与文档双重参考价值适用于毕业设计参考、课程设计或自学练手。压缩包共312个文件大小约5.61MB主要包括105个Java源文件与其class编译文件、44个JSP页面、16个jar依赖库、17个CSS样式另附SQL建库脚本以及开题报告、中期检查、答辩材料等Word文档目录划分明确便于按模块学习。目前已有1269人浏览学习是一份高复用性的毕设参考资料。通过阅读源码可以系统掌握JSPJavaBeanJDBC的经典开发模式了解用户角色权限管理、招聘信息发布与检索、简历投递与处理等核心业务逻辑配套的文档资料能够帮助快速梳理课题背景、技术选型与实现方案为论文撰写和答辩准备提供参照尤其适合采用类似课题的毕业生。1. 基于WEB的毕业生网络招聘信息系统这个毕业设计源码包的真实分量基于WEB的毕业生网络招聘信息系统这个名字放在 Java 毕业设计里已经算得上经典选题了。整套资源包含源码、答辩材料、开题报告和中期检查核心目标是解决传统招聘信息不对称、流程繁琐的问题求职者注册账号、维护简历、搜索职位、投递意向用人单位发布岗位、筛选简历管理员在后台做数据审核和统计。技术栈是标准的 B/S 三层结构JSP 做页面展示、JavaBean 承载业务逻辑、JDBC 操作数据库没有花哨的框架反而更容易把请求到响应的每个环节讲清楚。适合两类人一类是正在准备 Java 课程设计或毕业设计、需要快速看懂并复现的同学另一类是刚接触 web 项目、想拆一个完整信息系统源码来理解三层结构的新手。这篇文章就从架构、类名映射表、部署步骤一路讲到避坑和扩展按一遍能跑通的标准写。2. 系统架构与技术选型B/S 三层结构、JSP JavaBean JDBC 为什么还能打2.1 三层结构拆解表现层、业务层、数据层各管什么B/S 三层结构拆开看浏览器负责展示页面Web 服务器处理请求数据库服务器做持久化。对应到代码JSP 是表现层JavaBean 是业务层JDBC 是数据访问层。这个项目在课设源码里加了一层 Servlet 做控制层EPHomeServlet、EPShowStoreServlet 这些类就是请求入口负责接收浏览器参数、调用业务对象、再转发给 JSP 渲染。这个模式放在现在的 Spring Boot 项目里依然能看到影子Controller 相当于当年的 ServletService 相当于当年的 JavaBean 业务方法DAO 层基本没变。拿到源码包第一反应往往是类太多、命名不统一其实按三层去归类就清晰了xxxServlet是控制层xxxDao是数据访问层xxx实体类是数据模型JSP 放在 WebRoot 或 webcontent 目录下。项目正文里 EPPostJobDao.class、JobIntentionDao.class 这一串 DAO 类把数据库操作全部封在了一起。这样做的好处是改表结构时只需要动对应的 DAO不用在 JSP 页面里到处找散落的 SQL 语句。很多课设源码最大的毛病就是把Connection写在 JSP 里而这个系统至少把数据访问单独抽了一层这是答辩时可以主动讲的点。从代码组织上看JavaBean 承担的是字段封装和业务封装双重角色。一部分 JavaBean 只做数据载体字段对应表结构比如职位实体里有职位编号、企业编号、职位名称、薪资范围另一部分 JavaBean 承担业务方法比如简历修改的逻辑会先校验必填项再调用 DAO。这种分工在课设级别已经够用更重要的是它符合教材里三层架构的标准描述答辩讲起来有得说。提示拆解这类老项目时先按「控制层 / 业务层 / 数据访问层」三个文件夹把类归好再读代码效率会高很多。2.2 从类名反推表结构与业务链路拿到课设源码我习惯先不看代码而是把所有 DAO 类名列出来反推数据库有哪些表。DAO 类基本对应一张主表一个类里通常是对这一张表增删改查的方法。把项目里的类名整理出来看数据表结构基本就能还原个大概。类名推断职责对应数据表EPPostJobDao企业职位发布、职位列表查询ep_post_jobJobIntentionDao求职意向维护job_intentionEPDataDao后台数据统计多表聚合BasicInfoDao基础信息增删改查basic_infoStuStoreDao学生收藏企业stu_storeEPStoreDao用户收藏职位ep_storeStuHandleModifyResume学生简历修改业务stu_resumeStuJobDetail学生职位详情查询多表联查命名上 EP 是 Enterprise 的缩写Stu 是 Student 的缩写Store 在这里表示收藏不是存储。这个命名习惯在早期课设里很普遍类名拆开读基本能猜到业务。比如 StuHandleModifyResume拆成 Stu / Handle / Modify / Resume意思就是学生处理简历修改。如果你打开数据库脚本发现表名略有差异以实际脚本为准但对应关系是明确的。以学生投递简历这条链路为例完整流程横跨了多张表学生先在 stu_resume 里完善简历再在 job_intention 里填写期望岗位和城市搜索职位时读取 ep_post_job点击职位详情时查 StuJobDetail收藏操作写入 stu_store投递动作本质上是往一张投递关系表里插入一条记录。这个链路里每一环都有对应的 DAO顺着请求参数往下追通常半天就能把整个系统摸明白。2.3 技术选型理由为什么这个组合放在今天依然有参考价值JSP JavaBean JDBC 是 Java Web 课程设计的标准答案。理由很现实结构清晰、门槛低、不依赖框架也能跑通全流程。Spring Boot 虽然现在更主流但它的自动配置和注解会让新手很难理解请求是怎么从浏览器走到数据库的。而这个项目里每一步都是显式的页面上写表单Servlet 里取参数DAO 里写 SQL返回结果再塞回 request 作用域。相比现在前后端分离的招聘网站这个系统的设计更像是能用的教学演示而不是能上线的生产系统。它最大的价值在于把 Java Web 的核心知识点全部串起来Servlet 生命周期、请求转发与重定向、JDBC 基础操作、preparedStatement 防注入、session 管理登录状态。这些知识点在面试时依然高频所以把它当成一个鲜活的 java 课程设计案例源码去看比当成生产级 web 项目去挑剔更有意义。技术选型上还要理解一个限制JSP 页面里直接写 Java 代码虽然方便但页面复杂后维护成本极高这也是后来衍生出 JSTL、EL 表达式再到前后端完全分离的原因。这个项目在 JSP 里是否用了 JSTL 取决于源码细节如果还是% %脚本片段那恰恰说明它是课设级别的典型风格改造空间也大具体改造思路放到最后一章讲。3. 核心功能落地三类用户的模块设计与 DAO 层实现3.1 求职者端简历维护、职位搜索与投递的实现顺序求职者端的核心流程是注册登录、维护简历、搜索职位、查看详情、投递简历。简历维护主要由 StuHandleModifyResume 完成职位搜索和详情由 StuJobDetail 配合 JobIntentionDao 完成。实际代码里最常写的是按学生 ID 查意向列表求职意向和简历基本是分开维护的一个学生可能有多条意向所以单独拆一张 job_intention 表是合理的。public ListJobIntention findIntentionByStudentId(int studentId) { ListJobIntention list new ArrayList(); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { conn DBUtil.getConnection(); String sql SELECT * FROM job_intention WHERE student_id ?; ps conn.prepareStatement(sql); ps.setInt(1, studentId); rs ps.executeQuery(); while (rs.next()) { JobIntention intention new JobIntention(); intention.setId(rs.getInt(id)); intention.setJobType(rs.getString(job_type)); intention.setCity(rs.getString(city)); intention.setSalary(rs.getString(salary)); list.add(intention); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } return list; }这段代码是课设里最常见的 DAO 写法逻辑不复杂但值得讲清楚PreparedStatement预编译不仅是为了防 SQL 注入更关键的是参数用占位符传递不需要手动拼接字符串避免了单引号和中文引号带来的拼接错误。参数说明里studentId是当前登录学生的自增主键job_type存岗位方向city存意向城市salary建议用字符串区间而不是纯数字因为一个学生的期望薪资大概率是「8k-12k」这种模糊区间存字符串最省事。关闭资源的顺序一定先是ResultSet、再Statement、最后Connection反了偶尔会出现数据库连接长时间占用也就是后面要说的连接泄漏问题。这个方法会被 Servlet 调用查询结果存到 request 作用域后转发给 JSP 渲染这就是表现层和数据访问层的协作关系。很多新手会在这里直接new JobIntentionDao()后调用这在课设里没问题但每次调用都创建一个新 DAO 实例严格来说不是一个好习惯建议改成单例或静态方法这个可以在答辩时作为改进点提出来。3.2 用人单位端职位发布、简历筛选的管理链路企业用户登录后EPPostJobDao 负责职位发布和职位列表管理。这类 DAO 的 insert 方法是最能看出代码水平的地方企业发布职位不只是往一张表插数据通常还要同步更新招聘场次、企业发布数等关联状态但课设里一般简化成只操作职位表。public boolean addPostJob(PostJob job) { Connection conn null; PreparedStatement ps null; try { conn DBUtil.getConnection(); String sql INSERT INTO ep_post_job (ep_id, job_name, job_type, job_desc, salary, publish_time) VALUES (?, ?, ?, ?, ?, NOW()); ps conn.prepareStatement(sql); ps.setInt(1, job.getEpId()); ps.setString(2, job.getJobName()); ps.setString(3, job.getJobType()); ps.setString(4, job.getJobDesc()); ps.setString(5, job.getSalary()); return ps.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } finally { DBUtil.close(null, ps, conn); } }这里的ep_id对应企业用户表的 ID不存企业名称的原因是名称可能被管理员审核后修改存 ID 才能保证修改后职位列表同步更新。publish_time用数据库的NOW()生成避免应用服务器和数据库服务器时间不一致导致发布时间不准。SQL 里特意把字段列表写全而不是用INSERT INTO ep_post_job VALUES (...)这样即使以后表结构新增字段这段 SQL 也不会因为字段数不匹配而报错。调试这段代码时最常见的翻车点是把字符串塞进了 int 字段比如job_type在表里定义成 int但页面传过来的是「Java开发」这样的文本。遇到这种情况不要急着改代码先看表结构设计是否合理职位类型这种字段本来就该用字符串或者用字典表映射。其次是executeUpdate()返回 0 的情况说明 SQL 执行成功但没有影响任何行常见原因是传入的ep_id在企业表里不存在外键约束没生效时尤其容易发生。3.3 管理员端基础信息维护、数据统计的实现思路管理员的功能本质上是用户表、职位表、公告表的增删改查外加一个数据统计。EPDataDao 承担统计职责这类统计代码在课设里普遍写得直白就是几个 count 查询拼起来。public int countPassedJob() { Connection conn null; PreparedStatement ps null; ResultSet rs null; try { conn DBUtil.getConnection(); String sql SELECT COUNT(*) FROM ep_post_job WHERE status 1; ps conn.prepareStatement(sql); rs ps.executeQuery(); if (rs.next()) { return rs.getInt(1); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, ps, conn); } return 0; }注意status字段的约定1 表示已审核通过0 待审核2 已下线。课设代码里最常见的隐患是页面上直接写死数字比如 JSP 里写c:if test${job.status 1}一旦业务方调整状态位含义全页面都要改。规范做法是在常量类里定义STATUS_PASS 1DAO 和页面都引用常量。这个点非常小但答辩时主动提出来比讲一堆框架概念更有说服力。统计类的查询不需要复杂优化数据量在万级以内单表 count 都很快。但要注意COUNT(*)和COUNT(1)在 MySQL 里性能差异可以忽略不要在这上面浪费精力。真正需要注意的是统计查询里如果不带任何过滤条件页面上展示的数据会随着测试数据增多越来越大所以管理员端最好加上时间范围筛选或分页源码里有没有做取决于具体版本如果没有这是现成的改进方向。3.4 Servlet 接收请求到响应闭环以 EPHomeServlet 为例Servlet 是连接前端页面和 DAO 的桥梁。以 EPHomeServlet 为例它本质上是一个控制器根据客户端传的action参数决定执行哪个分支。这个模式在原生 Servlet 编程里非常典型几乎所有课设项目都长这样。protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String action request.getParameter(action); EPPostJobDao dao new EPPostJobDao(); if (list.equals(action)) { ListPostJob jobList dao.findPassedJob(); request.setAttribute(jobList, jobList); request.getRequestDispatcher(/job_list.jsp).forward(request, response); } else { response.sendRedirect(request.getContextPath() /login.jsp); } }第一行设置请求编码是中文不乱码的前提request.getParameter(action)取的是 URL 里?actionlist的参数。list分支里查询已通过审核的职位列表放进 request 作用域后转发到 job_list.jsp。forward和sendRedirect的区别很重要forward 是服务端内部跳转地址栏不变request 作用域里的数据在 JSP 里能拿到sendRedirect 是浏览器跳转相当于重新发起一次请求request 里的数据会丢。这段代码里new EPPostJobDao()每次请求都创建一个实例在课设里无伤大雅但面试官如果问起来可以说改成单例或通过工厂获取顺便引出 Spring 的依赖注入思想。request.getContextPath()返回的是项目部署后的根路径比如/recruitment拼上/login.jsp才能正确跳转直接写死/login.jsp部署时容易 404这是很多新手容易忽略的细节。4. 从源码到跑起来环境配置、部署步骤与验收清单4.1 环境准备JDK、Tomcat、MySQL 的组合建议这套源码用的是原生 JSP 和 JDBC环境组合非常关键。推荐组合是 JDK 1.8 Tomcat 8.5 MySQL 5.7。JDK 1.8 是目前兼容性最好的版本老项目里很多代码依赖 JDK 8 才有的特性高版本反而容易出问题。Tomcat 8.5 对应 Servlet 3.1 规范能完整支持 JSP 和 Servlet 编译。最需要注意的是别用 Tomcat 10 以上因为 Tomcat 10 把javax.servlet包改成了jakarta.servlet老代码里import javax.servlet.*会直接编译报错这个坑我见过太多次。MySQL 5.7 是比较稳妥的选择8.0 在连接驱动上略有差异如果源码里的Class.forName(com.mysql.jdbc.Driver)用的是老驱动在 8.0 上虽然能用但会提示警告部分版本还可能出现时区问题。环境变量方面安装 JDK 后需要配置JAVA_HOME把%JAVA_HOME%\bin加到 PATH 里。Tomcat 解压即用启动前确认CATALINA_HOME没配错否则启动脚本会找不到目录。提示下载 Tomcat 时选择 zip 版本而不是 installer解压到纯英文路径目录里带中文或空格会导致启动异常。4.2 导入项目和导入数据库IDEA 与 Eclipse 的差异早期课设源码大多为 Eclipse 设计用 IDEA 导入时需要注意差异。Eclipse 里项目根目录就是 Web 项目的默认布局IDEA 导入时要手动设置 Web 资源目录、编译输出目录和 Artifact 打包方式。具体步骤是File → New → Project from Existing Sources选择源码根目录然后File → Project Structure → Facets里添加 Web把 Web Root 指向存放 JSP 的目录再在Artifacts里添加 exploded 形式这样部署时才会把 JSP 和 class 文件一起打包输出。数据库导入相对简单用 Navicat 或命令行都可以。命令行导入是最通用的方式mysql -u root -p recruitment.sql如果 SQL 脚本里已经带CREATE DATABASE语句就不用手动建库如果没有必须先登录 MySQL 手动创建数据库再执行导入。导入后建议用工具检查一下表数量和数据量确认关键表如用户表、职位表至少有测试数据因为源码里的登录账号、演示数据通常都依赖脚本初始化没有数据等于白部署。4.3 数据库连接配置从 DBUtil 类到参数修改项目里数据库连接统一封装在 DBUtil 类中是全局唯一需要改数据库账号密码的地方。这个类在课设里绝大多数是静态方法加静态代码块也可以通过配置文件读取连接信息取决于具体版本。public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/recruitment?useUnicodetruecharacterEncodingUTF-8; private static final String USERNAME root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }useUnicodetrue和characterEncodingUTF-8是解决中文乱码的一对关键参数缺一个都可能出现表单提交中文变问号的问题。URL 里的recruitment是数据库名必须和导入脚本时创建的库名一致。USERNAME和PASSWORD改成你自己本机的 MySQL 账号。不同 MySQL 版本驱动类名有差异5.7 及以下用com.mysql.jdbc.Driver8.0 推荐改成com.mysql.cj.jdbc.Driver但相应 jar 也要换这个后面避坑章会展开。4.4 部署到 Tomcat 并启动常见失败信号与验收清单在 IDEA 里配置好 Artifact 后直接添加 Tomcat Server 运行配置Deployment 里选择项目的 exploded 包Application context 设置为/recruitment。启动成功后浏览器访问http://localhost:8080/recruitment/首页能打开就说明基本通了。如果 404多半是 Application context 和访问路径不一致或者部署里忘加 artifact。项目跑通之后按下面的验收清单逐项过一遍这同时也是答辩时要演示的功能路径。功能点测试方式预期结果学生注册登录注册新账号再登录能注册成功登录后跳转学生首页简历维护在个人中心编辑简历字段保存后重新进入页面数据未丢失且无乱码职位搜索输入关键词或城市搜索返回匹配职位列表职位投递在职位详情页点击投递提示投递成功企业端能看到投递记录企业发布职位企业账号登录后发布新岗位前台职位列表出现新职位管理员审核用管理员账号修改职位状态审核通过的职位前台可见审核不通过则下架收藏功能学生收藏一个职位再查看收藏列表收藏记录正确展示数据统计查看管理员后台统计页职位数、用户数等数值与库内数据一致一组测试账号通常会在数据库脚本里初始化比如管理员 admin、企业 ep001、学生 stu001具体密码看脚本注释。如果没有初始化脚本需要手动往用户表里插入测试数据注意密码字段如果做了 MD5 加密插入的值也要是加密后的密文。5. 常见问题避坑乱码、ClassNotFound、连接失败怎么排查5.1 页面中文全是问号改了 JSP 编码也没用现象所有页面上数据库里查出来的中文正常但 JSP 静态文字或表单提交的中文变成问号。原因三层编码没对齐。JSP 文件保存的编码、JSP 页头声明的pageEncoding、Tomcat 处理请求的编码、数据库连接的字符集参数四个地方只要有一个不一致就会出乱码。最容易被忽略的是 Tomcat 的 URI 编码参数GET 请求里的中文参数如果在 server.xml 里没配置URIEncodingUTF-8解析出来就是乱码。解决先把 JSP 页头统一为pageEncodingUTF-8然后在 server.xml 的 Connector 标签加上URIEncodingUTF-8再确认 DBUtil 连接串里带了characterEncodingUTF-8。发现是 GET 请求乱码而 POST 正常问题基本就在 Tomcat 的 URIEncoding反过来 POST 乱码问题多半在request.setCharacterEncoding(UTF-8)没有放在取参数之前。5.2 ClassNotFoundException: com.mysql.jdbc.Driver现象Tomcat 能启动但访问任意涉及数据库的页面控制台报ClassNotFoundException: com.mysql.jdbc.Driver。原因mysql-connector-java.jar 没有放到WEB-INF/lib目录下或者 IDEA 里 jar 不在构建路径中。这是课设项目最常见的部署问题Eclipse 里可能依赖了本地 classpath换到 IDEA 或重新部署后构建路径失效。解决把 mysql-connector-java.jar 复制到项目的WEB-INF/lib目录下然后重新编译部署。在 IDEA 里还要确认 jar 已被识别为库右键 jar 选择Add as Library。另一种隐蔽情况是项目里放了一个旧版本驱动 jar但只支持 MySQL 5.x连 8.0 数据库时也会抛异常这种情况换 8.x 对应驱动并同步把类名改为com.mysql.cj.jdbc.Driver。5.3 数据库连接报 Connection refused: connect现象控制台抛Communications link failure或Connection refused: connect页面直接 500。原因四种可能按概率排序是 MySQL 服务没启动、数据库端口不是 3306、用户名密码错误、数据库不存在。其中端口问题很容易被忽略如果本机装过多个 MySQL 或用过 Docker端口可能被改成了 3307 或随机映射。解决先用命令行netstat -ano | findstr 3306确认端口在监听再用 Navicat 或命令行用同样的账号密码试连一次。能连上说明 DBUtil 的 URL 或参数有问题连不上说明账号密码或服务有问题。注意连接串里localhost:3306中间是英文冒号曾经见过有同学输入成中文冒号导致连接失败的这类问题看错误日志时最容易忽略。5.4 部署后访问 404项目名怎么都对不上现象Tomcat 启动成功首页能访问但访问http://localhost:8080/recruitment/时 404或者访问项目内某个页面 404。原因部署的 Application context 路径和实际访问路径不一致。IDEA 的 Deployment 里 Artifact 如果没有显式设置 Application context默认可能是根路径或另一个名字。另一个原因是项目里用response.sendRedirect(login.jsp)没有加request.getContextPath()前缀导致跳转地址偏差。解决在 IDEA 的Run → Edit Configurations → Deployment里Application context 统一改成/recruitment重启后再访问。项目里凡是sendRedirect和getRequestDispatcher的地方路径统一用request.getContextPath()拼接避免部署路径变化后跳转失效。排查时先点开 Tomcat 控制台看实际部署路径再去浏览器按实际路径访问比瞎猜快得多。5.5 JSP 修改不生效改完刷新还是旧页面现象修改的 JSP 内容在浏览器里刷新后完全没变化甚至删掉页面还能访问。原因Tomcat 默认开发模式下 JSP 会热加载但 IDEA 里如果没有重新编译或者部署方式是打包成 war 再发布修改的 JSP 不会同步到 Tomcat 的工作目录。浏览器那边也可能缓存了旧页面尤其是 CSS 和 JS 修改后刷新不强制清空缓存就看不到变化。还有一种情况是部署时把 JSP 复制到了 Tomcat 的webapps下但项目修改后没有重新打包旧文件还在。解决IDEA 里部署模式选 exploded 而不是 war这样每次编译后修改过的 JSP 会直接同步到 Tomcat 输出目录。修改后强制刷新浏览器Windows 下是CtrlShiftRMac 下是CmdShiftR。如果还是旧页面打开 Tomcat 的webapps目录看 JSP 文件时间戳确认是否真的更新了没更新就手动复制一次再刷新。6. 改造扩展把课设级 web 项目往工程级推一步6.1 用连接池替换裸 JDBC 的第一步改造裸 JDBC 最明显的瓶颈是每次请求都新建连接、用完关闭在高并发场景下性能消耗很大。改造第一步是把 DBUtil 里的DriverManager.getConnection换成 Druid 连接池代码改动集中在 DBUtil 一个类里其他 DAO 全部不用动是性价比最高的改进。public class DBUtil { private static DruidDataSource dataSource; static { dataSource new DruidDataSource(); dataSource.setDriverClassName(com.mysql.jdbc.Driver); dataSource.setUrl(jdbc:mysql://localhost:3306/recruitment?useUnicodetruecharacterEncodingUTF-8); dataSource.setUsername(root); dataSource.setPassword(123456); dataSource.setInitialSize(5); dataSource.setMaxActive(20); dataSource.setMinIdle(5); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }initialSize是启动时预创建的连接数maxActive是最大活跃连接数minIdle是最小空闲连接数。这三个参数是连接池的核心设置太小会导致高并发时等待连接太大又浪费数据库资源。课设项目用默认初始 5、最大 20 足够了。改造后所有 DAO 类里的DBUtil.getConnection()调用方式不变但关闭连接时不再物理断开而是还给连接池复用这个原理答辩时一定要讲清楚面试官非常吃这一套。6.2 把 JSP 里的 Java 代码块分流出去如果源码里的 JSP 页面用了% %脚本片段可以去看看凌乱程度。改造思路是引入 JSTL 标签库和 EL 表达式把脚本片段换成标签。比如原来 JSP 里循环输出职位列表的% for (...) { %可以换成c:forEach items${jobList} varjob。这个改造的价值是让页面只做展示业务逻辑全部上收到 Servlet 或 JavaBean 层也是往 web 前端开发规范靠拢的一步。改造时需要引入jstl.jar和standard.jar两个包JSP 顶部加% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %。6.3 答辩和面试时怎么讲这个项目才有亮点这个项目用到的技术虽然传统但亮点不在技术多新而在思路完整。建议从三层架构的边界讲起重点说两个点一是为什么要用 PreparedStatement 而不是 Statement借此引出 SQL 注入的 web 安全问题二是为什么要用 DAO 层封装数据库操作借此引出接口设计的思路。面试官追问连接泄漏、事务管理时能接得住项目分就不会低。从那以后我每次接手课设源码都强制自己先画一张类名与数据表的对应图再动手改代码这套习惯帮我节省了大量翻代码的时间。如果你卡在环境配置或类名对应关系上按这个顺序去排查大概率能少走很多弯路希望帮到你。本文还有配套的精品资源点击获取
返回列表