图书管理系统项目记录

发布时间 2023-05-08 14:35:23作者: 朱呀朱~

图书管理系统项目记录

Gitee:
BooksBorrowing

数据库准备

  • 注意若是在 mysql 导入时出现类似错误:Unknown collation: 'utf8mb4_0900_ai_ci'
    • 这是因为 sql 文件是从高版本 mysql 中导出的,导入到低版本 mysql
    • 所以要修改 sql 文本中的字符关键字,即
      • 右键数据库
      • 选择编辑数据库
      • 查看或更改字符集和排序规则
      • 将 sql 文件的字符关键字修改,使之与导入的数据库相同
      • 例如将 utf8mb4 修改为 utf8,将 utf8mb4_0900_ai_ci 修改为 utf8_general_ci

Tomcat 安装

  • https://tomcat.apache.org/

  • Download 选择版本 ( 注意路径不要有中文 )

  • 为防止在启动 Tomcat 时会在控制台处出现乱码 ( 选择性 )

    1. 打开所下载的 tomcat 文件夹里面的 conf

    2. 打开 logging.properties

    3. 将其中的 java.util.logging.ConsoleHandler.encoding = UTF-8 后面的 UTF-8 修改为 GBK

    4. 后面启动 tomcat 时:

      image-20230429173748944

Idea

  • 新建项目

    image-20230429171926787

  • 在新建后配置 Tomcat,在顶部运行按钮左边打开下拉列表选择 Edit Configurations,完成以下配置

    image-20230429173024602

    • 在这里的 URL 就是 Tomcat 启动时打开的页面,可以自行设置,在 8080/ 的后面写上自定义页面 .jsp 即可
  • ctrl + shift + R:全部修改替换 ( 或 ctrl + R )

  • 在使用其他模板时,最好把路径都换成绝对路径,保证肯定能找到

    • 例:src="images/sun.png" ——> src="/images/sun.png"
  • alt + insert 时,点击选择的一端,ctrl + shift 再点击另一端,实现全选

    • 例如在导入多个 get、set 时
  • 初始创建新文件夹下的新 class,可以

    • new class 后,bean.User 直接一次完成
  • 同先前学到的

    • dao 层:接口大写的 I 开头,Dao 结尾
      • 实现类有的新建 impl 文件夹,有的直接去开头 I 尾加 Impl 放在 dao 里
    • service 层:同 dao
    • 使用一种暴露接口,隐藏具体实现的固定模式
  • DBUtils:

    • ( MySQL 5 ) 本来的 jdbc:mysql://localhost/数据库名?&useUnicode=true&characterEncoding=utf-8 显示如下错误
    • The server time zone value '�й���׼ʱ��' is unrecognized or
    • 如果你想运用时区支持,必须配置服务器JDBC驱动程序(通过’ serverTimezone '配置属性)来使用更具体的时区值。
    • String url = "jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai&useTimezone=true
  • /** + enter:多行注释

/**
 * 统一处理浏览器提交的 userServlet 的请求
 * @param req 封装请求相关信息的对象
 * @param resp 封装响应相关信息的对象
 * @throws ServletException
 * @throws IOException
 */
  • ctrl + alt + M:( 代码冗余时 ) 将选中的代码拿出为独立的 private 方法

  • 中文乱码:编码解码不一致 ( 浏览器 — Servlet — Service — Dao — 数据库 )

    • 浏览器提交查询请求给Servlet

      • 设置断点在用户获取上:User user = new User();

      • 得知获取数据 set 的就为:User

    • POST 提交方式解决

      • 在 Servlet 里的 doPost 里设置POST请求中数据的解码方式,添加以下数据:req.setCharacterEncoding("UTF-8");
      • 一般就可以解决了
    • GET 提交方式解决

      1. 对于获取的参数:将错的解码回退,然后再用正确的 UTF-8 重新解码

        • 例:
        // 获取:
        String type = req.getParameter(Constant.REQUEST_PARAMETER_TYPE);
        // 回退解码:
        new String(type.getBytes(StandardCharsets.ISO_8859_1),"UTF-8");
        
      2. 修改配置文件,在 tomcat 里 conf 下的 server.xml,找到 Connector 连接器

        • 例:
        // <Connector /> 里:
        // redirectPost = "..."
        // 在上述代码的后面加一行:
        URIEncoding = "UTF-8"
        
    • Dao层查阅数据在数据库里 ( 数据库的表里就出现了乱码 )

      • Url 后加上:&useUnicode=true&characterEncoding=utf-8
    • 数据库响应数据给Dao层 ( 数据库 )

    • Servlet响应结果给浏览器

    • 软件 idea 考虑进行选择性设置:

  • 初始都是用 sql 语句的 delete 语句,是真正的物理删除

    • 可以选择用 update 语句将某个字段改写 1 或 0 来进行逻辑的删除

    • 新建枚举工具类是一个选择

      • name:yes / no ; code:0 / 1

        YES("yes", 0),NO("no", 1);
        
  • 图书借阅:管理员分配卡给学生,学生可根据卡看到借阅记录,并可借阅和归还

  • 登录:登录页面勾选框选择登录人员,type 传值从不同的表里查 ( 此处就默认 admin 为管理员 )

  • 在有学生添加的时候同时录入用户信息,即创建一个学生信息时,同步创建该学生的账号信息,默认学号为账号,密码123456

  • 项目过程出现的错误问题

    • 在传值时

      // 报错提示 错误代码行 + 代码行数定位在此行
      req.getRequestDispatcher("/user/user.jsp").forward(req, resp);
      
      • 但切记不能只关注在这一处,先检查最基础的拼写问题
      // 此处requestScope传值时没有提示list就默认了没有传值成功的想法是错的
      <c:forEach items="${requestScope.list}" var="user">
          <tr>
          <td><input name="" type="checkbox" value="" /></td>
          <td>${user.id}</td>
          <td>${user.userName}</td>
          <td>${user.password}</td>
          <td>${user.phoneNum}</td>
          <td>${user.email}</td>
          </tr>
      </c:forEach>
      
      • 这里的错误就在于 userName 的拼写出现了错误,应为 username
      • 由于没有提示就会容易造成拼写错误,可见要注意细节,不能太依赖软件的提示
      • 遇到此类问题时,要先试着只获取一两个值看看是否能获取,若是可以获取个别值,就表示能够传输到 jsp
    • ajax 时 var 不可用

      image-20230430171017298

    • 后端在获取表格填入的 text 信息时,通过 console.log(data); 获取信息,打开网页控制台查看可知,在信息传输过程可能会夹杂空格,所以在获取字符串信息进行判断时 data.trim() == 'success' 用 trim 方法除去空格

    • 在方法中,尤其是需要 try-catch 的时候,一定要看准 return 是一个正确的一个错误的,不要漏了!

    • 报错提示:此URL不支持Http方法POST

      • 暂时解决方法:把 doPost 里的方法写到 doGet 里面
    • 诸如添加和修改有较多冗余代码需要封装成一个方法时,注意不要忘了 sql 的更新操作多一个 id 的获取,要 Integer.parseInt 转一下。

      • 遇到问题别光看 Debug ——> System 或 console.log
      • 切记!!!!如果添加的话,拿不到 id 为 null 时,是不能够 Integer 转换的!!可以先 String id 获取后,(id == null || id.equals("")) 进行判定,再考虑转换!
      • 为了解决代码冗余,有的时候就要多加考虑获取条件,是否存在等因素
    • 做下拉列表判断时,可以多考虑三元运算符

      • 注意 EL 表达式和三元运算符的合用

        <option value="${dept.id}" ${dept.id == cls.deptId?'selected':''}> ${dept.department} </option>
        
    • 有外键关联的,别忘了整理好数据库,而且在类似删除班级时要判断是否有人,有人就不能删

    • 空指针异常:( 没定义、没获取...... )

      • 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:调用 null 对象的实例方法、访问或修改 null 对象的字段......

      • 应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用。

  • 确定代码所在路径

    image-20230430161708034

  • git init

  • git add ./*

  • git commit -m "first commit"

  • git remote add origin https://gitee.com/zhu-ya-zhu/books-borrowing.git

  • git push -u origin "master"

  • 完成提交

  • 右键项目,Git —> Commit Directory

  • commit 后,右上角 Push