简介:这份资源是一份大学毕业论文级别的网站新闻管理系统设计与实现文档,面向计算机相关专业学生、课程设计或毕业设计开发者,帮助解决Web新闻管理系统的选题、架构设计与论文撰写问题。压缩包内共1个doc文件,约461KB,完整呈现了从系统总体设计、数据库设计到详细设计与运行效果的全过程。文档以JSP与SQL Server 2000为技术栈,采用B/S结构,基于Tomcat5.0与eclipse3.2+myeclipse5.0开发环境,涵盖新闻浏览、新闻录入、新闻修改、删除新闻及管理员验证五大功能模块。数据库部分设计了新闻文章表与用户表,并给出字段类型与主键说明;详细设计章节拆解了common.jsp、connectdb.jsp、check.jsp等公共模块及index.jsp、article.jsp、login.jsp等页面职责,还配有登录、发布、修改、删除及新闻浏览等运行效果界面说明。目前已有96人学习,适合需要完整项目方案、模块划分思路与论文结构参考的读者借鉴。
1. 一份 JSP 新闻管理系统的完整拆解:从数据库到分页浏览
很多计算机专业的同学在做毕业设计时,都会遇到一个经典选题——网站新闻管理系统。这个选题看似简单,但真正动手时才发现,从数据库表设计到 JSP 页面之间的数据流转,每一步都有细节需要处理。这份资源是一套完整的毕业设计文档加源码包,基于 JSP 和 SQL Server 2000 开发,采用 B/S 结构,服务器使用 Tomcat 5.0,开发环境为 Eclipse 3.2 配合 MyEclipse 5.0。系统实现了新闻浏览、新闻录入、新闻修改、新闻删除以及管理员身份验证五大核心功能,普通用户无需登录即可查看新闻列表和详情,管理员通过登录验证后才能进入后台进行内容管理。整套代码包含 15 个 JSP 文件、1 个 CSS 样式表、web.xml 描述文件以及 SQL Server 2000 的 JDBC 驱动包,目录结构清晰,适合作为课程设计或毕业设计的参考模板,也适合想理解传统 JSP 开发模式的后端入门者拿来练手。
2. 数据库与公共模块:两张表撑起整个系统
2.1 新闻文章表与用户表的字段设计逻辑
这套系统的数据库设计非常精简,整个新闻管理系统只用了两张表:新闻文章表和用户表。先看新闻文章表的结构:
| 列名 | 数据类型 | 是否可为空 | 说明 |
|---|---|---|---|
| ID | int | 否 | 记录编号,标识属性,主键 |
| TITLE | varchar(100) | 否 | 文章标题 |
| BODY | varchar(8000) | 否 | 文章内容 |
| ADDDATE | varchar(30) | 否 | 发布日期 |
| ADDUSER | varchar(10) | 是 | 发布人 |
这里有几个设计点值得注意。BODY 字段用的是 varchar(8000),这个长度在 SQL Server 2000 里已经是非 text 类型的上限了,说明设计者希望用普通字符串类型来存储新闻正文,避免 text 类型在读取时的额外开销。ADDDATE 用的是 varchar(30) 而不是 datetime,这在实际开发中其实是个值得商榷的选择——用字符串存日期虽然写入方便,但后续如果要做按时间排序或范围查询就会比较麻烦。不过对于毕业设计级别的系统来说,这种简化是可以接受的。
再看用户表:
| 列名 | 数据类型 | 是否可为空 | 说明 |
|---|---|---|---|
| ID | int | 否 | 记录编号,标识属性,主键 |
| USER-ID | varchar(15) | 否 | 用户名 |
| USER-PASSWORD | varchar(15) | 否 | 用户密码 |
| ISMASTER | varchar(1) | 否 | 是否为管理员 |
| USER-NAME | varchar(10) | 是 | 用户姓名 |
ISMASTER 字段用 varchar(1) 存储,通常存 "1" 表示管理员,"0" 表示普通用户。这种设计把权限判断简化成了一个字段值的比较,登录验证时只需要多查一个字段就能区分身份。两张表之间没有外键关联,新闻的 ADDUSER 字段直接存发布人名字的字符串,而不是关联用户表的 ID。这种设计在小型系统里很常见,好处是查询新闻列表时不需要 join 用户表,坏处是如果管理员改名,历史新闻的发布人信息就对不上了。
2.2 四个公共文件如何减少重复代码
公共模块是整个系统的地基,包含四个 JSP 文件和一个 CSS 文件,全部放在 news\incoming 目录下。这四个文件的分工非常明确:
common.jsp负责集中导入 Java 类和包。其他 JSP 文件只需要用<%@ include file="common.jsp" %>把它包含进来,就不用每个页面都写一遍 import 语句。这是 JSP 开发中最基础的代码复用手段。
connectdb.jsp负责数据库连接。它先装载 JDBC 驱动,然后建立 Connection 对象与 SQL Server 2000 数据库进行连接,同时声明了 ResultSet 实例 rs 用来返回查询结果,还定义了全局变量 Title 供后续文件使用。把数据库连接独立成一个文件的好处是,当数据库地址、用户名或密码需要修改时,只改这一个文件就够了。
check.jsp负责管理员身份验证。它使用 session 对象来判断当前访问者是否已登录。具体逻辑是:管理员成功登录后,程序会把 session 中的 Enter 值设为 True;check.jsp 读取这个值,如果不是 True,就重定向回登录页面。session 对象在这里的作用类似于全局变量,让用户在一次会话中的所有页面请求都能共享登录状态。
codefilter.jsp负责新闻内容的格式转换。它定义了三个方法,其中 Replace() 是内部方法,供另外两个方法调用。对外暴露的是 toHtml() 和 unHtml() 两个方法:toHtml() 把一般文本格式转换成 HTML 格式,比如把回车换行转成<br>标记;unHtml() 则做反向转换。这个文件解决的是一个很实际的问题——管理员在 textarea 里输入的换行,如果不做转换直接显示在 HTML 页面上,所有换行都会丢失,新闻内容会挤成一团。
注意:connectdb.jsp 中声明的 ResultSet 实例 rs 是全局变量,这意味着多个页面同时操作数据库时可能会互相干扰。在毕业设计这种单人使用的场景下问题不大,但如果要改成多用户并发系统,需要把 rs 改成局部变量。
3. 新闻浏览与后台管理:从 index.jsp 到 delarticle.jsp 的完整链路
3.1 新闻浏览主界面与最终页面的数据传递
新闻浏览模块由两个文件组成:index.jsp 和 article.jsp。index.jsp 是用户进入系统后看到的第一个页面,它的任务是从数据库的 article 表中查询所有新闻记录,把标题以列表形式展示出来。如果新闻条数较多,还需要做分页显示。
分页的常见做法是在 SQL 查询中使用 TOP 和 NOT IN 组合,或者利用 JDBC 的 ResultSet 游标定位。对于 SQL Server 2000 来说,一个典型的翻页查询是这样的:
-- 查询第 2 页,每页 10 条,按 ID 倒序排列 SELECT TOP 10 * FROM article WHERE ID NOT IN ( SELECT TOP 10 ID FROM article ORDER BY ID DESC ) ORDER BY ID DESC;这条 SQL 的逻辑是:先取出前 10 条记录的 ID,然后排除这些 ID,再取剩下的前 10 条,就得到了第 2 页的数据。参数说明:TOP 后面的数字是每页条数,子查询里的 TOP 数字是(当前页码 - 1) × 每页条数。这种写法在 SQL Server 2000 中很常见,因为那个版本还不支持 ROW_NUMBER() 窗口函数。
article.jsp 的任务是接收 index.jsp 传入的新闻 ID,然后以这个 ID 为条件在 article 表中查找对应记录,取出标题、内容、发布日期等信息并显示在页面上。数据传递的方式通常是在标题链接上拼接参数,比如article.jsp?id=5,然后在 article.jsp 中通过request.getParameter("id")获取这个值。
这里有一个容易翻车的地方:如果新闻内容中包含 HTML 特殊字符(比如<或>),直接输出到页面上会导致页面结构被破坏。所以 article.jsp 在输出新闻内容之前,需要调用 codefilter.jsp 中的 toHtml() 方法做格式转换,把特殊字符转义掉,同时把换行符转成<br>标记。
3.2 管理员登录验证与会话管理
登录模块包含两个文件:login.jsp 和 chklogin.jsp。login.jsp 是登录表单页面,chklogin.jsp 负责验证用户名和密码的正确性。
login.jsp 中有几个关键设计。首先,它在程序开头用 include 指令把 common.jsp 和 connectdb.jsp 包含进来,这样就能使用公共模块中定义的类和数据库连接。其次,它用 JavaScript 编写了一个 checkdata() 函数,用来在表单提交前判断管理员是否输入了用户名和密码,如果为空则弹出提示。这个函数绑定在登录按钮的 onclick 事件上,属于前端验证的第一道防线。
login.jsp 还定义了一个 String 类型的变量 errmsg,它有两个取值:"error1" 表示输入的用户名和密码不正确,"error2" 表示用户没有登录而企图直接进入管理页面。当用户从其他页面被重定向到 login.jsp 时,会通过 URL 参数传入 errmsg 的值,login.jsp 根据这个值在页面上显示对应的错误提示。
chklogin.jsp 的逻辑是:接收 login.jsp 表单提交的用户名和密码,在用户表中查询是否存在匹配的记录,并且 ISMASTER 字段的值是否为管理员标识。如果验证通过,就把 session 中的 Enter 值设为 True,然后重定向到 main.jsp;如果验证失败,则重定向回 login.jsp 并传入 errmsg=error1。
// chklogin.jsp 中的核心验证逻辑 String username = request.getParameter("username"); String password = request.getParameter("password"); String sql = "SELECT * FROM users WHERE [USER-ID]='" + username + "' AND [USER-PASSWORD]='" + password + "' AND ISMASTER='1'"; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { session.setAttribute("Enter", "True"); response.sendRedirect("main.jsp"); } else { response.sendRedirect("login.jsp?errmsg=error1"); }这段代码的逻辑很直接:拼接 SQL 查询语句,在 users 表中查找同时满足用户名、密码和管理员标识的记录。如果 rs.next() 返回 true,说明找到了匹配的管理员,就把 session 的 Enter 属性设为 True 并跳转到管理主页面。参数说明:[USER-ID]和[USER-PASSWORD]是用户表中的列名,因为包含了连字符,在 SQL Server 中需要用方括号括起来。
注意:上面这段代码用的是字符串拼接 SQL,存在 SQL 注入风险。如果用户名输入
' OR '1'='1,拼接后的 SQL 会变成永真条件,直接绕过验证。在毕业设计场景下这个问题可能不会被追究,但如果要作为正式项目使用,必须改成 PreparedStatement 参数化查询。
3.3 发布、修改、删除三个模块的页面流转
后台管理的三个核心操作模块,每个都由两个 JSP 文件配合完成。
发布新闻模块由 addarticle.jsp 和 savearticle.jsp 组成。addarticle.jsp 是一个表单页面,包含标题输入框、内容文本域和提交按钮。管理员填写完新闻内容后点击提交,表单数据发送到 savearticle.jsp。savearticle.jsp 接收标题和内容参数,同时从 session 中取出当前登录的管理员用户名作为发布人,再获取当前系统时间作为发布日期,最后执行 INSERT 语句把数据写入 article 表。
// savearticle.jsp 中的插入逻辑 String title = request.getParameter("title"); String body = request.getParameter("body"); String adduser = (String) session.getAttribute("username"); String adddate = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date()); String sql = "INSERT INTO article (TITLE, BODY, ADDDATE, ADDUSER) VALUES ('" + title + "','" + body + "','" + adddate + "','" + adduser + "')"; stmt.executeUpdate(sql); response.sendRedirect("main.jsp");参数说明:title 和 body 来自表单提交,adduser 从 session 中获取,adddate 用 SimpleDateFormat 格式化为 "yyyy-MM-dd" 的字符串。执行完插入后重定向回 main.jsp,管理员可以看到更新后的新闻列表。
修改新闻模块由 editarticle.jsp 和 editarticleover.jsp 组成。editarticle.jsp 接收要修改的新闻 ID,从数据库中查出该条新闻的标题和内容,填充到表单的输入框中供管理员编辑。editarticleover.jsp 接收修改后的表单数据,执行 UPDATE 语句更新数据库中的对应记录。
删除新闻模块只有一个文件 delarticle.jsp。它接收要删除的新闻 ID,执行 DELETE 语句,然后重定向回 main.jsp。删除操作通常会在页面上加一个 JavaScript 确认框,防止误操作。
4. 避坑与排查:这套 JSP 系统最容易翻车的五个地方
4.1 数据库驱动加载失败导致 500 错误
现象:启动 Tomcat 后访问任何页面都报 500 错误,控制台提示ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver。
原因:SQL Server 2000 的 JDBC 驱动包(msbase.jar、mssqlserver.jar、msutil.jar)没有放到 WEB-INF\lib 目录下,或者虽然放了但没有重启 Tomcat。
解决:确认三个 jar 文件都在 news\WEB-INF\lib 目录中,然后重启 Tomcat。如果用的是 MyEclipse,还需要在项目的 Java Build Path 中把这些 jar 添加到 Libraries 里,否则编译时就会报错。
4.2 中文乱码问题
现象:新闻标题和内容在页面上显示为乱码,或者存入数据库后变成问号。
原因:JSP 页面的编码声明和数据库的字符集不一致。常见的情况是页面用了 UTF-8,但数据库用的是 GBK,或者反过来。
解决:在需要接收中文参数的 JSP 文件开头加上request.setCharacterEncoding("GBK"),同时确认 JSP 页面的 pageEncoding 和数据库字段的排序规则一致。SQL Server 2000 默认使用 GBK 排序规则,所以 JSP 页面用 GBK 编码比较稳妥。
4.3 session 过期导致后台操作被拦截
现象:管理员登录后过了一段时间再操作,点击发布或修改按钮时被重定向回登录页面。
原因:Tomcat 默认的 session 超时时间是 30 分钟,超时后 session 中的 Enter 值丢失,check.jsp 判断为未登录状态。
解决:可以在 web.xml 中调整 session-timeout 的值,比如改成 60 分钟。但更合理的做法是在 check.jsp 中检测到 session 失效时,给出明确的提示信息而不是直接跳转,让用户知道是超时了而不是密码错了。
4.4 新闻内容中的 HTML 标签导致页面错乱
现象:发布包含<script>或<div>等标签的新闻后,新闻浏览页面布局被破坏,甚至弹出警告框。
原因:新闻内容直接输出到 HTML 页面中,浏览器把内容里的标签当成了页面结构的一部分来解析。
解决:在 article.jsp 输出新闻内容之前,调用 codefilter.jsp 中的 toHtml() 方法,把<转成<,>转成>,这样浏览器就会把它们当普通文本显示。如果确实需要支持富文本格式,那就需要在发布时做白名单过滤,只允许安全的标签通过。
4.5 分页查询在数据量大时性能下降
现象:新闻条数超过几百条后,index.jsp 的加载速度明显变慢。
原因:分页查询用了 NOT IN 子查询,每次翻页都需要扫描全表来排除前面的记录,数据量越大越慢。
解决:对于 SQL Server 2000,可以考虑用临时表或者游标来优化分页。更简单的做法是限制每页显示的条数,并且在 ID 字段上建立聚集索引,让 NOT IN 子查询能走索引扫描而不是全表扫描。
5. 从这套代码里能学到什么:一个老项目的复盘习惯
这套 JSP 新闻管理系统虽然技术栈比较老,但它完整地展示了一个 B/S 结构 Web 应用的基本骨架。从公共模块的代码复用,到 session 会话管理,再到增删改查四个操作的页面流转,每一部分都能对应到实际开发中的核心概念。
如果你想在这套代码基础上做改进,我建议从三个方向入手。第一,把 SQL 字符串拼接改成 PreparedStatement,这不仅是安全问题,也能让你理解参数化查询的执行原理。第二,把数据库从 SQL Server 2000 换成 MySQL,JDBC 驱动的加载方式和连接字符串会变,但核心的 Connection、Statement、ResultSet 三层结构是一样的,换库的过程能帮你把 JDBC 的抽象层理解得更透。第三,给新闻表加一个分类字段,然后在 index.jsp 上做分类筛选加分页的组合查询,这个练习能让你把 SQL 条件拼接和分页逻辑真正吃透。
验证改进是否成功的方法很简单:在本地启动 Tomcat,用管理员账号登录,发布三条不同分类的新闻,然后在前台按分类筛选并翻页,看数据是否正确。如果分类筛选后分页的总页数不对,大概率是 count 查询没有带上分类条件,这是分页实现中最常见的坑。
提示:这套代码的 web.xml 中可能没有配置欢迎页面,访问项目根路径时可能报 404。检查 web.xml 中是否有
<welcome-file-list>配置,如果没有就加上 index.jsp。
从那以后我每次拿到一个老项目,都会先跑通数据库连接和登录流程,再去看业务代码。因为这两步是整个系统的入口,入口不通,后面的一切都是空谈。希望帮到你。
本文还有配套的精品资源,点击获取