河北省科技政策查询系统 —— 项目开发博客
一、设计思想
1.1 项目概述
河北省科技政策查询系统是一个典型的 Web 信息检索系统,面向研究人员、企业从业者、政府机构以及普通公众,提供对河北省各类科技政策文件的浏览、分类筛选、关键词检索及详情查看功能。项目采用 Java Web(Servlet + JSP)+ MySQL 的经典技术栈,同时配套一个基于 uni-app 的跨端移动端作为展示层扩展。
1.2 架构设计:分层解耦的 MVC 思想
项目没有直接使用 Spring 等重型框架,但在代码组织上体现了朴素的分层思想:
层次 职责 对应文件
实体层(Entity) 与数据库表结构一一对应的 Java 类,封装数据属性 Policy.java
数据访问层(DAO) 直接与 JDBC 交互,封装 CRUD 与条件查询逻辑 PolicyDao.java、PolicyKindDao.java、DBUtil.java
控制层(Controller/Servlet)接收 HTTP 请求,调用 DAO,返回响应页面 PolicyServlet.java
视图层(View) JSP 模板 + Bootstrap CSS 渲染用户界面 index.jsp
工具层(Util) 数据库连接管理、SQL 批量导入 DBUtil.java、SqlImportUtil.java
设计要点:
单一职责原则(SRP):DBUtil 只管连接与关闭,PolicyDao 只做数据查询,PolicyServlet 只负责请求分发。每个类职责清晰,便于修改。
连接池思想的雏形:虽然本项目使用的是 DriverManager 直连(简单 Demo 场景),但 DBUtil 的 static 初始化块已经为后续替换为 Druid/Hikari 等连接池保留了扩展点。
动态查询参数化:不拼接 SQL 字符串,通过 PreparedStatement + 动态参数列表实现多条件组合查询,防止 SQL 注入。
1.3 数据库设计
数据库表 policy 共 31 个字段,涵盖政策的元数据(名称、分类、制定机关、发文字号)、时间信息(通过/发布/施行日期)、关键词、正文内容(HTML 富文本)以及排序字段。
CREATE TABLE policy (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL COMMENT '政策名称',
type varchar(255) DEFAULT NULL COMMENT '政策分类',
organ varchar(255) DEFAULT NULL COMMENT '制定机关',
pubdata date DEFAULT NULL,
text longtext,
-- ... 其他字段
PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
设计决策:
id 使用 bigint unsigned 自增,满足政策数据量(700+ 条)并为未来扩展预留空间。
text 使用 longtext,因为政策正文通常是带 HTML 格式的长文本。
所有字符串字段允许为 NULL,兼容从外部导入的不完整数据。
1.4 前端响应式设计
前端引入 Bootstrap 5.3.3(CDN 方式),通过栅格系统实现:
桌面端:左侧 3 列分类树 + 右侧 9 列内容区
移动端:分类树隐藏,替换为顶部下拉菜单;内容区铺满宽度
导航栏使用 navbar-expand-lg 在大屏展开、小屏折叠为汉堡菜单
二、源程序代码
2.1 核心实体类 —— Policy.java(节选)
package com.policy.entity;
import java.util.Date;
public class Policy {
private Long id;
private String name;
private String type;
private String organ;
private Date pubdata;
private String text;
// ... 其他 20+ 字段 (category, range, document, field, theme, keyword 等)
// Getters & Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getType() { return type; }
public void setType(String type) { this.type = type; }
// ... 其余 get/set 省略
}
这是一个典型的 POJO / JavaBean 类,共 31 个属性,与数据库表结构严格对应。
2.2 数据库连接工具 —— DBUtil.java
设计说明:使用静态代码块在类加载时注册 JDBC 驱动(JDBC 4.2+ 虽然可以自动发现,但显式加载保证兼容性)。getConnection 与 closeConnection 静态方法对外暴露简单的连接生命周期管理。
package com.policy.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL =
"jdbc:mysql://localhost:3306/febs?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASSWORD = "xht20060223.";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try { conn.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
}
}
2.3 数据访问层核心 —— PolicyDao.java(动态查询片段)
package com.policy.dao;
import com.policy.entity.Policy;
import com.policy.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class PolicyDao {
// 多条件组合分页查询
public List
String year, String organ, int page, int pageSize) throws SQLException {
List
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = "SELECT * FROM policy WHERE 1=1";
List

浙公网安备 33010602011771号