拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

JSP+SQL Server 2000新闻管理系统毕设实战:环境搭建与增删改查

JSP+SQL Server 2000新闻管理系统毕设实战:环境搭建与增删改查

简介:这份资源是面向计算机专业学生与Java Web初学者的一份大学毕业论文配套文档,主题为基于JSP与SQL Server 2000的网站新闻管理系统设计与实现,可作为毕业设计选题参考或课程设计模板。压缩包内共1个doc文件,约461KB,内容涵盖系统总体设计、数据库设计、详细设计与运行效果展示等完整章节。文档从B/S结构出发,梳理了新闻浏览、新闻录入、修改、删除及管理员验证五大功能模块,并给出新闻文章表与用户表两张数据表的具体字段设计,同时说明Tomcat5.0、Eclipse3.2与MyEclipse5.0的开发环境搭配。读者可据此了解一个新闻管理系统的完整开发流程,包括公共模块中common.jsp、connectdb.jsp、check.jsp等文件的职责划分,以及登录、发布、修改、删除等界面的实现思路,适合需要撰写论文或搭建同类Web项目的同学参考借鉴。目前已有96人学习下载。

1. 从一份“网站新闻管理系统”文档说起:JSP + SQL Server 2000 这套老架构还能不能跑

如果你手里正躺着一份名为“网站新闻管理系统.doc”的毕业论文,或者导师刚甩给你一个“做个新闻发布后台”的题目,那你大概率会撞上这套经典组合:JSP 做页面、SQL Server 2000 存数据、Tomcat 当容器、B/S 结构交差。别急着嫌弃它老,这套东西在高校毕设里活了快二十年,原因是它足够简单、资料足够多、答辩时老师也挑不出大毛病。真正让人头疼的不是技术本身,而是环境——SQL Server 2000 在 Win10/Win11 上装不上、Tomcat 版本和 JDK 对不上、JSP 页面中文乱码、新闻列表分页写不对。这篇笔记就按“从零把系统跑起来”的顺序,把选型理由、环境搭建、核心功能实现和踩坑记录一次讲透。适合正在做毕设的本科生,也适合想快速复现一个 JSP 小项目的初学者。读完你至少能得到一个能登录、能发新闻、能分页展示的最小可用系统。

2. 为什么毕设还在用 JSP + SQL Server 2000:选型逻辑与最小环境清单

2.1 这套技术栈到底解决什么问题

新闻管理系统的本质需求非常朴素:管理员登录后台,增删改查新闻,前台按栏目和分页展示。用 B/S 结构意味着用户只需要浏览器,不用装客户端,这对毕设演示极其友好。JSP 的优势在于它把 Java 代码嵌进 HTML,写起来直观,一个.jsp文件就能同时处理请求和渲染页面,不需要前后端分离那一套构建工具。SQL Server 2000 虽然老,但它的企业管理器图形化操作简单,建库建表写 SQL 语句对新手友好,而且很多学校机房的教学环境就是它。

从数据流看,整个系统就三层:浏览器发请求到 Tomcat,Tomcat 把.jsp编译成 Servlet 执行,JSP 里通过 JDBC 连 SQL Server 2000 读写新闻表,再把结果拼成 HTML 返回。没有复杂框架,没有依赖注入,出问题了看堆栈就能定位。这正是毕设需要的——能跑通、能讲清楚、能自己改。

2.2 环境清单与版本匹配关系

这套老栈最怕版本乱配。下面是我验证过能跑通的一组组合,建议照抄:

组件推荐版本说明
JDK1.8(JDK 8)不要用 JDK 11+,老 JSP 标签库会报错
Tomcat8.5 或 9.08.5 最稳,9.0 也可以
SQL Server2000 或 20052000 需打 SP4 补丁
JDBC 驱动sqljdbc4.jar 或 jtdsjtds 兼容性更好
开发工具Eclipse / IDEA能配 Tomcat 即可

提示:如果你的电脑是 Win10/Win11,SQL Server 2000 安装程序可能直接闪退。常见做法是改用 SQL Server 2005 Express 或 2008 Express,SQL 语法几乎一样,答辩时说明即可。

2.3 数据库和 Tomcat 的最小配置步骤

先建库建表。打开查询分析器,执行下面的 SQL:

-- 创建新闻管理系统数据库 CREATE DATABASE NewsDB; GO USE NewsDB; GO -- 新闻表:存标题、内容、栏目、发布时间 CREATE TABLE News ( NewsID INT IDENTITY(1,1) PRIMARY KEY, -- 自增主键 Title NVARCHAR(200) NOT NULL, -- 新闻标题 Content NTEXT, -- 新闻正文 Category NVARCHAR(50), -- 所属栏目 PubTime DATETIME DEFAULT GETDATE(), -- 发布时间 Author NVARCHAR(50) -- 发布人 ); GO -- 管理员表 CREATE TABLE Admin ( AdminID INT IDENTITY(1,1) PRIMARY KEY, UserName NVARCHAR(50) NOT NULL, Password NVARCHAR(50) NOT NULL ); GO -- 插入默认管理员 INSERT INTO Admin (UserName, Password) VALUES ('admin', '123456'); GO

这段 SQL 做了三件事:建库、建新闻表和管理员表、插入一个默认账号。IDENTITY(1,1)让 NewsID 自动递增,省去手动维护主键。NTEXT类型能存长正文,GETDATE()自动填发布时间。注意 SQL Server 2000 不支持NVARCHAR(MAX),所以正文用NTEXT。

Tomcat 配置的关键是server.xml里的端口和编码。找到conf/server.xml,确认 Connector 标签带URIEncoding="UTF-8":

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

不加URIEncoding,GET 请求里的中文参数会乱码,这是血泪经验。改完重启 Tomcat,浏览器访问http://localhost:8080看到默认页就说明容器正常。

3. 用 JSP 把新闻的增删改查跑通:从数据库连接到分页列表

3.1 JDBC 连接 SQL Server 2000 的两种写法

连接数据库有两种驱动可选:微软官方sqljdbc4.jar和开源jtds.jar。SQL Server 2000 用官方驱动容易报“TCP/IP 连接失败”,因为 2000 默认没开 TCP/IP 协议。我一般用 jtds,兼容性好,连接串也简单。

// 数据库连接工具类 DBUtil.java import java.sql.*; public class DBUtil { // jtds 驱动连接 SQL Server 2000 private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver"; private static final String URL = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=NewsDB"; private static final String USER = "sa"; private static final String PWD = "你的密码"; // 获取连接 public static Connection getConn() throws Exception { Class.forName(DRIVER); // 加载驱动 return DriverManager.getConnection(URL, USER, PWD); } // 关闭资源,顺序不能错 public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) rs.close(); } catch (Exception e) {} try { if (stmt != null) stmt.close(); } catch (Exception e) {} try { if (conn != null) conn.close(); } catch (Exception e) {} } }

Class.forName加载驱动只做一次,getConnection每次调用返回新连接。关闭顺序必须是 ResultSet → Statement → Connection,反过来会报错。URL里的1433是 SQL Server 默认端口,如果装了实例名要改成localhost:1433;instance=实例名。

3.2 新闻列表分页的 SQL 写法与 JSP 渲染

分页是新闻系统最核心也最容易写错的地方。SQL Server 2000 没有LIMIT和OFFSET,得用TOP加子查询。假设每页 10 条,查第 2 页:

-- 查询第 2 页,每页 10 条 SELECT TOP 10 * FROM News WHERE NewsID NOT IN ( SELECT TOP 10 NewsID FROM News ORDER BY NewsID DESC ) ORDER BY NewsID DESC;

原理是:先取前 10 条的 ID 排除掉,再取剩下的前 10 条。页数越大,子查询越深,性能越差,但毕设数据量小,够用。对应的 JSP 页面这样写:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*, util.DBUtil" %> <% int pageSize = 10; // 每页条数 int pageNo = 1; // 当前页码 String p = request.getParameter("page"); if (p != null) pageNo = Integer.parseInt(p); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DBUtil.getConn(); stmt = conn.createStatement(); // 计算偏移:第 N 页要排除前 (N-1)*pageSize 条 int skip = (pageNo - 1) * pageSize; String sql = "SELECT TOP " + pageSize + " * FROM News WHERE NewsID NOT IN " + "(SELECT TOP " + skip + " NewsID FROM News ORDER BY NewsID DESC) " + "ORDER BY NewsID DESC"; rs = stmt.executeQuery(sql); %> <table border="1"> <tr><th>标题</th><th>栏目</th><th>发布时间</th></tr> <% while (rs.next()) { %> <tr> <td><%= rs.getString("Title") %></td> <td><%= rs.getString("Category") %></td> <td><%= rs.getTimestamp("PubTime") %></td> </tr> <% } %> </table> <% } catch (Exception e) { out.println("查询失败:" + e.getMessage()); } finally { DBUtil.close(conn, stmt, rs); } %>

pageNo从 URL 参数取,skip是当前页之前要跳过的条数。JSP 里用<%= %>输出变量,while(rs.next())遍历结果集。注意pageEncoding="UTF-8"和contentType都要写,否则中文标题会变问号。

3.3 新闻发布与删除的完整流程

发布新闻就是一个 INSERT,删除就是 DELETE。下面是一个发布页面的核心逻辑:

<% request.setCharacterEncoding("UTF-8"); // 必须放在取参数之前 String title = request.getParameter("title"); String content = request.getParameter("content"); String category = request.getParameter("category"); if (title != null && !title.trim().equals("")) { Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.getConn(); // 用 PreparedStatement 防 SQL 注入 String sql = "INSERT INTO News (Title, Content, Category, Author) VALUES (?, ?, ?, ?)"; ps = conn.prepareStatement(sql); ps.setString(1, title); ps.setString(2, content); ps.setString(3, category); ps.setString(4, "admin"); int n = ps.executeUpdate(); // 返回受影响行数 if (n > 0) out.println("发布成功"); } catch (Exception e) { out.println("发布失败:" + e.getMessage()); } finally { DBUtil.close(conn, ps, null); } } %>

request.setCharacterEncoding("UTF-8")必须写在所有getParameter之前,否则 POST 中文乱码。用PreparedStatement而不是拼字符串,能防止用户输入单引号导致 SQL 报错。executeUpdate返回影响行数,大于 0 就是成功。删除同理,把 SQL 换成DELETE FROM News WHERE NewsID=?,参数传 ID 即可。

4. 环境搭建与部署避坑:SQL Server 2000、Tomcat 和中文乱码的排查记录

4.1 SQL Server 2000 装不上或连不上

现象:安装程序双击没反应,或者装完服务启动失败,JDBC 报“Connection refused”。

原因:SQL Server 2000 是为 Win2000/XP 设计的,在 Win10/Win11 上兼容性差;另外默认没启用 TCP/IP 协议,只开了命名管道。

解决:右键安装程序选“兼容性疑难解答”,用 XP SP3 模式运行。装完后打开“服务器网络实用工具”,启用 TCP/IP,端口设 1433。如果还是不行,直接换 SQL Server 2005 Express,连接串改成jdbc:jtds:sqlserver://localhost:1433;DatabaseName=NewsDB,其余代码不用动。

4.2 Tomcat 启动闪退或 8080 端口被占

现象:双击startup.bat窗口一闪而过,或者启动后访问 localhost:8080 报 404。

原因:闪退通常是JAVA_HOME没配或 JDK 版本不对;端口占用是别的程序(如另一个 Tomcat、IIS)占了 8080。

解决:先配JAVA_HOME指向 JDK 8 根目录,PATH里加%JAVA_HOME%\bin。端口占用就在server.xml里把8080改成8081,重启即可。想看闪退原因,用命令行进bin目录执行catalina run,错误会打印在控制台。

4.3 JSP 页面中文乱码的三种场景

现象:页面标题正常但表单提交后变问号,或者数据库里存进去就是乱码。

原因:JSP 文件本身的编码、请求编码、响应编码、数据库字段编码,四处只要有一处不一致就会乱。

解决:JSP 头部写<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>;表单提交前调request.setCharacterEncoding("UTF-8");Tomcat 的server.xml加URIEncoding="UTF-8";数据库字段用NVARCHAR而不是VARCHAR。四处都对齐,乱码基本消失。

4.4 新闻正文太长导致页面报错

现象:发布一篇长新闻后,列表页能显示,详情页报“数据截断”或显示不全。

原因:SQL Server 2000 的TEXT和NTEXT字段在 JDBC 读取时,如果一次性getString可能受驱动限制。

解决:正文用NTEXT,读取时用rs.getString("Content")一般没问题;如果报错,改用rs.getCharacterStream流式读取。另外 JSP 输出正文时不要用<%= %>直接嵌 HTML,先做转义,否则正文里的标签会破坏页面结构。

5. 让毕设多拿几分:新闻系统里几个能讲清楚的进阶技巧

5.1 用 Session 做登录拦截,别让后台裸奔

很多毕设的登录只是做个样子,直接输admin_list.jsp就能进后台。正确做法是在每个后台页面顶部加 Session 校验:

<% // 放在后台页面最顶部 Object admin = session.getAttribute("adminUser"); if (admin == null) { response.sendRedirect("login.jsp"); // 没登录踢回登录页 return; // 必须 return,否则继续执行 } %>

登录成功时执行session.setAttribute("adminUser", userName)。sendRedirect之后一定要return,否则后面的代码还会跑,这是新手最容易漏的一步。答辩时老师问“怎么保证后台安全”,这就是标准答案。

5.2 新闻列表加栏目筛选和关键词搜索

在分页 SQL 基础上加WHERE条件即可。栏目筛选:

SELECT TOP 10 * FROM News WHERE Category = ? AND NewsID NOT IN (...) ORDER BY NewsID DESC;

关键词搜索用LIKE:

WHERE Title LIKE '%' + ? + '%'

注意LIKE里的%拼接要在 Java 里做,ps.setString(1, "%" + keyword + "%"),不要直接拼进 SQL。搜索和分页可以组合,把条件拼成动态 SQL,但参数仍用PreparedStatement占位符。

5.3 用 JSP 内置对象简化代码

JSP 有九个内置对象,毕设里最常用的是request、response、session、out、application。比如统计访问量可以用application:

<% Integer count = (Integer) application.getAttribute("visitCount"); if (count == null) count = 0; count++; application.setAttribute("visitCount", count); %> <p>本站访问量:<%= count %></p>

application对象在整个 Web 应用生命周期内共享,适合做计数器。但注意多用户并发时会有线程安全问题,毕设演示够用,生产环境要用数据库或缓存。

5.4 答辩前一定要做的三件事

第一,把数据库连接串、账号密码、Tomcat 端口写进一个readme.txt,答辩现场换电脑能快速改。第二,准备一份数据备份 SQL,万一演示时数据被删能立刻恢复。第三,把系统里所有硬编码的中文提示检查一遍,确保没有乱码。我当年就是没做备份,演示时手滑删了新闻表,当场用INSERT一条条补,那场面至今记得。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表