🚀个人主页:欢迎访问Ali.s的首页
⏰ 最近更新:2022年7月31日
⛽ Java框架学习系列:【Spring】【SpringMVC】【Mybatis】
🔥 Java项目实战系列:【飞机大战】【图书管理系统】
⛳ Java基础学习系列:【继承】【封装】【多态】
🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】
🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂
💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯
前言
这里是【JAVASE】
项目实战的第三节课,接着前面的用户新增功能继续做,今天做的是用户的删除功能,使用【servlet】
、【JQuery】
、【Mysql】
来实现该功能。
一、需求分析
在前面用用户新增功能实现后,可以清楚的看到插入的用户信息,并且能够在前端页面渲染出数据效果,但是在实际的测试过程中出现了中文乱码问题,今天将完善一下中文乱码问题,并且完成用户删除功能。
下面对增加的功能进行需求分析。
当点击每条数据的删除按钮时,就是用户发送了请求,这里由于在UserServlet
中都是POST
请求,所以后面在点击按钮触发事件时,应将action
的method
设置为post
方式。用户发送请求后controller
层的Servlet
就应该要处理请求,而根据MVC
架构,controller
需要调用service
层的方法,所以将业务逻辑交给Service
层进行处理,service
的处理有需要对请求处理的数据与dao
层的数据进行比对,dao
层访问数据库信息,对请求数据操作进行校验,并对操作返回数据响应。
二、功能实现
在dao
层和service
层中创建接口。这里与新增用户的功能类似,所以前面的功能实现后,这里就相对比较简单。
1.反射机制
这里使用反射机制来统一拿到User
对象的表单信息,避免每次的增删改查都需要去获取User
对象。
private <T> T getRequestParameterForReflect(HttpServletRequest req,Class <T> cla) throws InstantiationException, IllegalAccessException {
T t=cla.newInstance();
//使用反射机制获取表单信息
Map<String, String[]> parameterMap = req.getParameterMap();
Field[] fields = cla.getDeclaredFields();
//对信息判空处理
if(fields!=null && fields.length>0) {
for (Field field : fields) {
String[] values = parameterMap.get(field.getName());
if (values==null || values.length==0){
continue;
}
//判断是否是数组类型
if (field.getType() ==String[].class){
//开启访问权限
field.setAccessible(true);
try {
field.set(t,values);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//关闭访问权限
field.setAccessible(false);
continue;
}
//不是数组类型
field.setAccessible(true);
try {
field.set(t,values[0]);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//关闭访问权限
field.setAccessible(false);
continue;
}
}
return t;
}
2.控制层
为了避免代码重复,将处理的方法抽象出来,便于调用函数,使代码更加简洁。下面删除用户的方法。
private void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取需要删除的用户的编号
String id = req.getParameter("id");
//通过service来进行操作
Integer count = userService.deleteUser(Integer.parseInt(id));
//对判断条数
if (count>0){
//进行重定向跳转
resp.sendRedirect("/userServlet");
}else{
//删除失败
System.out.println("删除失败……");
}
}
3.业务层
在接口中调用添加用户的方法,注意返回值为Integer
,表示影响返回参数id
的用户信息收到影响。
@Override
public Integer deleteUser(Integer id) {
return userDao.delete(id);
}
在实现类实现所调用的接口就能完成业务层的处理。
package com.song.bookmanagersystem.service;
import com.song.bookmanagersystem.entity.User;
import java.util.List;
public interface UserService {
//业务层删除用户
Integer deleteUser(Integer id);
}
4.持久层
在dao
层要完成信息的查库操作,与数据库的信息进行比对,并返回响应的结果,这是删除的操作,所以返回响应的结果是否删除成功,并且要将数据作为返回值进行传递。
@Override
public Integer delete(Integer id) {
QueryRunner queryRunner = DBUtils.getQueryRunner();
String sql="delete from t_user where id= ?";
try {
return queryRunner.update(sql,id);
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
5.乱码问题
在新增用户信息时,当输入的字段信息为中文时,在前端页面和数据库中都有可能出现乱码问题。
针对乱码问题,我们选择在用户发送请求时,将用户输入的信息做字符集编码格式的处理,这样后面的每一步都将可以正常的操作和显示,从源头上解决乱码问题,所以在POST请求时,就设置字符编码格式 req.setCharacterEncoding("UTF-8")
。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置post请求中解码的方式
req.setCharacterEncoding("UTF-8");
String type=req.getParameter(Constant.SERVLET_TYPE_SQLTYPE);
if (type!=null && !"".equals(type)){
//对请求进行判断,针对不同的请求进行不同的处理
if(Constant.SERVLET_TYPE_SAVE.equals(type)){
//进行添加操作
try {
saveUser(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}else if (Constant.SERVLET_TYPE_UPDATE.equals(type)){
//进行更新操作
}else if (Constant.SERVLET_TYPE_DELETE.equals(type)){
//进行删除操作
deleteUser(req,resp);
}else if(Constant.SERVLET_TYPE_QUERY.equals(type)){
//进行查询操作
queryUser(req, resp);
}
}else{
queryUser(req,resp);
}
}
三、功能测试
启动服务器,让项目在服务器中运行,实现在新增的功能下测试中文的输入是否还存在乱码问题,然后在网页上进行删除用户数据的测试。
页面已经可以正常显示中文字段信息,说明中文乱码问题已经解决,下面测试删除信息的功能。
点击删除按钮后,页面再次跳转回用户信息页面,并且刚刚删除的数据信息已经不存在,在数据库中也不存在该用户信息,说明用户删功能已经完成。
总结
以上就是今天要讲的内容,使用【Servlet】
+【JQuery】
+【Mysql】
对用户删除功能进行实现,发现能成功删除数据库中的用户信息,并且能够数据返回到前端页面进行渲染,重新返回到用户信息页面,同时解决了中文乱码问题,设置字符编码格式是防止乱码的有效方法。