图书管理系统项目记录
图书管理系统项目记录
Gitee:
BooksBorrowing
数据库准备
- 注意若是在 mysql 导入时出现类似错误:Unknown collation: 'utf8mb4_0900_ai_ci'
- 这是因为 sql 文件是从高版本 mysql 中导出的,导入到低版本 mysql
- 所以要修改 sql 文本中的字符关键字,即
- 右键数据库
- 选择编辑数据库
- 查看或更改字符集和排序规则
- 将 sql 文件的字符关键字修改,使之与导入的数据库相同
- 例如将 utf8mb4 修改为 utf8,将 utf8mb4_0900_ai_ci 修改为 utf8_general_ci
Tomcat 安装
-
Download 选择版本 ( 注意路径不要有中文 )
-
为防止在启动 Tomcat 时会在控制台处出现乱码 ( 选择性 )
-
打开所下载的 tomcat 文件夹里面的 conf
-
打开 logging.properties
-
将其中的 java.util.logging.ConsoleHandler.encoding = UTF-8 后面的 UTF-8 修改为 GBK
-
后面启动 tomcat 时:
-
Idea
-
新建项目
-
在新建后配置 Tomcat,在顶部运行按钮左边打开下拉列表选择 Edit Configurations,完成以下配置
- 在这里的 URL 就是 Tomcat 启动时打开的页面,可以自行设置,在 8080/ 的后面写上自定义页面 .jsp 即可
-
ctrl + shift + R:全部修改替换 ( 或 ctrl + R )
-
在使用其他模板时,最好把路径都换成绝对路径,保证肯定能找到
- 例:src="images/sun.png" ——> src="/images/sun.png"
-
alt + insert 时,点击选择的一端,按住 shift 再点击另一端,实现全选
- 例如在导入多个 get、set 时
-
初始创建新文件夹下的新 class,可以
- new class 后,bean.User 直接一次完成
-
同先前学到的
- dao 层:接口大写的 I 开头,Dao 结尾
- 实现类有的新建 impl 文件夹,有的直接去开头 I 尾加 Impl 放在 dao 里
- service 层:同 dao
- 使用一种暴露接口,隐藏具体实现的固定模式
- dao 层:接口大写的 I 开头,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 提交方式解决
-
对于获取的参数:将错的解码回退,然后再用正确的 UTF-8 重新解码
- 例:
// 获取: String type = req.getParameter(Constant.REQUEST_PARAMETER_TYPE); // 回退解码: new String(type.getBytes(StandardCharsets.ISO_8859_1),"UTF-8");
-
修改配置文件,在 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);
-
-
项目过程出现的错误问题
-
在传值时
// 报错提示 错误代码行 + 代码行数定位在此行 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 不可用
-
后端在获取表格填入的 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 对象的非法使用。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义