簡易圖書管理系統(主要是jsp+servlet的練習):https://blog.csdn.net/Biexiansheng/article/details/70240413
免費提供源碼,有償提供服務,支持項目定制。
自此,基於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="http://displaytag.sf.net"%> 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="${user.userAccount }" class="form-control" placeholder="請輸入查詢賬號" /> 36 <label>姓名:</label> 37 <input type="text" name="userName" value="${user.userName }" class="form-control" placeholder="請輸入查詢姓名" /> 38 <select class="form-control" name="userMark"> 39 <option value="">全部</option> 40 <option value="0" ${user.userMark=='0'?'selected':'' }>普通會員</option> 41 <option value="1" ${user.userMark=='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層。
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 @Override 22 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 @Override 126 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 @Override 135 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完成用戶信息的增刪改查已經完結了,希望對大家有所幫助。后面會繼續寫圖書的增刪改查,但是圖書的增刪改查的代碼和流程不再敘述,因為只是字段不一致而已,將介紹使用的小工具的具體用法,當寫借書的時候再將用戶借書的代碼分享出來,那么整個合起來就完成了簡易的圖書管理系統。(每次代碼的分享都是在原有基礎上不斷的增加,所以最后的代碼分享肯定比開始的代碼分享復雜合完整。)