目  录

一、实验目的和要求

1、实验目的

2、实验要求

二、实验实现思路及步骤

1、实验思路

2、实验步骤

3、实验方案

三、主要开发工具

四、实验效果及实现代码

1、留言本数据库构建实现

(1)建立javaee-project数据库

(2)建立message数据表

(3)建立user数据表

2、留言本首页模块功能实现

(1)留言本留言信息呈现

(2)留言本留言记录查询

(3)留言本链接跳转

3、留言本登录模块功能实现

(1)留言本登录验证

(2)留言本登录成功

(3)留言本登录退出

4、留言本发布留言模块功能实现

(1)留言本发布留言内容验证

(2)留言本留言发布

5、留言本留言回复模块功能实现

(1)留言本留言回复信息

(2)留言本留言回复发布成功

6、留言本删除留言模块功能实现

(1)留言本留言删除验证

(2)留言本留言删除成功

五、遇到的问题和解决方法

六、心得体会


一、实验目的和要求

1、实验目的

        熟练掌握Mybatis框架基本用法,web项目中集成Mybatis。

2、实验要求

        实现简单留言本的发贴和回复功能,效果图如下:


二、实验实现思路步骤

1、实验思路

        (1)设计一个包括留言ID(主键,自增),留言者姓名,留言内容,留言时间等属性的数据库来存储留言信息。

        (2)在Java中创建一个实体类,该类对应数据库中的表,有一系列的getter和setter方法用于访问和修改这些属性。

        (3)Mapper层包含了所有与数据库操作相关的接口,这些接口定义了如何执行数据库操作。这些接口是MyBatis框架的主要部分,它们定义了如何将Java对象映射到数据库中的记录,以及如何从数据库中检索记录并映射回Java对象。

        (4)对于每个Mapper接口,创建一个XML文件来定义如何将接口的方法映射到数据库中的SQL语句。这些XML文件包含了要执行的SQL语句、参数如何映射到SQL语句中等的详细信息。

        (5)创建一个名为mybatis-config.xml的配置文件来完成Mapper接口的路径和XML映射文件的路径配置。

        (6)Service层包含了业务逻辑的实现,通常会调用Mapper层的方法来操作数据库,并根据业务需求进行数据的处理。Service实现类(Impl)是Service层的具体实现,它们实现了Service层的接口并实现了相关的业务逻辑。

        (7)创建Controller层:Controller层负责处理用户请求并调用服务层的业务逻辑,处理HTTP请求,将请求参数转化为entity对象,并调用service层的方法。

2、实验步骤

        (1)确定留言本需要存储的数据,包括留言者的姓名、留言的内容、留言的时间等,可以考虑使用关系型数据库,如MySQL来存储这些数据。

        (2)定义数据模型实体类,反映数据库中的表结构,每个属性对应一个字段。使用Java的类来表示这些实体,利用IDE的ORM工具IntelliJ IDEA来自动生成这些类和它们对应的数据访问接口。

        (3)定义数据访问接口Mapper层,包含对数据库进行各种操作的方法,并为每个接口创建一个XML映射文件,该文件包含如何将接口的方法映射到SQL语句的详细信息。

        (4)定义业务逻辑层Service层,该层包含判断留言是否已经存在、统计留言数量等一系列业务逻辑的实现,调用Mapper层的方法来访问数据库,并根据业务需求处理数据。

        (5)设计用户界面Controller层,该层处理添加留言、查看留言等一系列用户请求,接收用户的输入并将其转换为程序可以理解的命令,然后调用Service层的方法来执行这些命令。

        (6)配置数据源、Mapper接口和XML映射文件的路径等一系列事务管理器以确保事务的一致性。

3、实验方案

        (1)使用MySQL建立基于MyBatis的留言本需要使用的数据库(javaee-project)以及数据表(message、user),通过MyBatis配置文件连接对应的数据库,并通过调用数据库中的留言信息数据进行相关留言信息的发布、删除、查看、回复等操作。

        (2)根据课本、PPT和老师课堂中讲解的内容,使用IDEA-Java编译软件制作基于MyBatis的留言本。

        (3)将代码编写过程中遇到的问题及时的进行记录并在课后向老师进行提问,将遇到的问题进行及时的处理和解答,并将所有的问题和解决方法进行汇总归纳。

        (4)完成最终的项目以及基于MyBatis留言本的实验报告,最后进行实验报告排版的检查并提交。


三、主要开工具

        IDEA-Java开发工具、Navicat-MySQL开发工具


四、实验效果实现代码

1、留言本数据库构建实现

(1)建立javaee-project数据库

        打开SQLYog进行数据库的创建,数据库创建完毕以后再在数据库中添加留言信息数据表(message)和用户信息数据表(user),对应的数据库构建界面如图1-1所示:

图1-1 数据库构建界面

        核心代码:

CREATE DATABASE javaee-project;USE javaee-project;

(2)建立message数据表

        a、message数据表属性设置

        留言信息数据表(message)包括昵称(nickname)、QQ号码(qq)、电子邮件地址(email)、留言内容(msg)、回复ID(reply_id)、创建时间(create_time)、更新时间(update_time)以及留言类型(type),对应的message属性设置界面如图1-2所示:

图1-2 message属性设置界面

        核心代码:

CREATE TABLE `message` (`id` int NOT NULL AUTO_INCREMENT,`nickname` varchar(255) DEFAULT NULL,`qq` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`msg` varchar(255) DEFAULT NULL,`reply_id` int DEFAULT NULL,`create_time` datetime DEFAULT CURRENT_TIMESTAMP,`update_time` datetime DEFAULT CURRENT_ON UPDATE CURRENT_TIMESTAMP,`type` tinyint DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

        b、message数据表信息

        通过Sql语句进行留言信息数据表(message)的创建并在数据表中添加一部分留言数据信息记录,对应的message数据信息界面如图1-3所示:

图1-3 message数据表信息界面

(3)建立user数据表

        a、user数据表属性设置

        用户信息数据表(user)包括用户名(name)、密码(password)、角色(role)和生日(birthday),对应的user属性设置界面如图1-4所示:

图1-4 user属性设置界面

        核心代码:

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,`role` varchar(255) DEFAULT NULL,`birthday` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

        b、user数据表信息

        通过Sql语句进行用户信息数据表(user)的创建并在数据表中添加一部分用户数据信息记录,对应的user数据信息界面如图1-5所示:

图1-5 user数据表信息界面

2、留言本首页模块功能实现

(1)留言本留言信息呈现

        项目创建完毕后启动项目,在留言本的首页可以看到所有用户发布的留言以及对留言作出的回复信息,并会将留言数据按5条为一段进行分页划分处理操作,整个页面采用动画流动设计,为留言本添加了色彩渲染,对应的留言本信息呈现界面如图2-1所示:

图2-1 留言本信息呈现界面

        核心代码:

<video autoplay="autoplay" loop class="fillWidth" muted="muted" style="position: absolute"><source src="./image/background.mp4"></video><footer class="main-footer" style="background: #f7ecb5"><div class="container"><div class="pull-right hidden-xs"></div><div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">设计者:</b>于立伟<b style="color: #720e9e; margin-left: 30px">QQ邮箱:<a href= "https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手机号:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:启 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站视频号:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鲤鱼</a></b></b></strong></div></div></footer>

(2)留言本留言记录查询

        a、键入查询信息

        当需要查看指定用户的留言信息时,可以在留言本最上方的搜索框中输入自己想要查询的数据记录,此处采用了模糊查询的方式,对应的键入查询界面如图2-2所示:

图2-2 键入查询界面

        核心代码:

@RequestMapping("/replyByNickname.do")public void replyByNickname(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");String msg = request.getParameter("replyMsg");Message message = new Message();message.setReplyId(Integer.parseInt(id));message.setMsg(msg);message.setType(false);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (Exception e) {e.printStackTrace();}}@Overridepublic List<Message> list() {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);List<Message> messages = mapper.selectMsg();sqlSession.commit();sqlSession.close();return messages;}

        b、查看查询结果

        在搜索框中输入自己想要查询的内容后点击回车键即可完成查询操作,对应的查询结果会显示输出到页面中,对应的查询结果界面如图2-3所示:

图2-3 查询结果界面

        核心代码:

<c:forEach items="${messages}" var="msg"><div class="box box-default" style="background: rgba(255, 255, 255, 0.5)"><div class="box-header with-border"><h2 class="box-title"><b>${msg.nickname}在<fmt:formatDate value="${msg.createTime}" pattern="yyyy年MM月dd日HH:mm:ss"/>发布留言:</b></h2></div><div class="box-body" align="center"><b style="color: #00b3ee; font-size: 18px">${msg.msg}</b></div><c:if test="${msg.replyMessages != []}"><c:forEach items="${msg.replyMessages}" var="reply"><div class="box-footer"><b style="font-family: 黑体"><fmt:formatDate value="${reply.createTime}" pattern="yyyy年MM月dd日🚀🚀HH:mm:ss"/>回复:${reply.msg}</b></div></c:forEach></c:if><c:if test="${user != null}"><div class="box-footer" style="text-align: center"><button type="button" class="btn btn-danger" data-dismiss="modal" onclick="deletemsg('${msg.id}')">删除</button><button type="button" class="btn btn-primary" onclick="reply('${msg.id}')">回复</button>
</div></c:if></div></c:forEach>

(3)留言本链接跳转

        a、B站课程录播

        在页面的最下方添加了B站的链接键入模块,可以通过点击进入到该留言本的设计实现录播视频中,对应的B站课程录播界面如图2-4所示:

图2-4 B站课程录播界面

        核心代码:

<div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">设计者:</b>于立伟<b style="color: #720e9e; margin-left: 30px">QQ邮箱:<a href="https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手机号:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:启 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站视频号:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鲤鱼</a></b></b></strong></div>

        b、QQ邮箱发布

        在页面的最下方添加了QQ邮箱的链接键入模块,可以通过点击进入到QQ邮箱进行相关信息内容的上传发布操作,对应的QQ邮箱发布界面如图2-5所示:

图2-5 QQ邮箱发布界面

        核心代码:

<div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">设计者:</b>于立伟<b style="color: #720e9e; margin-left: 30px">QQ邮箱:<a href="https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手机号:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:启 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站视频号:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鲤鱼</a></b></b></strong></div>

3、留言本登录模块功能实现

(1)留言本登录验证

        a、账号密码验证失败

        在用户进行留言本登录的时候,通过用户在输入框中输入的信息进行对应的输入内容校验,并将不符合的信息进行输出提示,对应的账号密码验证失败界面如图3-1所示:

图3-1 账号密码验证失败界面

        核心代码:

$('#login_form').bootstrapValidator({excluded: [':disabled', ':hidden', ':not(:visible)'],//默认指定不验证的情况message : 'This value is not valid',feedbackIcons : {valid : 'glyphicon glyphicon-ok',invalid : 'glyphicon glyphicon-remove',validating : 'glyphicon glyphicon-refresh'},fields : {name: {  /*键名username和input name值对应*/message: '用户名不能为空',validators: {notEmpty: { /*非空提示*/message: '用户名必填不能为空'},stringLength: { /*长度提示*/min: 3,max: 30,message: '用户名长度不能小于3位或超过30位'},regexp: { /*正则校验*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用户名只能由字母、数字、点和下划线组成。'},}},password: {message:'密码无效',validators: {notEmpty: {message: '密码不能为空'},stringLength: {min: 3,max: 15,message: '密码长度必须在3到15之间'}}},}});

        b、账号密码验证成功

        用户将登录信息全部按照登录提示修改后会在每个文本框的最后出现绿色的小勾,从而表示输入信息均已正确,对应的账号密码验证成功界面如图3-2所示:

图3-2 账号密码验证成功界面

        核心代码:

name: {  /*键名username和input name值对应*/message: '用户名不能为空',validators: {notEmpty: { /*非空提示*/message: '用户名必填不能为空'},stringLength: { /*长度提示*/min: 3,max: 30,message: '用户名长度不能小于3位或超过30位'},regexp: { /*正则校验*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用户名只能由字母、数字、点和下划线组成。'},}},password: {message:'密码无效',validators: {notEmpty: {message: '密码不能为空'},stringLength: {min: 3,max: 15,message: '密码长度必须在3到15之间'}}}

(2)留言本登录成功

        登录内容全部输入成功后即可进行对应账号的登录操作,对应的留言本登录成功界面如图3-3所示:

图3-3 留言本登录成功界面

        核心代码:

@RequestMapping("/login.do")public void login(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String name = request.getParameter("name");String password = request.getParameter("password");User user = userService.login(name, password);request.getSession().setAttribute("user", user);if (Objects.nonNull(user)) {JSONUtil.printByJSON(response, Result.success());}JSONUtil.printByJSON(response, Result.fail());} catch (UnsupportedEncodingException e) {e.printStackTrace();}}

(3)留言本登录退出

        用户发布完毕自己的留言信息后可以点击页面右上角自己的用户名进行登录退出的操作,对应的留言本登录退出界面如图3-4所示:

图3-4 留言本登录退出界面

        核心代码:

@RequestMapping("/out.do")public void out(HttpServletRequest request, HttpServletResponse response) {request.getSession().removeAttribute("user");JSONUtil.printByJSON(response, Result.success());}$('#login_form').bootstrapValidator({excluded: [':disabled', ':hidden', ':not(:visible)'],//默认指定不验证的情况message : 'This value is not valid',feedbackIcons : {valid : 'glyphicon glyphicon-ok',invalid : 'glyphicon glyphicon-remove',validating : 'glyphicon glyphicon-refresh'}

4、留言本发布留言模块功能实现

(1)留言本发布留言内容验证

        a、昵称验证失败

        用户点击发布留言后会弹出对应的发布留言信息弹窗,在对应的输入框中按照提示信息填入自己的信息和留言内容即可,如果自己的昵称输入有问题则会提示“输入内容必须为字母、数字、点和下划线”,对应的昵称验证失败界面如图4-1所示:

图4-1 昵称验证失败界面

        核心代码:

fields : {nickname: {  /*键名username和input name值对应*/validators: {notEmpty: { /*非空提示*/message: '用户名必填不能为空'},StringLength: { /*长度提示*/min: 3,max: 30,message: '用户名长度不能小于3位或超过30位'},regexp: { /*正则校验*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用户名只能由字母、数字、点和下划线组成。'},}}

        b、邮箱验证失败

        如果自己的邮箱输入框中没有填写邮箱号的话会提示“邮箱不能为空”,对应的邮箱验证失败界面如图4-2所示:

图4-2 邮箱验证失败界面

        核心代码:

qq: {validators: {notEmpty: {message: 'qq不能为空'},digits:{ // 纯数字验证message: 'qq只能是数字'},stringLength: {min: 3,max: 15,message: 'qq长度必须在3到15之间'}}},email: {validators: {notEmpty: {message: '邮箱不能为空'},emailAddress:{ // 邮箱验证message: '请输入正确的邮箱'},stringLength: {min: 3,max: 15,message: 'qq长度必须在3到15之间'}}}

        b、发布留言内容验证成功

        用户将留言信息全部按照留言信息提示修改后会在每个文本框的最后出现绿色的小勾,从而表示输入信息均已正确,对应的发布留言内容验证成功界面如图4-3所示:

图4-3 发布留言内容验证成功界面

        核心代码:

msg : {validators : {notEmpty : {message : '留言内容必填'},stringLength : {min : 2,max : 200,message : '留言长度必须2-200字符'}}}

(2)留言本留言发布

        a、留言本留言信息

        将必须要填写的个人信息填写无误后即可进行留言内容的填写,将对应的留言内容填写到留言内容输入框中即可,对应的留言本留言信息界面如图4-4所示:

图4-4 留言本留言信息界面

        核心代码:

@RequestMapping("/insert.do")public void insert(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String nickname = request.getParameter("nickname");String qq = request.getParameter("qq");String email = request.getParameter("email");String msg = request.getParameter("msg");Message message = new Message();message.setEmail(email);message.setMsg(msg);message.setNickname(nickname);message.setQq(qq);message.setType(true);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (UnsupportedEncodingException e) {e.printStackTrace();}}@Overridepublic void insert(Message message) {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.insert(message);sqlSession.commit();sqlSession.close();}

        b、留言本留言发布成功

        留言信息填写完毕后即可点击弹窗中的提交留言按钮进行留言信息的发布操作,对应的留言本留言发布成功界面如图4-5所示:

图4-5 留言本留言发布成功界面

        核心代码:

<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content" style="background-image: url('../image/background.png')"><div class="modal-header"><h2 class="modal-title" id="exampleModalLabel" align="center" style="color: #720e9e">发布留言</h2></div><div class="modal-body"><form id="msg_form"><div class="form-group"><label for="nickname">昵称</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="请输入您的昵称" id="nickname" name="nickname" aria-describedby="emailHelp"></div><div class="form-group"><label for="QQ">QQ</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="请输入您的QQ号" id="qq" name="qq"></div><div class="form-group"><label for="email">邮箱</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="请输入您的邮箱号" id="email" name="email"></div><div class="form-group"><label for="msg">内容</label><textarea style="background-color: #d3dcda" class="form-control" id="msg" placeholder="请输入发表的内容信息" name="msg" rows="3"></textarea></div></form></div><div class="modal-footer" style="text-align: center"><button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button><button type="button" class="btn btn-primary" id="send_btn">发布留言</button></div></div></div></div>

5、留言本留言回复模块功能实现

(1)留言本留言回复信息

        用户登录留言本后可以对所有的留言信息进行回复评论操作,点击留言框中的回复按钮即可进行回复内容的填写,对应的留言本留言回复信息界面如图5-1所示:

图5-1 留言本留言回复信息界面

        核心代码:

@RequestMapping("/reply.do")public void reply(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");String msg = request.getParameter("replyMsg");Message message = new Message();message.setReplyId(Integer.parseInt(id));message.setMsg(msg);message.setType(false);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (Exception e) {e.printStackTrace();}}@Overridepublic void insert(Message message) {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.insert(message);sqlSession.commit();sqlSession.close();}

(2)留言本留言回复发布成功

        回复内容填写完毕后即可点击回复弹窗中的发布按钮进行回复信息的发布,对应的留言本留言回复发布成功界面如图5-2所示:

图5-2 留言本留言回复发布成功界面

        核心代码:

$("#reply_btn").click(function () {let txt = $("#reply_form").serialize()let id = $("#id").val()let data = txt + '&id=' + idfetch("/message/reply.do", {method:"post",headers:{'Content-type':'application/x-www-form-urlencoded'},body:data}).then(res => {return res.json()}).then(data => {if (data.success) {location.reload()$('#replyModal').modal('hide')}})})

6、留言本删除留言模块功能实现

(1)留言本留言删除验证

        如果自己的留言发布后感觉有问题需要删除只需要点击留言框中的删除按钮进行留言删除即可,但是为了确保无误删除时需要进行删除验证操作,对应的留言本留言删除验证界面如图6-1所示:

图6-1 留言本留言删除验证界面

        核心代码:

@RequestMapping("/delete.do")public void delete(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");messageService.deleteById(Integer.parseInt(id));JSONUtil.printByJSON(response,Result.success());}@Overridepublic void deleteById(int parseInt) {SqlSession sqlSession = MybatisUtils.getSqlSession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.deleteByPrimaryKey(parseInt);mapper.deleteByReplyId(parseInt);sqlSession.commit();sqlSession.close();}

(2)留言本留言删除成功

        如果确认要删除该条留言的话在二次确认的窗口中点击确认按钮即可进行该条记录的删除操作,对应的留言本留言删除成功界面如图6-2所示:

图6-2 留言本留言删除成功界面

        核心代码:

function deleteModal(id) {mid = id;$("#deleteModal").modal('show')}$("#delete_btn").click(function () {let data = 'id='+midfetch("/message/delete.do",{method:"post",headers:{'Content-type':'application/x-www-form-urlencoded'},body:data}).then(res=>{return res.json()}).then(data =>{if (data.success) {location.reload()$('#deleteModal').modal('hide')}})});

五、遇到的问题和解决方法

        1、运行问题:启动Tomcat的过程中,出现端口被占用的情况。

解决方法:对服务器进行配置,将服务器运行的端口号改为别的端口即可(找到Tomcat安装目录下的文件“/conf/server.xml”->使用记事本或写字板打开文件,在文件中找到“Connector port=8080”->将“8080”改为“8888”,然后保存配置文件->重启Tomcat服务器)。

        2、运行问题:代码编写完成后进行运行发现网页无法进行页面加载,显示页面请求失败。

解决方法:由于没有在Tomcat服务器上进行运行所导致,先运行服务器然后再运行代码后页面可以正常加载。

        3、项目问题:JSP页面中遇到编码问题。

解决方法:可以先检查JSP页面、JavaBean以及数据库的编码设置是否一致,可以手动在代码中设置编码格式,也可以在web.xml文件中配置全局的编码过滤器。

        4、项目问题:JSP页面无法正确地显示数据。

解决方法:检查JSP页面中是否包含错误的HTML标签、CSS样式或JavaScript代码,这些代码可能会干扰数据的显示,也可以检查JavaBean中的数据是否被正确地存储、处理和输出。

        5、项目问题:JSP页面无法获取到JavaBean中的数据。

解决方法:确保JavaBean中需要获取的数据已经被正确地赋值,可以在JSP页面中使用EL表达式或者使用Java代码片段的方式获取数据。

        6、项目问题:JSP页面中的表单无法提交。

解决方法:检查表单中的请求方法是否正确,是否存在未填写的必填项,是否存在重复的表单参数等错误,同时也可以检查网络连接是否正常。

        7、项目问题:页面跳转异常。

解决方法:检查代码实现,确保页面跳转的 URL 是否正确,是否遗漏了必要的转发或者重定向操作;另外还可以通过在浏览器中查看控制台日志来定位问题。

        8、项目问题:请求参数获取失败。

解决方法:检查代码实现,确保请求参数的名称、类型和格式都与服务器端代码中一致,还可以通过在浏览器中查看网络请求信息来定位问题。

        9、项目问题:项目运行后页面出现了404错误。

解决方法:由于在连接数据库的配置文件中数据库名错误导致的,将数据库的名字修改为自己的数据库名称后再次启动错误消息。

        10、项目问题:项目运行后页面出现了500错误。

解决方法:由于没有把类名写到配置文件的中,所以Tomcat就找不该类,此时我们把类名加入进去就可以正常访问了。


六、心得体会

        1、基于MyBatis的留言本项目为我提供了宝贵的软件开发和数据库操作经验,通过这个项目我深入了解了MyBatis这一优秀的持久层框架,并在实践中获得了一些独特的见解。MyBatis的灵活性和强大性给我留下了深刻的印象,它支持定制化SQL、存储过程以及高级映射,这使得开发者可以更加便捷地操作数据库。

        2、利用MyBatis的映射特性,将数据库表中的字段与Java对象进行了对应,通过使用MyBatis提供的映射文件,我可以轻松地实现对数据库的增、删、改、查等操作。此外MyBatis还支持动态SQL,可以在运行时根据参数动态生成SQL语句,使得操作数据库更加灵活。

        3、在开发过程中,由于留言本项目的数据量较大,如果直接使用MyBatis的默认查询方式,可能会影响性能。为了解决这个问题我研究了MyBatis提供的分页查询功能,通过在SQL语句中加入分页参数,MyBatis可以自动生成对应的分页SQL语句,大大提高了查询效率。

        4、由于数据库表结构经常变化,我需要频繁地更新MyBatis的映射文件,为了解决这个问题我深入研究了MyBatis的动态映射特性。通过在映射文件中使用动态SQL语句,我可以根据数据库表的实际结构自动生成对应的映射文件,避免了因表结构变化而导致的错误。

        5、制作基于MyBatis留言本的项目让我深入了解了MyBatis框架的使用和原理,同时也在实践中获得了宝贵的经验。在这个过程中我不仅学会了如何使用MyBatis进行数据库操作,还学会了如何解决实际开发中遇到的问题。通过这个项目我深刻体会到了MyBatis在持久层框架中的优势以及在项目开发中的重要性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914391.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914391.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914391.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM汇编编程(AArch64架构) - 第14课:安全扩展(ARM TrustZone)

目录1. TrustZone基础概念1.1 安全扩展架构1.2 关键组件2. 世界切换机制2.1 状态切换流程2.2 关键寄存器配置3. SMC调用实现3.1 调用规范3.2 完整调用流程4. 实战练习4.1 实验&#xff1a;实现双世界通信4.2 调试技巧1. TrustZone基础概念 1.1 安全扩展架构 startuml rectang…

OpenCV哈希算法------Marr-Hildreth 边缘检测哈希算法

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该类实现了 Marr-Hildreth 边缘检测哈希算法&#xff08;Marr-Hildreth Hash&#xff09;&#xff0c;用于图像相似性比较。它基于 Marr-Hildreth …

【git#5】远程操作 标签管理

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xff0c;前进的道路也不会永远一马平川&#xff0c;如何面…

如何使用 Python 删除 Excel 中的行、列和单元格 – 详解

目录 开发环境准备 使用 Python 删除 Excel 表格中的行 删除特定行 删除空白行 删除含指定数据的行 使用 Python 删除 Excel 表格中的列 删除特定列 删除空白列 删除含指定数据的列 使用 Python 删除 Excel 中的单元格并自动移动剩余内容 删除特定单元格 删除空白单…

箭头函数(Arrow Functions)和普通函数(Regular Functions)

在 JavaScript 中&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;和普通函数&#xff08;Regular Functions&#xff09;有以下主要区别&#xff1a;1. 语法箭头函数&#xff1a;使用 > 语法&#xff0c;更简洁&#xff0c;可省略 function 和 return&#xf…

Spring Boot 配置注解处理器 - spring-boot-configuration-processor

前言 在 Spring Boot 开发中&#xff0c;配置属性的管理是构建企业级应用的核心环节。Spring Boot 通过 ConfigurationProperties 注解提供了一种类型安全的方式&#xff0c;将配置文件中的属性绑定到 Java 对象中。然而&#xff0c;开发者在使用过程中常会遇到配置属性无自动补…

java: DDD using oracle 21c

项目结构&#xff1a;domain:/*** encoding: utf-8* 版权所有 2025 ©涂聚文有限公司 * 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a;* Author : geovindu,Geovin Du 涂聚文.* IDE : IntelliJ IDEA 2024…

两张图片对比clip功能

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片拖动Clip对比功能</title><style&g…

7.11 dp 图

lcr148.栈按放入顺序推栈&#xff0c;能弹出的就及时弹出&#xff0c;最后栈空则符合要求。判断 takeOut 序列是否符合栈的操作逻辑&#xff0c;因为题目中“特殊的数据结构”其实就是栈&#xff08;先进后出&#xff09;。思路如下&#xff1a;1. 用一个栈来模拟图书放入的过程…

react16-react19都更新哪些内容?

React 16 到 React 19 是 React 发展非常关键的阶段&#xff0c;每个版本都带来了深远影响。以下是 React 16 → 19 的重要更新列表&#xff0c;按版本详细说明每一代的核心特性、重要变化、对开发者的意义&#xff0c;并附简评&#xff1a;✅ React 16&#xff08;2017 年&…

【AI大模型】RAG系统组件:向量数据库(ChromaDB)

RAG 系统中的关键组件&#xff1a;向量数据库&#xff08;Vector Database&#xff09;&#xff0c;并以 ChromaDB 为例进行说明。什么是向量数据库&#xff1f;核心概念&#xff1a; 向量数据库是一种专门设计用于高效存储、索引和检索高维向量的数据库。向量是什么&#xff1…

006_测试评估与安全实践

测试评估与安全实践 目录 建立成功标准评估方法测试策略安全最佳实践隐私保护性能监控 建立成功标准 定义原则 1. 具体明确 清晰定义精确目标避免模糊表述如"良好性能"制定可操作的标准 不好的标准&#xff1a; 模型应该表现良好好的标准&#xff1a; 情感分…

时序预测 | Pytorch实现CNN-KAN电力负荷时间序列预测模型

预测效果 代码功能 该代码实现了一个结合卷积神经网络&#xff08;CNN&#xff09;和Kolmogorov–Arnold网络&#xff08;KAN&#xff09;的混合模型&#xff08;CNN-KAN&#xff09;&#xff0c;用于时间序列预测任务。核心功能包括&#xff1a; 数据加载与预处理&#xff1…

UI前端与数字孪生结合实践探索:智慧物流的仓储优化与管理系统

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;仓储管理的 “数字孪生革命”传统物流仓储正面临 “效率瓶颈、可视化差、响应滞…

【Android】在平板上实现Rs485的数据通讯

前言 在工业控制领域&#xff0c;Android 设备通过 RS485 接口与 PLC&#xff08;可编程逻辑控制器&#xff09;通信是一种常见的技术方案。最近在实现一个项目需要和plc使用485进行通讯&#xff0c;记录下实现的方式。 我这边使用的从平的Android平板&#xff0c;从平里面已经…

MySQL技术笔记-备份与恢复完全指南

目录 前言 一、备份概述 &#xff08;一&#xff09;备份方式 &#xff08;二&#xff09;备份策略 二、物理备份及恢复 &#xff08;一&#xff09;备份操作 &#xff08;二&#xff09;恢复操作 三、逻辑备份及恢复 &#xff08;一&#xff09;逻辑备份 &#xff0…

SpringBoot或OpenFeign中 Jackson 配置参数名蛇形、小驼峰、大驼峰、自定义命名

SpringBoot或OpenFeign中 Jackson 配置参数名蛇形、小驼峰、大驼峰、自定义命名 前言 在调用外部接口时&#xff0c;对方给出的接口文档中&#xff0c;入参参数名一会大写加下划线&#xff0c;一会又是驼峰命名。 示例如下&#xff1a; {"MOF_DIV_CODE": "xx…

uni-app 途径站点组件开发与实现分享

在移动应用开发中&#xff0c;涉及到出行、物流等场景时&#xff0c;途径站点的展示是一个常见的需求。本文将为大家分享一个基于 uni-app 开发的途径站点组件&#xff0c;该组件能够清晰展示路线中的各个站点信息&#xff0c;包括站点名称、到达时间、是否已到达等状态&#x…

kotlin中集合的用法

从一个实际应用看起以下kotlin中代码语法正确吗 var testBeanAIP0200()var testList:List<AIP0200> ArrayList()testList.add(testBean)这段Kotlin代码存在语法错误&#xff0c;主要问题在于&#xff1a;List<AIP0200> 是Kotlin中的不可变集合接口&#xff0c;不能…

深入理解 Java Map 与 Set

文章目录前言1. 搜索树1.1 什么是搜索树1.2 查找1.3 插入1.4 删除情况一&#xff1a;cur 没有子节点&#xff08;即为叶子节点&#xff09;情况二&#xff1a;cur 只有一个子节点&#xff08;只有左子树或右子树&#xff09;情况三&#xff1a;cur 有两个子节点&#xff08;左右…