前言:该小项目使用 Java Tomcat 本地服务器,实现了读取 SQL Server 数据以及将输入的账号密码与数据库中已有的账号密码进行比对的功能,Java 源代码下载链接:[Java][SQL Server][Tomcat] Java本地服务器读取SQL Server中的数据及账号密码核对
1 系统概述
1.1 系统简介
基于微信小程序实现学校信息门户中校内通知、公示公告、校内新闻和学术讲座的便捷查看。
1.2 术语表
该文档涉及到的术语如表1所示。
序号 | 术语或缩略语 | 说明性定义 |
---|---|---|
1 | 微信小程序 | 微信小程序是一种不需要下载安装即可使用的应用,用户使用微信扫一扫或搜一下即可打开应用。 |
2 | 数据库 | 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 |
3 | 信息门户 | 信息门户是指利用网络浏览器访问组织内部和外部关键信息的单一入口,解决信息超载问题,利用先进的搜索及索引技术构建起一个内联网环境,用来从不同的信息系统和互联网中搜索和获取信息。 |
4 | 爬虫 | 爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 |
5 | PM | Project Manager,项目经理 |
6 | 逻辑层 | 小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及微信小程序的特有功能。逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。 |
7 | 视图层 | 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。 |
1.3 系统运行环境
- 软件环境:
系统所需要的软件环境如表2所示。
分类 | 名称 | 版本 | 语种 |
---|---|---|---|
PC操作系统 | Windows 10 | 家庭中文版 | 简体中文 |
数据库平台 | Microsoft SQL Server | 2019 | Sql |
服务器端 | IntelliJ IDEA | 2020.1 | Java |
Tomcat | 9.0.44 | ||
开发环境 | Java | 14.0.1 | Java |
- 硬件平台
系统运行的硬件平台如表3所示。
设备名称 | 设备要求 |
---|---|
PC | 装有 Java 14.0.1 及以上版本、 Apache Tomcat 对应版本 、Microsoft SQL Server 数据库 2019及以上版本 |
1.4 开发环境
该程序开发环境如表4所示。
分类 | 名称 | 版本 | 语种 |
---|---|---|---|
PC操作系统 | Windows 10 | 家庭中文版 | 简体中文 |
开发平台 | IntelliJ IDEA | 2020.1 | Java |
开发平台 | Tomcat | 9.0.44 | Java |
数据库平台 | Microsoft SQL Server | 2019 | Sql |
2 模块设计
2.1 模块2 Java Tomcat 服务器模块
2.1.1 设计图
该模块的设计图如图1所示。
![](https://img-blog.csdnimg.cn/20210710111158840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgxNzMwOQ==,size_16,color_FFFFFF,t_70)
2.1.2 功能描述
该部分包含九个类,该部分为数据库和微信小程序之间的桥梁模块,搭建服务器作为数据库和微信小程序通信的中枢。
2.1.3 输入数据
若需要检验用户的登录名和密码,需要在GET指定URL时同时传递username和password数据。
2.1.4 输出数据
若访问的为用户登录鉴权接口,则根据用户传递的数据返回success(登陆成功)或error(登录失败)。
若访问的为各类通知对应的接口,则返回JSON格式的通知数据,包含信息标题title,发布日期date,文章主体article和文章中包含的图片的URL地址image。
2.1.5 数据设计
该部分的数据设计如表5所示。
名称 | 数据结构 | 元素类型 | 功能 |
---|---|---|---|
information | ArrayList | String | 存储从数据库中获取的信息 |
ct | Database | Table | 读取数据库的数据 |
jsonOutput | String | char | 作为JSON格式的数据供微信小程序读取 |
2.1.6 算法和流程
1. **if** 访问通知获取接口: {
2. 获取数据库连接
3. 从数据库的指定表中读取信息
4. 根据不同列名将数据按照对应格式存储到List
5. 将List中的数据转换为JSON格式
6. **if** 接口被以GET或POST格式访问:
7. 在网页上输出JSON格式的信息 }
8. **if** 访问登录鉴权接口: {
9. 获取数据库连接
10. 获取前端传递的信息
11. 将传递的信息与数据库中的信息进行比对
12. **if** 比对成功:
13. 在网页上输出 success 的信息
14. **else**:
15. 在网页上输出 error 的信息 }
3.4.7 函数实现
该部分的函数说明如表6所示。
函数名称 | 功能 | 参数 | 返回值 | 算法说明 | 全局变量 |
---|---|---|---|---|---|
informationDatabase | 构造函数 | String lableName | None | 完成对数据库的链接工作 | None |
getInformation | 获取通知信息并存储到Notification数组中 | None | JSON格式的通知字符串 | 从数据库的指定表中获取信息,根据不同列将信息分类存储,并转换为JSON格式 | None |
Information | 构造函数 | 信息标题title,发布日期date,文章主体article和文章中图片的URL地址image | None | 赋值语句 | None |
doGet | 网页传递来的信息和回应的信息 | HttpServletRequest request, HttpServletResponse response | None | 当用户使用GET方式访问时给出相应的反应 | None |
doGet | 网页传递来的信息和回应的信息 | HttpServletRequest request, HttpServletResponse response | None | 当用户使用POST方式访问时给出相应的反应 | None |
userDatabase | 构造函数 | None | None | 赋值语句 | None |
checkUser | 确认登录信息 | 用户登录username, 用户登录密码password | 若查到,返回对象User,否则返回null | 将传递进来的信息与数据库信息进行查询比对,若找到,返回信息,否则返回null | None |
getTitle | 赋值 | None | title | 赋值语句 | None |
setTitle | 取值 | title | None | 赋值语句 | None |
getDate | 赋值 | None | date | 赋值语句 | None |
setDate | 取值 | date | None | 赋值语句 | None |
getArticle | 赋值 | None | article | 赋值语句 | None |
setArticle | 取值 | article | None | 赋值语句 | None |
getImage | 取值 | None | image | 赋值语句 | None |
setImage | 赋值 | image | None | 赋值语句 | None |
getUsername | 赋值 | None | username | 赋值语句 | None |
setUsername | 取值 | username | None | 赋值语句 | None |
getPassword | 赋值 | None | password | 赋值语句 | None |
setPassword | 取值 | password | None | 赋值语句 | None |
代码:
/**
* Name: Information.java
* Author: LIN Guocheng
* Date: 2021-3-28
* Function: 用于存取校内通知的标题、发布时间和文章主体。
*/
public class Information {
private String title;
private String date;
private String article;
private String[] image;
public Information(String title, String date, String article, String[] image) {
this.title = title;
this.date = date;
this.article = article;
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public void setImage(String[] image) {
this.image = image;
}
public String[] getImage() {
return image;
}
}
package myServlet;
import java.io.IOException;
import java.io.Writer;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import database.informationDatabase;
public class announcementServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//设置响应头允许ajax跨域访问
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST");
Writer out = response.getWriter();
String jsonOutput = "";
informationDatabase nd = new informationDatabase("schoolAnnouncements");
try {
jsonOutput = nd.getInformation();
out.write(jsonOutput);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
out.flush();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
package database;
import model.Information;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.*;
public class informationDatabase {
String lableName = "";
Connection ct = null;
PreparedStatement pestmt = null;
String jsonOutput = "";
private List<Information> information = new ArrayList<Information>();
public informationDatabase(String lableName) {
try {
this.lableName = lableName;
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=schoolNews", "这里输入数据库用户名", "这里输入数据库密码");
if (ct != null) {
System.out.println("数据库连接成功");
} else {
System.out.println("数据库连接失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取通知信息并存储到Notification数组中
public String getInformation() throws SQLException {
try {
System.out.println("正在打包发送 校内通知");
pestmt = ct.prepareStatement("select * from " + this.lableName + " order by date desc");
ResultSet rs = pestmt.executeQuery(); // 将数据库响应的查询结果放在rs中
while(rs.next()) {
//System.out.println(rs.getString(1)+","); //标题
//System.out.println(rs.getString(2)+",");
//System.out.println(rs.getString(3)+",");
String[] imgUrls = rs.getString(4).split(","); // 将image字符串按逗号分割,成为数组
Information information = new Information(rs.getString(1),rs.getString(2),rs.getString(3),imgUrls);
this.information.add(information);
}
jsonOutput = JSON.toJSONString(information);
System.out.println(jsonOutput);
return jsonOutput;
} catch (Exception e) {
e.printStackTrace();
return "转换JSON出错";
} finally {
ct.close();
pestmt.close();
}
}
}
package database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.User;
public class userDatabase {
Connection ct = null;
PreparedStatement pestmt = null;
public userDatabase(){
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=schoolNews", "数据库用户名", "数据库密码");
if(ct != null){
System.out.println("数据库连接成功");
}
else{
System.out.println("数据库连接失败");
}
}catch(Exception e){
e.printStackTrace();
}
}
// 确认登录信息
public User checkUser(String username,String password) throws SQLException{
try{
System.out.println("正在确认登录信息");
pestmt=ct.prepareStatement("select * from [User] where convert(nvarchar(255),username)=? and convert(nvarchar(255),password)=?");
pestmt.setString(1, username);
pestmt.setString(2, password);
ResultSet rs=pestmt.executeQuery(); // 将数据库响应的查询结果放在rs中
System.out.println("数据库响应结果为:" + rs.toString());
User user = new User();
while(rs.next()){
user.setUsername(rs.getString(1));//第一个属性
user.setPassword(rs.getString(2));//第二个属性
System.out.println("用户信息为:" + user.getUsername() + " " + user.getPassword());
return user; ///查到就返回对象
}
return null;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
ct.close();
pestmt.close();
}
}
}
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package myServlet;
import java.io.IOException;
import java.io.Writer;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.User;
import database.userDatabase;
public class userServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//设置响应头允许ajax跨域访问
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST");
//获取微信小程序get的参数值并打印
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("微信小程序中获得的内容为:username:" + username + " password:" + password);
userDatabase userDatabase =new userDatabase(); // 建立输入信息比对对象
HttpSession session=request.getSession(); // 创建保存信息对象
User user=(User) session.getAttribute("user");
if(user == null){//第一次进入
try {
user= userDatabase.checkUser(username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}///如果账户密码正确,把返回的对象抛给user,不正确对象则为空
}
session.setAttribute("user", user);///保存对象
Writer out = response.getWriter();
if(user!=null){///有对象,用户名密码正确
out.write("success");//向小程序返回结果
}else{//对象为空
out.write("error");
}
out.flush();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
2.1.8 全局数据结构与该模块的关系
该模块为数据库和微信小程序相互通信的中枢模块,与数据库之间的通信通过JDBC进行,与微信小程序之间的通信依赖于微信小程序的主动访问。
2.2 数据库设计
2.2.1 数据库及数据表
本系统内使用的数据库系统为 Microsoft SQL Server 2019 数据库,数据库中包含表
User, schoolAnnouncements, schoolArticles, schoolLectures 和 schoolNews
五张表,分别用于用户登录鉴权、公告公示、校内通知、学术讲座和校内新闻的存储。
2.2.2 数据结构设计
五张表中,User 表的数据结构设计如表7所示,schoolAnnouncements, schoolArticles,
schoolLectures 和 schoolNews 表的数据结构设计如表8所示。
列名 | 数据类型 | 允许Null值 |
---|---|---|
username | nchar(10) | √ |
password | ntext | √ |
列名 | 数据类型 | 允许Null值 |
---|---|---|
title | nvarchar(50) | √ |
date | nvarchar(50) | √ |
article | ntext | √ |
image | ntext | √ |