基于jsp+servlet图书管理系统之后台用户信息删除操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于jsp+servlet图书管理系统之后台⽤户信息删除操作免费提供源码,有偿提供服务,⽀持项⽬定制。
⾃此,基于jsp+servlet开发的⽤户信息增删该查已经全部写完了,上⾯的链接是全部的代码,包含增删该查和数据库。
注意点:
1:删除操作使⽤的是伪删除。
即只是不在页⾯显⽰了,但是还保存在数据库。
2:分页查询使⽤的是⼀个⼩⼯具,后⾯有时间把这些很实⽤的⼩⼯具详细介绍⼀下。
3:在提交的表单和后台数据交互的时候使⽤了⼀个封装好的⼩⼯具。
后⾯有时间介绍。
下⾯先将删除操作的流程过⼀遍:
1:执⾏伪删除操作的流程:
1.1:点击删除按钮就是这⼀句话,提交到system/userinfodelete这个路径的servlet层,注意是doSet()⽅法。
<d:column href="system/userinfodelete" value="删除" 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=""%>
11 <!DOCTYPE html>
12 <html>
13 <head>
14 <base href="<%=basePath %>" />
15 <meta charset="UTF-8">
16 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
17 <title>⽤户管理-⽤户查询</title>
18 <link href="resource/css/bootstrap.min.css" rel="stylesheet" />
19 <script type="text/javascript" src="resource/js/jquery.min.js"></script>
20 <script type="text/javascript"
21 src="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="${erAccount }" class="form-control" placeholder="请输⼊查询账号" />
36 <label>姓名:</label>
37 <input type="text" name="userName" value="${erName }" class="form-control" placeholder="请输⼊查询姓名" />
38 <select class="form-control" name="userMark">
39 <option value="">全部</option>
40 <option value="0" ${erMark=='0'?'selected':'' }>普通会员</option>
41 <option value="1" ${erMark=='1'?'selected':'' }>管理员</option>
42 </select>
43 </div>
44 <input type="submit" class="btn btn-danger" value="查询"> <a
45 href="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="system/userinfoupdate" value="修改" title="修改" paramId="userId" paramProperty="userId"></d:column>
58 <!-- 这⾥提交到的是相对应的servlet的doSet⽅法⾥⾯ -->
59 <d:column href="system/userinfodelete" value="删除" title="删除" paramId="userId" paramProperty="userId"></d:column>
60 <!-- 需要注意的是删除做的是伪删除,数据库⾥⾯的信息依旧保存 -->
61 </d:table>
62 </div>
63 </form>
64 </body>
65 </html>
2:之后就到了删除的servlet层。
1package com.bie.system.servlet;
2
3import java.io.IOException;
4
5import javax.servlet.ServletException;
6import javax.servlet.annotation.WebServlet;
7import javax.servlet.http.HttpServlet;
8import javax.servlet.http.HttpServletRequest;
9import javax.servlet.http.HttpServletResponse;
10
11import erInfo;
12import erInfoService;
13import erInfoServiceImpl;
14import com.my.web.servlet.RequestBeanUtils;
15
16 @WebServlet("/system/userinfodelete")
17public class UserInfoDeleteServlet extends HttpServlet{
18
19private static final long serialVersionUID = 1L;
20
21 @Override
22protected void doGet(HttpServletRequest request, HttpServletResponse response)
23throws ServletException, IOException {
24//将表单提交的数据封装到javabean中的⽤户信息表中
25 UserInfo user=RequestBeanUtils.requestToSimpleBean(request, UserInfo.class);
26 UserInfoService service=new UserInfoServiceImpl();
27//调⽤业务逻辑层的删除⽅法
28boolean mark=service.deleteUser(user);
29if(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层(业务逻辑层)的伪删除⽅法
1package com.bie.system.service.impl;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import erInfo;
7import erInfoDao;
8import erInfoDaoImpl;
9import erInfoService;
10import com.bie.utils.DbUtils;
11import com.bie.utils.MarkUtils;
12/***
13 * 1.4:这是业务逻辑层的实现类,实现⽤户信息的接⼝
14 *
15 * 切忌新⼿写好service业务逻辑层需要test测试(junit)
16 * @author biehongli
17 *
18*/
19public class UserInfoServiceImpl implements UserInfoService{
20
21private UserInfoDao dao=new UserInfoDaoImpl();
22 @Override
23public boolean insertUser(UserInfo user) {
24try{
25//System.out.println(user);//测试传来的UserInfo⾥⾯是否够存在⽤户信息
26if(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(ER_MARK_MANAGER);
41//将设置为默认的管理员添加到数据库
42 list.add(user.getUserMark());
43
44//将封装到集合list中的信息和sql语句传递到DbUtils封装好的⽅法中
45//这⾥sql转化位String语句,list转化位数组类型
46int count=DbUtils.addAndUpdate(sql.toString(), list.toArray());
47//System.out.println(count);//测试返回值是0还是1
48if(count>0){
49return true;//成功返回true
50 }else{
51return false;//失败返回false
53 }
54 }catch(Exception e){
55 e.printStackTrace();
56 }
57return false;
58 }
59
60 @Override
61public 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//判断⽤户的信息不为空的时候
68if(user!=null){
69 list=new ArrayList<Object>();
70//按照账号查询,如果账号不为null且不为空
71if(user.getUserAccount()!=null && !user.getUserAccount().equals("")){
72 sql.append(" and user_account=?");
73 list.add(user.getUserAccount());
74 }
75//按照姓名查询,如果姓名不为null且不为空
76if(user.getUserName()!=null && !user.getUserName().equals("")){
77 sql.append(" and user_name like ?");
78//模糊查询这样拼接字符串
79 list.add("%"+user.getUserName()+"%");
80 }
81//按照标识查询,如果标识不为null且不为空
82if(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语句是字符类型,集合转化为数组类型
90return dao.selectUser(sql.toString(), list.toArray());
91 }
92
93 @Override
94public boolean updateUser(UserInfo user) {
95try{
96if(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//添加和修改(伪删除)都可以调⽤⼯具类⾥⾯公共的⽅法。
112int count=DbUtils.addAndUpdate(sql, list.toArray());
113if(count>0){
114return true;
115 }else{
116return false;
117 }
118 }
119 }catch(Exception e){
120 e.printStackTrace();
121 }
122return false;
123 }
124
125 @Override
126public UserInfo getUser(UserInfo user) {
127//判断⽤户信息和id编号是否为空
128if(user!=null && user.getUserId()!=null){
129return dao.getUser(user.getUserId());
130 }
131return null;
132 }
133
134 @Override
135public boolean deleteUser(UserInfo user) {
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(ER_MARK_DEL);
141 list.add(user.getUserId());
142int count=DbUtils.addAndUpdate(sql, list.toArray());
143if(count>0){
144return true;
145 }else{
146return false;
147 }
148 }catch(Exception e){
149 e.printStackTrace();
150 }
151return false;
152 }
153
154
155 }
4:执⾏service业务逻辑层之后调⽤⼯具类
1package com.bie.utils;
2
3import java.sql.Connection;
4import java.sql.DriverManager;
5import java.sql.PreparedStatement;
6import java.sql.ResultSet;
7import java.util.ResourceBundle;
8
9/***
10 * 1.1:写DbUtils的⼯具类
11 * :utils是⼯具类,⽅便以后调⽤
12 * 在main⽅法测试的时候出现⼀个错误,
13 * 瞄了⼀眼⽴马想到了没有添加mysql的驱动,
14 * 所以我感觉测试还是很有必要的
15 * @author biehongli
16 *
17*/
18public class DbUtils {
19
20private static String drivername;//数据库驱动,为了加载数据库驱动
21private static String url;//数据库连接字符串,只要是找到⾃⼰的数据库,需要和⾃⼰的数据库⼀致 22private static String user;//数据库账号,需要和⾃⼰的⼀致
23private static String password;//数据库密码,需要和⾃⼰的⼀致
24
25static{
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*/
37public 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("测试连接到数据库");
43return con;
44 }
45
46/***
47 * 这个⽤来判断关闭数据库的⽅法
48 * @param con 关闭Connection的连接
49 * @param ps 关闭PreparedStatement
50 * @param rs 关闭ResultSet
51*/
52public static void getClose(Connection con,PreparedStatement ps,ResultSet rs){
53//关闭数据库,注意关闭的顺序。
养成好习惯
54try{
55if(rs!=null){
56 rs.close();
57 }
58if(ps!=null){
59 ps.close();
60 }
61if(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*/
77public static int addAndUpdate(String sql,Object[] arr){
78 Connection con=null;
79 PreparedStatement ps=null;
80try{
81 con=DbUtils.getCon();//第⼀步连接数据库
82 ps=con.prepareStatement(sql);//第⼆步预编译
83//第三步给sql语句中的参数复制
84for(int i=0;i<arr.length;i++){
85 ps.setObject(i+1, arr[i]);
86 }
87//第四步执⾏sql并且返回。
88return ps.executeUpdate();
89 }catch(Exception e){
90 e.printStackTrace();
91 }finally{
92//关闭资源,如果没有ResultSet类型的,加上null即可
93 DbUtils.getClose(con, ps, null);
94 }
95return 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完成⽤户信息的增删改查已经完结了,希望对⼤家有所帮助。
后⾯会继续写图书的增删改查,但是图书的增删改查的代码和流程不再叙述,因为只是字段不⼀致⽽已,将介绍使⽤的⼩⼯具的具体⽤法,当写借书的时候再将⽤户借书的代码分享出来,那么整个合起来就完成了简易的图书管理系统。
(每次代码的分享都是在原有基础上不断的增加,所以最后的代码分享肯定⽐开始的代码分享复杂合完整。
)。