资讯动态

JSP投稿系统实战:Tomcat6+MySQL5.1专家审稿闭环

发布时间:2026/10/6 6:15:53 来源:尧图企业网站定制
简介本资源是一份面向计算机专业本科生的毕业设计文档聚焦科技期刊在线投稿系统开发实践解决传统邮寄与邮件投稿效率低、易丢失、反馈慢等痛点。文档完整呈现基于B/S架构的JSP网上投稿系统设计方案涵盖需求分析、数据库设计SQL Server、前后端实现ASP平台Dreamweaver MX页面JavaScript连接逻辑、管理员与作者双角色功能流程投稿-审稿-反馈-发布一体化并附有摘要、目录、关键词及中英文对照内容。资源为单个367KB的DOC文档结构规范含绪论、系统分析、功能模块说明等典型毕设章节适合课程设计参考、Web开发入门实践与毕业论文写作借鉴。目前已有92人学习下载内容详实、技术路径清晰可直接用于理解中小型Web应用开发全流程与期刊信息化管理落地场景。1. 这不是毕业设计“作业”而是一套能跑通的 JSP 投稿系统含专家审稿闭环、MySQL 数据库脚本、Tomcat6 兼容部署包新手照着ConnectionManager.java改三行就能连上本地库你手头这份《基于 Jsp 的网上投稿系统设计与实现专家审稿》文档不是那种只画流程图、贴伪代码、最后连数据库都连不上的“纸面系统”。它是一份真实可运行的 B/S 架构 Web 工程落地笔记——从 Windows 7 Tomcat 6 MySQL 5.1 的老环境兼容性设计到专家登录后能查稿、填意见、触发邮件通知虽未实现 SMTP 发送但预留了editor_option字段再到CheckServlet验重 前端 JS 表单校验的双保险机制全部落在实处。它解决的是编辑部最痛的三个点作者投完稿石沉大海、专家审稿靠微信/邮件来回扯皮、主编在 Excel 里手动更新稿件状态。整套系统用 2 张表用户表 稿件表、不到 20 个 JSP 页面、一个ConnectionManager.java就撑起投稿-分发-审稿-反馈的最小闭环。如果你正被课程设计卡在“数据库连不上”“JSP 报 500 错误”“专家页面点不开”上或者想拿它改造成期刊官网的投稿模块这份文档就是你缺的那块板子——它不讲高大上的微服务只告诉你jdbc:mysql://localhost:3306/online_submation这串 URL 为什么必须写对、% page contentTypetext/html;charsetUTF-8%这行声明漏了会中文变乱码、input typefile上传的 Word 文件怎么存进content字段实际是存路径。别被标题里的“毕业设计”吓退这玩意儿比你想象中更糙、更真、更能救急。2. 为什么选 JSP 而不是 Spring Boot从 Tomcat6 兼容性、MySQL 驱动版本到ConnectionManager.java的三处硬编码改造2.1 选型真相不是技术先进而是环境锁死——Windows 7 Tomcat 6 JDK 1.6 的“铁三角”倒逼架构选择这份系统没用 Spring Boot不是因为作者不懂新框架而是文档里白纸黑字写着开发环境“操作系统Microsoft Windows 7”“WEB服务器Tomcat6.0”“jdk1.6”。这三个组件构成了一个典型的教育场景封闭生态高校机房批量部署的老旧虚拟机、教师要求的“必须能在教室电脑上跑起来”、学生没有权限安装新版本软件。Tomcat 6 对应 Servlet 2.5 规范它不支持WebServlet注解所有 Servlet 必须在web.xml里硬编码注册JDK 1.6 没有try-with-resources所以ConnectionManager.close()方法里那一长串if(rs!null){rs.close();}才显得如此原始又必要。MySQL 方面文档明确用的是com.mysql.jdbc.DriverMySQL Connector/J 5.x 驱动而非新版的com.mysql.cj.jdbc.Driver。这意味着如果你直接把项目丢进 IntelliJ IDEA 2024 或 Eclipse 2023第一件事不是写代码而是降级驱动——下载mysql-connector-java-5.1.47.jar官方最后支持 JDK 1.6 的版本扔进WebContent/WEB-INF/lib/目录。这不是技术倒退而是工程落地的第一课先跪着适配环境再站着优化架构。我当年帮学弟部署时就因用了 8.x 驱动在 Tomcat 启动日志里看到ClassNotFoundException: com.mysql.cj.jdbc.Driver折腾两小时才翻到文档末尾的DBDRIVERcom.mysql.jdbc.Driver这行注释。2.2ConnectionManager.java三处硬编码决定你能否连上数据库这个类是整个系统的数据命脉但它也是最容易翻车的雷区。文档里给出的代码是教学简化版实际部署必须改三处package com.common; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectionManager { // 【必须改第1处】驱动类名确认你的 mysql-connector-java 版本 public static String DBDRIVER com.mysql.jdbc.Driver; // 【必须改第2处】数据库URLlocalhost 可能要换成 127.0.0.1端口3306要确认MySQL是否在运行 public static String DBURL jdbc:mysql://localhost:3306/online_submation; // 【必须改第3处】账号密码root/root 是默认值但你的MySQL很可能改过密码 public static String DBUSER root; public static String DBPASS root; Connection conn null; PreparedStatement pstm; public ConnectionManager() { try { Class.forName(DBDRIVER); // 加载驱动 } catch (ClassNotFoundException e) { System.out.println(加载数据库驱动失败); e.printStackTrace(); } try { this.conn DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 建立连接 } catch (SQLException e) { System.out.println(创建数据库连接失败); e.printStackTrace(); } } public Connection getConnection() { return this.conn; } public static void close(ResultSet rs, PreparedStatement prs, Statement sta, Connection conn) { try { if (rs ! null) rs.close(); if (prs ! null) prs.close(); if (sta ! null) sta.close(); if (conn ! null) conn.close(); } catch (Exception e) { System.out.println(close error); } } }提示改完这三处后别急着启动 Tomcat。先打开命令行执行mysql -u root -p登录你的 MySQL然后输入SHOW DATABASES;确认online_submation库是否存在。如果不存在必须按文档 3.4 节手动建库建表——这是新手 80% 卡住的起点。2.3 数据库建表脚本字段类型陷阱与VARCHAR(255)的真实含义文档表 3.1 和 3.2 给出了字段定义但没给建表 SQL。根据ConnectionManager中的DBURL和字段描述我补全了可直接执行的脚本注意MySQL 5.1 默认存储引擎是 MyISAM非 InnoDB-- 创建数据库UTF8 编码防中文乱码 CREATE DATABASE IF NOT EXISTS online_submation CHARACTER SET utf8 COLLATE utf8_general_ci; -- 使用数据库 USE online_submation; -- 用户信息表注意lim 字段名是权限标识非 limit 关键字 CREATE TABLE user_info ( uid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, uname VARCHAR(20) DEFAULT NULL, upswd VARCHAR(20) DEFAULT NULL, sex VARCHAR(10) DEFAULT NULL, phone VARCHAR(20) DEFAULT NULL, address VARCHAR(100) DEFAULT NULL, lim INT DEFAULT 0 -- 0:作者, 1:主编, 2:专家 ); -- 稿件信息表关键content 字段存摘要非全文expert_option/editor_option 存审稿意见文本 CREATE TABLE manuscript_info ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) DEFAULT NULL, content TEXT DEFAULT NULL, -- 改为 TEXT避免 VARCHAR(255) 截断长摘要 author VARCHAR(50) DEFAULT NULL, time VARCHAR(90) DEFAULT NULL, phone VARCHAR(30) DEFAULT NULL, type VARCHAR(200) DEFAULT NULL, expert_option TEXT DEFAULT NULL, editor_option TEXT DEFAULT NULL, status TINYINT DEFAULT 0 -- 0:待审, 1:通过, 2:退修, 3:拒稿文档没提但业务必需 );注意文档中content VARCHAR(255)是严重隐患。摘要常超 255 字符必须改为TEXT。status字段是我在manuscript_info表里加的因为专家审稿后必须标记状态否则主编无法知道哪篇稿子审完了。这个字段在后续 JSP 页面逻辑里会用到比如admin_list.jsp中WHERE status0查待审稿。2.4 JSP 页面编码contentType和pageEncoding双保险否则中文全是问号所有.jsp文件顶部必须有这两行缺一不可% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head meta charsetUTF-8 title专家审稿页面/title /head body !-- 页面内容 -- /body /htmlcontentTypetext/html; charsetUTF-8告诉浏览器用 UTF-8 解析 HTMLpageEncodingUTF-8告诉 JSP 引擎用 UTF-8 读取.jsp文件本身如果只写contentType而文件保存时是 GBK 编码Windows 记事本默认JSP 引擎读入的就是乱码再怎么response.setCharacterEncoding(UTF-8)都救不回来。我见过太多人在这儿栽跟头页面显示“新建稿件”其实是“新建稿件”的 UTF-8 字节被当 GBK 解析了。解决方案只有两个1用 Notepad 或 VS Code 把所有.jsp文件另存为 UTF-8 无 BOM 格式2确保web.xml里jsp-config没有覆盖pageEncoding。3. 专家审稿功能落地从登录鉴权、稿件分发逻辑到expert_option字段的提交与回显3.1 专家登录鉴权lim2是唯一门票session.setAttribute()是状态传递核心专家能进系统不是靠用户名密码正确就行关键是user_info.lim字段值必须为2。登录成功后的LoginServlet.java文档没给全但逻辑必然是会做这件事// LoginServlet.java 伪代码需你补全 String sql SELECT * FROM user_info WHERE uname? AND upswd?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { int userLevel rs.getInt(lim); // 获取权限等级 if (userLevel 2) { // 专家权限 HttpSession session request.getSession(); session.setAttribute(uid, rs.getInt(uid)); // 存用户ID session.setAttribute(uname, rs.getString(uname)); // 存用户名 session.setAttribute(userLevel, userLevel); // 存权限等级 response.sendRedirect(expert_main.jsp); // 跳转专家首页 } else if (userLevel 1) { response.sendRedirect(admin_main.jsp); // 主编页 } else { response.sendRedirect(author_main.jsp); // 作者页 } } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); }避坑 / 常见问题 / 排查现象 1专家登录后跳转到作者页面或直接 404原因user_info.lim字段值不是2而是0作者或1主编。数据库里专家账号的lim值没手动改成2。解决用 MySQL 客户端执行UPDATE user_info SET lim2 WHERE unameexpert1;现象 2专家页面显示“欢迎null”原因session.setAttribute(uname, ...)没执行或expert_main.jsp里session.getAttribute(uname)返回 null。常见于LoginServlet没正确 forward或web.xml中 servlet-mapping 路径写错导致请求没进 Servlet。解决在LoginServlet的doPost开头加System.out.println(LoginServlet executed);看 Tomcat 控制台是否打印检查web.xml中servlet-mapping的url-pattern是否为/login。现象 3专家能查看所有稿件而非仅主编分发给自己的原因expert_list.jsp查询语句没加WHERE条件过滤。文档图 3.2 说“只有当主编指明分发给自己时才能查看”但没给 SQL。解决expert_list.jsp中查询必须带AND m.expert_id ?需在user_info表加expert_id字段或AND m.editor_assign_to ?推荐manuscript_info表加editor_assign_to INT字段存专家 uid。SQL 示例SELECT * FROM manuscript_info m WHERE m.status0 AND m.editor_assign_to?。3.2 稿件分发逻辑主编后台的assign_expert.jsp是专家功能的前提文档只说了“主编分发给自己的稿件”但没给分发页面代码。这是专家模块能跑起来的前置条件。你需要补一个assign_expert.jsp放在 admin 目录下让主编能选专家并绑定稿件!-- assign_expert.jsp -- % page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% % page importjava.sql.* % % // 获取当前稿件ID从上一页传过来如 ?id123 String mid request.getParameter(id); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { Class.forName(com.mysql.jdbc.Driver); conn DriverManager.getConnection(jdbc:mysql://localhost:3306/online_submation, root, root); // 查询所有专家lim2 String sql1 SELECT uid, uname FROM user_info WHERE lim2; ps conn.prepareStatement(sql1); rs ps.executeQuery(); % form actionAssignExpertServlet methodpost input typehidden namemid value%mid% 选择专家select nameexpert_uid % while(rs.next()) { % option value%rs.getInt(uid)%%rs.getString(uname)%/option % } % /select input typesubmit value分发 /form % } catch (Exception e) { e.printStackTrace(); } %对应的AssignExpertServlet.java处理分发// AssignExpertServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String mid request.getParameter(mid); String expertUid request.getParameter(expert_uid); Connection conn null; PreparedStatement ps null; try { Class.forName(com.mysql.jdbc.Driver); conn DriverManager.getConnection(jdbc:mysql://localhost:3306/online_submation, root, root); // 更新稿件表指定专家 String sql UPDATE manuscript_info SET editor_assign_to? WHERE id?; ps conn.prepareStatement(sql); ps.setString(1, expertUid); ps.setString(2, mid); ps.executeUpdate(); response.sendRedirect(admin_list.jsp?msg分发成功); } catch (Exception e) { e.printStackTrace(); response.sendRedirect(admin_list.jsp?msg分发失败); } finally { if (ps ! null) try { ps.close(); } catch (SQLException e) {} if (conn ! null) try { conn.close(); } catch (SQLException e) {} } }3.3 专家审稿意见提交expert_option字段的增/改/查全流程专家在expert_review.jsp页面填写意见后提交到ReviewServlet核心是更新manuscript_info表// ReviewServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String mid request.getParameter(mid); // 稿件ID String opinion request.getParameter(opinion); // 审稿意见文本 String statusStr request.getParameter(status); // 状态1通过,2退修,3拒稿 int status Integer.parseInt(statusStr); Connection conn null; PreparedStatement ps null; try { Class.forName(com.mysql.jdbc.Driver); conn DriverManager.getConnection(jdbc:mysql://localhost:3306/online_submation, root, root); // 更新意见和状态 String sql UPDATE manuscript_info SET expert_option?, status? WHERE id?; ps conn.prepareStatement(sql); ps.setString(1, opinion); ps.setInt(2, status); ps.setString(3, mid); ps.executeUpdate(); // 可选给作者发站内通知简单版更新 author_notice 字段 // String noticeSql UPDATE user_info SET notice? WHERE uid(SELECT author_uid FROM manuscript_info WHERE id?); response.sendRedirect(expert_list.jsp?msg提交成功); } catch (Exception e) { e.printStackTrace(); response.sendRedirect(expert_list.jsp?msg提交失败); } finally { if (ps ! null) try { ps.close(); } catch (SQLException e) {} if (conn ! null) try { conn.close(); } catch (SQLException e) {} } }expert_review.jsp页面需包含隐藏域传mid以及意见输入框!-- expert_review.jsp -- form actionReviewServlet methodpost input typehidden namemid value${param.mid} label审稿意见/label textarea nameopinion rows10 cols50${manuscript.expert_option}/textareabr label处理结果/label input typeradio namestatus value1 checked 通过 input typeradio namestatus value2 退修 input typeradio namestatus value3 拒稿br input typesubmit value提交审稿意见 /form避坑 / 常见问题 / 排查现象 1提交后expert_option字段为空原因textarea的nameopinion和ReviewServlet中request.getParameter(opinion)名字不一致或前端 JS 有onsubmitreturn false;阻止了提交。解决用浏览器开发者工具F12→ Network → 查看 Form Data确认提交的参数名和值检查页面是否有event.preventDefault()。现象 2专家能看到自己之前填的意见但刷新后消失原因expert_review.jsp没从数据库查expert_option值textarea${manuscript.expert_option}/textarea中的manuscript对象没在 request 或 session 中设置。解决在expert_review.jsp顶部加 Java 代码查数据库或用 JSTLc:forEach从 request 属性取值。现象 3多个专家审同一稿意见互相覆盖原因manuscript_info表只有一个expert_option字段无法存多轮意见。解决新增review_history表id,manuscript_id,expert_id,opinion,time每次审稿都 INSERT 一条记录而非 UPDATE。这是业务扩展的必经之路。4. 前端交互玄学AJAX 验重、JS 表单校验与CheckServlet的生死时速4.1CheckServlet用户名实时验重的底层逻辑与response.getWriter().print()的妙用文档 4.2 节贴了一段 JS 代码调用CheckServlet?unamexxx但没给 Servlet 实现。这个 Servlet 是注册页用户体验的关键——它必须极快返回true或false不能有延迟。核心在于查库要快输出要极简。// CheckServlet.java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname request.getParameter(uname); response.setContentType(text/plain;charsetUTF-8); // 设置响应类型为纯文本 PrintWriter out response.getWriter(); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { Class.forName(com.mysql.jdbc.Driver); conn DriverManager.getConnection(jdbc:mysql://localhost:3306/online_submation, root, root); String sql SELECT COUNT(*) FROM user_info WHERE uname?; ps conn.prepareStatement(sql); ps.setString(1, uname); rs ps.executeQuery(); rs.next(); int count rs.getInt(1); if (count 0) { out.print(false); // 用户名已存在 } else { out.print(true); // 用户名可用 } } catch (Exception e) { e.printStackTrace(); out.print(false); // 出错也返回 false保证前端逻辑不崩 } finally { if (rs ! null) try { rs.close(); } catch (SQLException e) {} if (ps ! null) try { ps.close(); } catch (SQLException e) {} if (conn ! null) try { conn.close(); } catch (SQLException e) {} out.close(); } }注意response.setContentType(text/plain;charsetUTF-8)是灵魂。如果写成text/htmlIE 浏览器可能解析失败如果漏了charsetUTF-8中文用户名验重会出错。out.print(true)不带换行、不带引号JS 的xmlHttp.responseText才能直接比较true。4.2 前端 JS 校验checkPass()里的密码长度陷阱与 DOM 元素获取方式文档 JS 代码里有document.getElementById(inputPass).value这是正确的。但新手常犯的错是写成document.getElementByName(inputPass).value少了个s应为getElementsByName且返回数组在onblur事件里调用checkPass()但inputPass元素还没渲染出来JSP 生成 HTML 顺序问题完整健壮的校验函数应这样写function checkPass() { var password document.getElementById(inputPass); if (!password) { console.log(元素 inputPass 未找到); return false; } var pwdValue password.value.trim(); // 去除首尾空格 if (pwdValue ) { document.getElementById(pass).innerHTML 密码不能为空; return false; } if (pwdValue.length 6) { // 文档说“最少6位”这里用 6 更准确 document.getElementById(pass).innerHTML 密码最少6位; return false; } document.getElementById(pass).innerHTML ; // 清空提示 return true; } // 绑定到输入框的 onblur 事件HTML 中 // input typepassword idinputPass onblurcheckPass() /4.3 AJAX 请求的onreadystatechange状态机为什么readyState4和status200必须同时成立文档 JS 里xmlHttp.onreadystatechangecheckUseridCallback;是标准写法但新手常忽略status200判断。readyState4只表示请求完成但可能是 404页面没找到、500服务器错误、甚至网络中断。必须双重校验function checkUseridCallback() { // readyState 4 DONE, status 200 OK if (xmlHttp.readyState 4 xmlHttp.status 200) { var text xmlHttp.responseText; if (text false) { flag false; document.getElementById(msg).innerHTML 此用户名已经注册; } else if (text true) { flag true; document.getElementById(msg).innerHTML ; } else { // 服务器返回了非 true/false 的内容视为错误 document.getElementById(msg).innerHTML 验证异常; } } else if (xmlHttp.readyState 4) { // 请求完成但状态码非200 document.getElementById(msg).innerHTML 网络错误请重试; console.log(HTTP Error: xmlHttp.status); } // readyState 4 时什么也不做 }避坑 / 常见问题 / 排查现象 1输入用户名后“正在验证...”一直不消失原因xmlHttp.onreadystatechange没触发或触发了但readyState永远不等于 4。常见于xmlHttp.open()的 URL 写错如CheckServlet拼成CheckSevlet或web.xml中 servlet-mapping 的url-pattern和 JS 调用的 URL 不匹配。解决在CheckServlet的doGet开头加System.out.println(CheckServlet called with unameuname);看控制台是否打印用浏览器 Network 面板看该请求的 Status 是否为 200。现象 2AJAX 返回true但页面提示“此用户名已经注册”原因xmlHttp.responseText包含不可见字符如 BOM、换行符texttrue为 false。解决在CheckServlet中out.print(true.trim())在 JS 中var text xmlHttp.responseText.trim();。现象 3Chrome 控制台报错Access to XMLHttpRequest at xxx from origin null has been blocked by CORS policy原因你双击 HTML 文件用file://协议打开而非通过 Tomcat 的http://localhost:8080/访问。AJAX 不允许跨协议请求。解决必须把项目部署到 Tomcat用http://localhost:8080/yourproject/login.jsp访问。5. 部署即崩溃Tomcat6 启动失败、JSP 编译报错、MySQL 连接拒绝的终极排查清单5.1 Tomcat6 启动失败java.lang.OutOfMemoryError: PermGen space是 Windows 7 机房经典病Tomcat 6 默认 JVM 参数对现代应用太小。在bin/catalina.batWindows或catalina.shLinux里找到JAVA_OPTS行修改为set JAVA_OPTS-Xms512m -Xmx1024m -XX:PermSize256m -XX:MaxPermSize512m -Dfile.encodingUTF-8-Xms512m初始堆内存 512MB-Xmx1024m最大堆内存 1024MB-XX:PermSize256m永久代初始大小Tomcat6 用 PermGen非 Metaspace-XX:MaxPermSize512m永久代最大大小提示改完后重启 Tomcat。如果还报错说明你的JAVA_HOME指向了 JDK 1.8它已移除 PermGen必须切回 JDK 1.6 或 1.7。5.2 JSP 编译报错org.apache.jasper.JasperException: Unable to compile class for JSP这是新手最懵的错误。根本原因是 JSP 引擎找不到javax.servlet等类。解决方案确认Tomcat6.0/lib/servlet-api.jar已在项目构建路径中MyEclipse 里右键项目 → Properties → Java Build Path → Libraries → Add External JARs严禁把servlet-api.jar复制到WebContent/WEB-INF/lib/这会导致类冲突。检查web.xml头部是否为 Servlet 2.5 规范?xml version1.0 encodingUTF-8? web-app xmlnshttp://java.sun.com/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd version2.55.3 MySQL 连接被拒绝java.sql.SQLException: Communications link failure这不是密码错而是网络层不通。按顺序排查MySQL 服务是否运行Windows 服务管理器里找MySQL51确保状态是“正在运行”。端口是否被占命令行执行netstat -ano | findstr :3306看 PID 是否对应 mysqld.exe。防火墙是否拦截临时关闭 Windows 防火墙或添加入站规则放行 3306 端口。MySQL 是否允许远程连接登录 MySQL 执行USE mysql; SELECT host, user FROM user WHERE userroot; -- 看 host 是否为 localhost 或 % -- 如果是 localhost执行 UPDATE user SET host% WHERE userroot AND hostlocalhost; FLUSH PRIVILEGES;5.4 中文乱码终极方案四层编码统一从浏览器到数据库每一层都可能出乱码层级配置位置正确值浏览器JSP 第一行% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%UTF-8Tomcatconf/server.xml中Connector标签加URIEncodingUTF-8URIEncodingUTF-8MySQL 连接ConnectionManager.java中DBURL加?useUnicodetruecharacterEncodingUTF-8jdbc:mysql://localhost:3306/online_submation?useUnicodetruecharacterEncodingUTF-8MySQL 数据库创建库时CREATE DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci;utf8避坑 / 常见问题 / 排查现象 1页面显示正常但数据库里存的是乱码原因DBURL缺少?useUnicodetruecharacterEncodingUTF-8参数。解决改ConnectionManager.java中的DBURL。现象 2数据库里存的是中文但 JSP 页面显示乱码原因pageEncoding和contentType没写或写成了GBK。解决确认所有.jsp文件顶部都有pageEncodingUTF-8。现象 3GET 请求中文参数如?name张三在 Servlet 里是乱码原因Tomcat 默认用 ISO-8859-1 解码 URL。解决在Servlet的doGet开头加request.setCharacterEncoding(UTF-8);或在server.xml的Connector加URIEncodingUTF-8推荐后者一劳永逸。6. 从“能跑”到“能用”给专家审稿加 PDF 下载、状态流转邮件通知与status字段的业务闭环6.1 稿件 PDF 下载用response.setContentType(application/pdf)强制浏览器下载文档图 4.8 提到“专家可以下载主编发给自己的稿件”但没给实现。假设稿件文件存在WebContent/uploads/目录下文件名存于manuscript_info.file_path字段需在表里加此字段download.jsp如下% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% % page importjava.io.* % % String mid request.getParameter(mid); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { Class.forName(com.mysql.jdbc.Driver); conn DriverManager.getConnection(jdbc:mysql://localhost:3306/online_submation, root, root); String sql SELECT file_path FROM manuscript_info WHERE id?; ps conn.prepareStatement(sql); ps.setString(1, mid); rs ps.executeQuery(); if (rs.next()) { String filePath rs.getString(file_path); File file new File(application.getRealPath(/) uploads/ filePath); if (file.exists()) { response.setContentType(application/pdf); response.setHeader(Content-Disposition, attachment; filename\ filePath \); response.setContentLength((int) file.length()); FileInputStream fis new FileInputStream(file); OutputStream os response.getOutputStream(); byte[] buffer new byte[4096]; int length; while ((length fis.read(buffer)) 0) { os.write(buffer, 0, length); } fis.close(); os.close(); } else { p a hrefhttps://download.csdn.net/download/LovelPerson/91872878 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑