1499 字
7 分钟
图书管理系统
2025-05-15

Java Web的领域数据管理系统#

是网络编程的第二次大作业,非常的简陋,而且没有做异常处理,全当水作业了

远程仓库地址:https://github.com/thrinisty/BookManager.git

一、目的#

1.熟悉Java Web的基本功能和使用方法。

2.掌握如何使用JSP、JavaBean、Servlet等进行Web应用程序开发。

3.学习Java Web网络编程的分析与设计方法。

二、环境#

1.PC一台。

2.IDEA编程软件

三、要求#

使用Java Web,设计与实现一个领域数据管理系统,要求使用实现特定领域数据的在线访问、显示及数据管理,在实验中完成需求获取、系统分析、系统设计各阶段的基本任务。

任务一:(已实现)#

设计与实现一个基于JSP+Servlet+JavaBean的领域数据管理系统,要求支持:

1)支持用户注册与登录模块;

2)支持特定领域数据的在线访问、可视化展示;

3)支持特定领域数据的增、删、改、查操作;

4)支持使用Mysql数据库对领域数据进行存储管理;

5)开发的系统利用Tomcat进行部署应用。

任务二:(框架还在学习中,任务二尚未完成)#

在任务一的基础上选做。使用Java Web相关开发框架,设计实现更加复杂的领域数据管理功能模块,实现较友好美观的前端Web界面,提升持久化数据管理以及系统运行性能。

四、步骤#

1.分析领域数据管理程序的需求,绘制流程图,设计Web系统。

设计一个图书馆的管理系统,允许登录用户进行对于书本数据库的增删改查

流程图:

153

2.分析主要功能的实现,利用JSP进行系统开发。

实现登录注册功能(通过过滤器Filter完成)

实现在线访问(通过JSP页面显示)

支持数据的增删改查(Servlet+BeanDao)

支持数据库存储(MySQL)

3.学习MVC设计模式,采取层次化设计模型,设计领域数据管理功能。

工程通过JSP+Servlet+BasicDao构建层次化设计模式,完成响应功能

4.完成任务一

过滤器#

通过过滤没有登录的用户,禁止其访问admin文件夹下的资源

@WebFilter("/admin/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
            return;
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

BasicDao#

package com.bean;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.util.List;

public class BasicDao<T> {//使用泛型指定具体类型
    private QueryRunner qr = new QueryRunner();

    //开发通用的dml方法,针对任意的表
    public int update(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsDruid.getConnection();
            return qr.update(connection, sql, parameters);
            //返回受影响的行数,执行语句
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    //返回对个查询对象
    public List<T> queryMulti(String sql, Class<T> cls, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsDruid.getConnection();
            return qr.query(connection, sql, new BeanListHandler<T>(cls), parameters);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    //返回查询单行结果
    public T querySingle(String sql, Class<T> cls, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsDruid.getConnection();
            return qr.query(connection, sql, new BeanHandler<T>(cls), parameters);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    //查询单行单列的方法
    public Object queryScalar(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsDruid.getConnection();
            return qr.query(connection, sql, new ScalarHandler(), parameters);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }
}

Druid连接池#

package com.bean;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtilsDruid {
    private static DataSource ds;

    static {
        Properties properties = new Properties();
        InputStream input;
        input = JDBCUtilsDruid.class.getClassLoader().getResourceAsStream("config.properties");
        try {
            if (input == null) {
                throw new RuntimeException("无法找到配置文件 config.properties");
            }
            properties.load(input);
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException("初始化数据库连接池失败", e);
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                System.out.println("关闭失败");
            }
        }
    }

    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static void close(ResultSet result, Statement statement, Connection connection) {
        try {
            if (result != null) {
                result.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

Book对象与User对象

public class Book {
    private int id;
    private String title;
    private String author;
    private double price;
	//省略各种构造器以及方法
}
public class User {
    private String username;
    private String password;
    //省略各种构造器以及方法
}

Servlet处理程序#

这里以查询为例

@WebServlet("/query")
public class Query extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BookDao bookDao = new BookDao();
        String sql = "select * from book";
        List<Book> books = bookDao.queryMulti(sql, Book.class);
        // 将数据存入request属性
        req.setAttribute("books", books);
        // 转发到JSP页面
        req.getRequestDispatcher("/admin/query.jsp").forward(req, resp);
    }
}

JSP前端设计#

由于MVC的设计模式,前端很少实现响应的数据功能,只负责View显示,由大模型可以高效生成美观的的JSP页面,

只需要在各个JSP页面跳转之间进行设计,访问的Servlet程序功能按钮,以及从Request域中获取响应的数据即可,这里以change.jsp为例

<h1>Add New Book</h1>

<form action="../insert" method="get">
  <div class="form-group">
    <label for="id">Book ID:</label>
    <input type="text" id="id" name="id" required>
  </div>

  <div class="form-group">
    <label for="name">Book Name:</label>
    <input type="text" id="name" name="name" required>
  </div>

  <div class="form-group">
    <label for="author">Author:</label>
    <input type="text" id="author" name="author" required>
  </div>

  <div class="form-group">
    <label for="price">Price:</label>
    <input type="number" id="price" name="price" step="0.01" min="0" required>
  </div>

  <button type="submit" class="submit-btn">Add Book</button>
</form>

5.分析实验,总结实验心得,撰写报告。

实验综合性较强,可以很好的巩固JavaWeb的各个知识点,这一次实验完成了一个简易的书籍管理系统,

但是在异常处理方面上较为简陋,没有很好的处理SQL语句报错的异常处理,直接捕获抛出

而且还是有很多的地方可以进行改进,例如在获取数据的时候其实可以通过Ajax请求访问,局部更新数据来实现更好的运行效率以及用户体验

图书管理系统
https://thrinisty.github.io/Blog/posts/java-web的领域数据管理系统/
作者
Thrinisty
发布于
2025-05-15
许可协议
CC BY-NC-SA 4.0