首页 > 代码库 > 基于jsp+servlet图书管理系统之后台用户信息删除操作
基于jsp+servlet图书管理系统之后台用户信息删除操作
上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库!
此次删除操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732955
自此,基于jsp+servlet开发的用户信息增删该查已经全部写完了,上面的链接是全部的代码,包含增删该查和数据库。
注意点:
1:删除操作使用的是伪删除。即只是不在页面显示了,但是还保存在数据库。
2:分页查询使用的是一个小工具,后面有时间把这些很实用的小工具详细介绍一下。
3:在提交的表单和后台数据交互的时候使用了一个封装好的小工具。后面有时间介绍。
下面先将删除操作的流程过一遍:
1:执行伪删除操作的流程:
1.1:点击删除按钮就是这一句话,提交到system/userinfodelete这个路径的servlet层,注意是doSet()方法。
<d:column href="http://www.mamicode.com/system/userinfodelete" value="http://www.mamicode.com/删除" title="删除"
paramId="userId" paramProperty="userId">
</d:column>
1.2:执行到servlet 层之后调用service业务逻辑层伪删除方法。
UserInfoService service=new UserInfoServiceImpl();
//调用业务逻辑层的删除方法
boolean mark=service.deleteUser(user);
1.3:service层(业务逻辑层)调用工具类的公共方法,
(由于修改和插入可以提取公共的方法,这里做的伪删除其实就是修改也可以使用工具类)
int count=DbUtils.addAndUpdate(sql, list.toArray());
1.4:执行工具类之后又返回到service层(业务逻辑层)
return ps.executeUpdate();
1.5:业务逻辑层又返回true或者false,返回到servlet层。
int count=DbUtils.addAndUpdate(sql, list.toArray());
if(count>0){
return true;
}else{
return false;
}
1.6:执行servlet层之后之后转发到user_info.jsp页面,并且提示信息
boolean mark=service.deleteUser(user);
if(mark){
request.setAttribute("info", "用户信息删除成功");
}else{
request.setAttribute("info", "用户信息删除失败");
}
request.getRequestDispatcher("/view/system/userinfo/user_info.jsp").forward(request, response);
1.7:执行到user_info.jsp页面之后又转到system/userinfoselect这个servlet层。
window.location="system/userinfoselect";
1.8:转到servlet层之后又转发到userinfo_list.jsp页面。显示当前删除之后的信息。
request.getRequestDispatcher("/view/system/userinfo/userinfo_list.jsp").forward(request, response);
至此删除信息已经完成了,不过需要注意的是删除操作到了上面1.8这个步奏的时候执行select语句很特殊,需要注意
StringBuffer sql=new StringBuffer("select * from user_info where user_mark!=-1 ");
即做了标识,-1作为伪删除的,所以查询出!=-1的信息,但是数据库里面的信息还是存在的。
下面将重要的代码按照流程写一下:
1:点击删除按钮,即下面此页面的代码。
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //获取绝对路径路径 5 String path = request.getContextPath(); 6 String basePath = request.getScheme() + "://" 7 + request.getServerName() + ":" + request.getServerPort() 8 + path + "/"; 9 %> 10 <%@ taglib prefix="d" uri="http://displaytag.sf.net"%>11 <!DOCTYPE html>12 <html>13 <head>14 <base href="http://www.mamicode.com/" />15 <meta charset="UTF-8">16 <meta name="viewport" content="width=device-width, initial-scale=1.0" />17 <title>用户管理-用户查询</title>18 <link href="http://www.mamicode.com/resource/css/bootstrap.min.css" rel="stylesheet" />19 <script type="text/javascript" src="http://www.mamicode.com/resource/js/jquery.min.js"></script>20 <script type="text/javascript"21 src="http://www.mamicode.com/resource/js/bootstrap.min.js"></script>22 </head>23 <body>24 <div>25 <ul class="breadcrumb" style="margin: 0px;">26 <li>系统管理</li>27 <li>用户管理</li>28 <li>用户查询</li>29 </ul>30 </div>31 <form action="system/userinfoselect" class="form-inline" method="post">32 <div class="row alert alert-info" style="margin: 0px; padding: 5px;">33 <div class="form-group">34 <label>账号:</label> 35 <input type="text" name="userAccount" value="http://www.mamicode.com/${user.userAccount }" class="form-control" placeholder="请输入查询账号" />36 <label>姓名:</label> 37 <input type="text" name="userName" value="http://www.mamicode.com/${user.userName }" class="form-control" placeholder="请输入查询姓名" />38 <select class="form-control" name="userMark">39 <option value="">全部</option>40 <option value="http://www.mamicode.com/0" ${user.userMark==‘0‘?‘selected‘:‘‘ }>普通会员</option>41 <option value="http://www.mamicode.com/1" ${user.userMark==‘1‘?‘selected‘:‘‘ }>管理员</option>42 </select> 43 </div>44 <input type="submit" class="btn btn-danger" value="http://www.mamicode.com/查询"> <a45 href="http://www.mamicode.com/view/system/userinfo/userinfo_add.jsp" class="btn btn-success">添加用户</a>46 </div>47 <div class="row" style="padding: 15px;">48 <d:table name="list" pagesize="5" requestURI="system/userinfoselect" class="table table-hover table-condensed">49 <d:column property="userId" title="用户编号"></d:column>50 <d:column property="userAccount" title="用户账号"></d:column>51 <d:column property="userPw" title="用户密码"></d:column>52 <d:column property="userNumber" title="用户学号"></d:column>53 <d:column property="userName" title="用户姓名"></d:column>54 <d:column property="userAge" title="用户年龄"></d:column>55 <d:column property="userSex" title="用户性别"></d:column>56 <d:column property="userMark" title="用户标识"></d:column>57 <d:column href="http://www.mamicode.com/system/userinfoupdate" value="http://www.mamicode.com/修改" title="修改" paramId="userId" paramProperty="userId"></d:column>58 <!-- 这里提交到的是相对应的servlet的doSet方法里面 -->59 <d:column href="http://www.mamicode.com/system/userinfodelete" value="http://www.mamicode.com/删除" title="删除" paramId="userId" paramProperty="userId"></d:column>60 <!-- 需要注意的是删除做的是伪删除,数据库里面的信息依旧保存 -->61 </d:table>62 </div>63 </form>64 </body>65 </html>
2:之后就到了删除的servlet层。
1 package com.bie.system.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 11 import com.bie.po.UserInfo;12 import com.bie.system.service.UserInfoService;13 import com.bie.system.service.impl.UserInfoServiceImpl;14 import com.my.web.servlet.RequestBeanUtils;15 16 @WebServlet("/system/userinfodelete")17 public class UserInfoDeleteServlet extends HttpServlet{18 19 private static final long serialVersionUID = 1L;20 21 @Override22 protected void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException {24 //将表单提交的数据封装到javabean中的用户信息表中25 UserInfo user=RequestBeanUtils.requestToSimpleBean(request, UserInfo.class);26 UserInfoService service=new UserInfoServiceImpl();27 //调用业务逻辑层的删除方法28 boolean mark=service.deleteUser(user);29 if(mark){30 request.setAttribute("info", "用户信息删除成功");31 }else{32 request.setAttribute("info", "用户信息删除失败");33 }34 request.getRequestDispatcher("/view/system/userinfo/user_info.jsp").forward(request, response);35 }36 37 38 39 }
3:执行删除的servlet层之后调用service层(业务逻辑层)的伪删除方法
1 package com.bie.system.service.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.bie.po.UserInfo; 7 import com.bie.system.dao.UserInfoDao; 8 import com.bie.system.dao.impl.UserInfoDaoImpl; 9 import com.bie.system.service.UserInfoService; 10 import com.bie.utils.DbUtils; 11 import com.bie.utils.MarkUtils; 12 /*** 13 * 1.4:这是业务逻辑层的实现类,实现用户信息的接口 14 * 15 * 切忌新手写好service业务逻辑层需要test测试(junit) 16 * @author biehongli 17 * 18 */ 19 public class UserInfoServiceImpl implements UserInfoService{ 20 21 private UserInfoDao dao=new UserInfoDaoImpl(); 22 @Override 23 public boolean insertUser(UserInfo user) { 24 try{ 25 //System.out.println(user);//测试传来的UserInfo里面是否够存在用户信息 26 if(user!=null && user.getUserAccount()!=null){ 27 String sql="INSERT INTO user_info(user_account,user_pw," 28 + "user_number,user_name,user_age,user_sex,user_mark)" 29 + " VALUES(?,?,?,?,?,?,?)"; 30 List<Object> list=new ArrayList<Object>(); 31 //可以理解位将实体类中get到的信息放到数据库中,因为set设置的信息就是为了查到数据库中 32 list.add(user.getUserAccount());//将设置好的账号信息保存到集合中 33 list.add(user.getUserPw());//将设置好的账号信息保存到集合中 34 list.add(user.getUserNumber());//将设置好的密码信息保存到集合中 35 list.add(user.getUserName());//将设置好的姓名信息保存到集合中 36 list.add(user.getUserAge());//将设置好的年龄信息保存到集合中 37 list.add(user.getUserSex());//将设置好的性别信息保存到集合中 38 //list.add(user.getUserMark());//将设置好的标识信息保存到集合中 39 //后台只可以添加管理员 40 user.setUserMark(MarkUtils.USER_MARK_MANAGER); 41 //将设置为默认的管理员添加到数据库 42 list.add(user.getUserMark()); 43 44 //将封装到集合list中的信息和sql语句传递到DbUtils封装好的 方法中 45 //这里sql转化位String语句,list转化位数组类型 46 int count=DbUtils.addAndUpdate(sql.toString(), list.toArray()); 47 //System.out.println(count);//测试返回值是0还是1 48 if(count>0){ 49 return true;//成功返回true 50 }else{ 51 return false;//失败返回false 52 } 53 } 54 }catch(Exception e){ 55 e.printStackTrace(); 56 } 57 return false; 58 } 59 60 @Override 61 public List<UserInfo> selectUser(UserInfo user) { 62 //使用StringBuffer进行字符串的拼接,不使用String 63 //StringBuffer sql=new StringBuffer("select * from user_info where 1=1 "); 64 StringBuffer sql=new StringBuffer("select * from user_info where user_mark!=-1 "); 65 //设置集合,用户存放用户信息设置值的时候使用 66 List<Object> list=null; 67 //判断用户的信息不为空的时候 68 if(user!=null){ 69 list=new ArrayList<Object>(); 70 //按照账号查询,如果账号不为null且不为空 71 if(user.getUserAccount()!=null && !user.getUserAccount().equals("")){ 72 sql.append(" and user_account=?"); 73 list.add(user.getUserAccount()); 74 } 75 //按照姓名查询,如果姓名不为null且不为空 76 if(user.getUserName()!=null && !user.getUserName().equals("")){ 77 sql.append(" and user_name like ?"); 78 //模糊查询这样拼接字符串 79 list.add("%"+user.getUserName()+"%"); 80 } 81 //按照标识查询,如果标识不为null且不为空 82 if(user.getUserMark()!=null && !user.getUserMark().equals("")){ 83 sql.append(" and user_mark=?"); 84 list.add(user.getUserMark()); 85 } 86 } 87 88 sql.append(" order by user_id desc"); 89 //返回的参数,sql语句是字符类型,集合转化为数组类型 90 return dao.selectUser(sql.toString(), list.toArray()); 91 } 92 93 @Override 94 public boolean updateUser(UserInfo user) { 95 try{ 96 if(user!=null && user.getUserId()!=null){ 97 //更新的sql语句 98 String sql="UPDATE user_info SET user_account=?," 99 + "user_pw=?,user_number=?,user_name=?,"100 + "user_age=?,user_sex=? WHERE user_id=?";101 List<Object> list=new ArrayList<Object>();102 //添加到集合中的顺序必须和上面些的字段一致,不然报错103 list.add(user.getUserAccount());104 list.add(user.getUserPw());105 list.add(user.getUserNumber());106 list.add(user.getUserName());107 list.add(user.getUserAge());108 list.add(user.getUserSex());109 list.add(user.getUserId());110 111 //添加和修改(伪删除)都可以调用工具类里面公共的方法。112 int count=DbUtils.addAndUpdate(sql, list.toArray());113 if(count>0){114 return true;115 }else{116 return false;117 }118 }119 }catch(Exception e){120 e.printStackTrace();121 }122 return false;123 }124 125 @Override126 public UserInfo getUser(UserInfo user) {127 //判断用户信息和id编号是否为空128 if(user!=null && user.getUserId()!=null){129 return dao.getUser(user.getUserId());130 }131 return null;132 }133 134 @Override135 public boolean deleteUser(UserInfo user) {136 try{137 String sql="update user_info set user_mark=? where user_id=?";138 List<Object> list=new ArrayList<Object>();139 //直接给user_mark设置为-1,查询的时候加上等于-1的不显示,即在页面就无法显示了140 list.add(MarkUtils.USER_MARK_DEL);141 list.add(user.getUserId());142 int count=DbUtils.addAndUpdate(sql, list.toArray());143 if(count>0){144 return true;145 }else{146 return false;147 }148 }catch(Exception e){149 e.printStackTrace();150 }151 return false;152 }153 154 155 }
4:执行service业务逻辑层之后调用工具类
1 package com.bie.utils; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.util.ResourceBundle; 8 9 /*** 10 * 1.1:写DbUtils的工具类 11 * :utils是工具类,方便以后调用 12 * 在main方法测试的时候出现一个错误, 13 * 瞄了一眼立马想到了没有添加mysql的驱动, 14 * 所以我感觉测试还是很有必要的 15 * @author biehongli 16 * 17 */ 18 public class DbUtils { 19 20 private static String drivername;//数据库驱动,为了加载数据库驱动 21 private static String url;//数据库连接字符串,只要是找到自己的数据库,需要和自己的数据库一致 22 private static String user;//数据库账号,需要和自己的一致 23 private static String password;//数据库密码,需要和自己的一致 24 25 static{ 26 drivername=ResourceBundle.getBundle("db").getString("drivername"); 27 url=ResourceBundle.getBundle("db").getString("url"); 28 user=ResourceBundle.getBundle("db").getString("user"); 29 password=ResourceBundle.getBundle("db").getString("password"); 30 } 31 32 /*** 33 * 加载数据库驱动和连接到数据库,我一般是加载和连接的时候分别输出,可以快速找到哪里出错 34 * @return 35 * @throws Exception 36 */ 37 public static Connection getCon() throws Exception{ 38 Class.forName(drivername);//记载数据库驱动 39 System.out.println("测试加载数据库驱动"); 40 //连接到数据库 41 Connection con=DriverManager.getConnection(url, user, password); 42 System.out.println("测试连接到数据库"); 43 return con; 44 } 45 46 /*** 47 * 这个用来判断关闭数据库的方法 48 * @param con 关闭Connection的连接 49 * @param ps 关闭PreparedStatement 50 * @param rs 关闭ResultSet 51 */ 52 public static void getClose(Connection con,PreparedStatement ps,ResultSet rs){ 53 //关闭数据库,注意关闭的顺序。养成好习惯 54 try{ 55 if(rs!=null){ 56 rs.close(); 57 } 58 if(ps!=null){ 59 ps.close(); 60 } 61 if(con!=null){ 62 con.close(); 63 } 64 }catch(Exception e){ 65 e.printStackTrace(); 66 } 67 } 68 69 /*** 70 * 添加(插入)和更新(更改)可以提取公共的方法写在工具类中 71 * 删除一般使用伪删除,这样删除就是更新(更改)操作, 72 * 所以只有查询(查找)需要写更多的代码 73 * @param sql 外面传来的sql语句 74 * @param arr 外面传来的数组类型的,是用户信息封装到集合传递进来 75 * @return 返回的是一个整形的数据类型 76 */ 77 public static int addAndUpdate(String sql,Object[] arr){ 78 Connection con=null; 79 PreparedStatement ps=null; 80 try{ 81 con=DbUtils.getCon();//第一步连接数据库 82 ps=con.prepareStatement(sql);//第二步预编译 83 //第三步给sql语句中的参数复制 84 for(int i=0;i<arr.length;i++){ 85 ps.setObject(i+1, arr[i]); 86 } 87 //第四步执行sql并且返回。 88 return ps.executeUpdate(); 89 }catch(Exception e){ 90 e.printStackTrace(); 91 }finally{ 92 //关闭资源,如果没有ResultSet类型的,加上null即可 93 DbUtils.getClose(con, ps, null); 94 } 95 return 0; 96 } 97 /*public static void main(String[] args) { 98 //我一般在写好连接数据库的工具类时先测试一下,避免连接数据库都失败,测试后可注释即可 99 try {100 DbUtils.getCon();101 System.out.println("测试连接数据库终极版!!!");102 } catch (Exception e) {103 e.printStackTrace();104 }105 }*/106 }
5:执行工具类之后返回到service层(业务逻辑层),service层(业务逻辑层)返回到servlet层,删除的servlet层,删除的servlet层到提示信息层,提示信息层到查询的servlet层,查询的servlet层执行service层(业务逻辑层),service层(业务逻辑层)调用用户信息的dao层(数据交互层),dao层返回到service层(业务逻辑层),service层(业务逻辑层)返回到查询的servlet层,servlet层转发到userinfo_list.jsp这个显示用户信息的页面。至此伪删除操作全部完成,希望看到这个博客的明白这个执行的流程,思路明白,代码会写,这样就ok了。
最后将演示的效果展示一下:
打开用户信息的页面:
点击删除之后查看第一行已经消失咯哦:
至此使用jsp+servlet完成用户信息的增删改查已经完结了,希望对大家有所帮助。后面会继续写图书的增删改查,但是图书的增删改查的代码和流程不再叙述,因为只是字段不一致而已,将介绍使用的小工具的具体用法,当写借书的时候再将用户借书的代码分享出来,那么整个合起来就完成了简易的图书管理系统。(每次代码的分享都是在原有基础上不断的增加,所以最后的代码分享肯定比开始的代码分享复杂合完整。)
基于jsp+servlet图书管理系统之后台用户信息删除操作