簡易圖書管理系統(主要是jsp+servlet的練習):https://blog.csdn.net/Biexiansheng/article/details/70240413javascript
免費提供源碼,有償提供服務,支持項目定製。css
爲了方便理解和說明,先寫一下執行的流程和步奏,詳細代碼能夠下載鏈接。html
1:修改操做的執行流程:java
1.1:修改操做須要先獲取到用戶信息的編號,而後才能夠進行修改,腦子裏必定有這個思路。故獲取用戶編號的操做即爲查詢操做。這裏使用了一個小工具進行分頁操做,感興趣的能夠下載源碼查看,看成練手使用也是灰常不錯的選擇。jquery
<d:column href="system/userinfoupdate" value="修改" title="修改" web
paramId="userId" paramProperty="userId"> sql
</d:column>
<!-- 這裏提交到的是相對應的servlet的doSet方法裏面 -->
1.2:點擊修改提交到system/userinfoupdate這個路徑的servlet層。而後到了後臺調用service業務邏輯層的getUser方法。
數據庫
UserInfoService service=new UserInfoServiceImpl();
//調用service業務邏輯層的getUser方法
UserInfo userInfo=service.getUser(user); bootstrap
1.3:而後業務邏輯層調用dao層(數據處理=層),return dao.getUser(user.getUserId());數組
1.4:dao層(數據處理層)執行和數據庫的鏈接等等操做以後執行 return user;//返回用戶的信息
1.5:service層執行return dao.getUser(user.getUserId());返回到servlet層
1.6:servlet層轉發到 userinfo_update.jsp更新操做的jsp頁面
request.getRequestDispatcher("/view/system/userinfo/userinfo_update.jsp").forward(request, response);
1.7:在更新頁面沒修改好以後就能夠提交到system/userinfoupdate這個執行更新操做的servlet層的doPost方法。須要注意的是隱藏文本框是爲了獲取用戶編號,必定要寫,否則獲取不到用戶的編號,沒法進行修改。
<form action="system/userinfoupdate" class="form-horizontal" method="post">
<input type="hidden" name="userId" value="${user.userId }"/>
</form>
1.8:執行到這個修改的servlet層以後調用業務邏輯層的修改方法。
UserInfoService service=new UserInfoServiceImpl();
boolean mark=service.updateUser(user);
1.9:service業務邏輯層(修改,插入,僞刪除都是使用提出來的工具類的方法),因此調用工具類裏面的方法。
//添加和修改(僞刪除)均可以調用工具類裏面公共的方法。
int count=DbUtils.addAndUpdate(sql, list.toArray());
2.0:工具類裏面的方法執行以後返回執行的結果。return ps.executeUpdate();
2.1:又返回到了service層,將執行的true或者false結果返回到servlet層。
//添加和修改(僞刪除)均可以調用工具類裏面公共的方法。
int count=DbUtils.addAndUpdate(sql, list.toArray());
if(count>0){
return true;
}else{
return false;
}
2.2:最後返回到了修改的servlet層
boolean mark=service.updateUser(user);
//判斷最後返回值是否爲true,若是爲true,提示修改爲功,不然提示修改失敗
if(mark){
request.setAttribute("info", "用戶信息修改爲功");
}else{
request.setAttribute("info", "用戶信息修改失敗");
}
request.getRequestDispatcher("/view/system/userinfo/user_info.jsp").forward(request, response);
2.3:判斷上面的true或者false以後轉發到user_info.jsp這個頁面,這個頁面用來提示信息
2.4:提示信息以後又由js的window跳轉到system/userinfoselect這個路徑的servlet層。
window.location="system/userinfoselect";
2.5: 跳轉到這個servlet層以後轉發到userinfo_list.jsp這個頁面。顯示出修改以後的結果。完成修改操做
request.getRequestDispatcher("/view/system/userinfo/userinfo_list.jsp").forward(request, response);
至此修改操做基本完成;
下面將執行流程的重要代碼寫一下,但願對學習基於java開發的web方法的小夥伴有所幫助,也方便之後自行腦補。詳細的代碼能夠去連接地址下載。 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 60 </d:table> 61 </div> 62 </form> 63 </body> 64 </html>
2:點擊修改以後就到了修改的servlet層的doSet方法
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/userinfoupdate") 17 public class UserInfoUpdateServlety extends HttpServlet{ 18 19 private static final long serialVersionUID = 1L; 20 21 @Override 22 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 //將從表單中獲取的數據封裝到javabean的用戶信息實體類中 24 UserInfo user=RequestBeanUtils.requestToSimpleBean(request, UserInfo.class); 25 UserInfoService service=new UserInfoServiceImpl(); 26 //調用service業務邏輯層的getUser方法 27 UserInfo userInfo=service.getUser(user); 28 //將返回的用戶信息設置域中 29 request.setAttribute("user", userInfo); 30 //轉發到更新用戶信息的頁面 31 request.getRequestDispatcher("/view/system/userinfo/userinfo_update.jsp").forward(request, response); 32 } 33 34 @Override 35 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 36 //將表單提交的數據封裝到javabean中的實體類中 37 UserInfo user=RequestBeanUtils.requestToSimpleBean(request, UserInfo.class); 38 //調用業務邏輯層的更新的方法 39 UserInfoService service=new UserInfoServiceImpl(); 40 boolean mark=service.updateUser(user); 41 //判斷最後返回值是否爲true,若是爲true,提示修改爲功,不然提示修改失敗 42 if(mark){ 43 request.setAttribute("info", "用戶信息修改爲功"); 44 }else{ 45 request.setAttribute("info", "用戶信息修改失敗"); 46 } 47 request.getRequestDispatcher("/view/system/userinfo/user_info.jsp").forward(request, response); 48 } 49 50 51 }
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 1=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 135 }
4:因爲是查詢操做,因此還須要寫dao層(數據處理層),因此又執行到了dao層
1 package com.bie.system.dao.impl; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import com.bie.po.UserInfo; 10 import com.bie.system.dao.UserInfoDao; 11 import com.bie.utils.DbUtils; 12 13 /*** 14 * 2.2:實現查詢的接口 15 * @author biehongli 16 * 17 */ 18 public class UserInfoDaoImpl implements UserInfoDao{ 19 20 @Override 21 public List<UserInfo> selectUser(String sql, Object[] arr) { 22 Connection con=null; 23 PreparedStatement ps=null; 24 ResultSet rs=null; 25 List<UserInfo> list=null; 26 try{ 27 con=DbUtils.getCon();//鏈接數據庫 28 ps=con.prepareStatement(sql);//預編譯 29 //爲查詢條件設置值,如爲第一個設置爲何,爲第二個設置爲何 30 if(arr!=null && arr.length>0){ 31 for(int i=0;i<arr.length;i++){ 32 ps.setObject(i+1, arr[i]); 33 } 34 } 35 //執行sql語句 36 rs=ps.executeQuery(); 37 list=new ArrayList<UserInfo>(); 38 //根據查詢條件,從數據庫匹配適合的條件,而後設置這個條件的所有信息 39 while(rs.next()){ 40 UserInfo user=new UserInfo(); 41 user.setUserId(rs.getInt("user_id")); 42 user.setUserAccount(rs.getString("user_account")); 43 user.setUserPw(rs.getString("user_pw")); 44 user.setUserNumber(rs.getString("user_number")); 45 user.setUserName(rs.getString("user_name")); 46 user.setUserAge(rs.getInt("user_age")); 47 user.setUserSex(rs.getString("user_sex")); 48 //user.setUserMark(rs.getString("user_mark")); 49 //根據判斷看是不是管理員或者普通會員 50 if("0".equals(rs.getString("user_mark"))){ 51 user.setUserMark("普通會員"); 52 } 53 if("1".equals(rs.getString("user_mark"))){ 54 user.setUserMark("管理員"); 55 } 56 //將user對象封裝到集合中 57 list.add(user); 58 } 59 //將封裝到集合中的查詢條件返回 60 return list; 61 }catch(Exception e){ 62 e.printStackTrace(); 63 }finally{ 64 //關閉資源,避免出現問題 65 DbUtils.getClose(con, ps, rs); 66 } 67 return null; 68 } 69 70 @Override 71 public UserInfo getUser(Integer userId) { 72 Connection con=null; 73 PreparedStatement ps=null; 74 ResultSet rs=null; 75 try{ 76 String sql="select * from user_info where user_id=?"; 77 con=DbUtils.getCon();//鏈接數據庫 78 ps=con.prepareStatement(sql);//預編譯 79 ps.setInt(1, userId);//給參數設置值 80 rs=ps.executeQuery();//執行sql語句 81 while(rs.next()){ 82 UserInfo user=new UserInfo(); 83 user.setUserId(rs.getInt("user_id")); 84 user.setUserAccount(rs.getString("user_account")); 85 user.setUserPw(rs.getString("user_pw")); 86 user.setUserNumber(rs.getString("user_number")); 87 user.setUserName(rs.getString("user_name")); 88 user.setUserAge(rs.getInt("user_age")); 89 user.setUserSex(rs.getString("user_sex")); 90 if("0".equals(rs.getString("user_mark"))){ 91 user.setUserMark("普通會員"); 92 } 93 if("1".equals(rs.getString("user_mark"))){ 94 user.setUserMark("管理員"); 95 } 96 return user;//返回用戶的信息 97 } 98 }catch(Exception e){ 99 e.printStackTrace(); 100 }finally{ 101 //關閉資源,避免出現異常 102 DbUtils.getClose(con, ps, rs); 103 } 104 return null; 105 } 106 107 108 }
5:執行到了dao層以後返回到service層(業務邏輯層),返回到service層以後servlet層,返回到servlet層以後又返回到userinfo_update.jsp頁面。返回到這個頁面開始修改,修改以後又提交到修改的servlet的doPost的這個方法。提交到servlet的方法以後又調用service層的修改的方法,修改的方法有調用工具類,因爲代碼都貼過了,這裏介紹了一下執行流程,你們有個思路,這種小項目下去練練手就好了。
最後到了user_info.jsp提示信息的頁面,又由js的window轉到了userinfo_list.jsp頁面。最後修改完成。
因爲代碼過多,這裏強調的是執行流程,詳細的代碼設計能夠下載源碼和數據庫自行腦補。
下面簡單看看執行的效果。(想一想一個修改,執行起來。還TMD搞真複雜,哎,碼農不容易啊!)
用戶管理界面的信息:
點擊修改以後的頁面:須要注意的是帳號設置爲可讀不可寫,即不可修改。
保存用戶以後對比顯示用戶信息已經修改完成了。
至此修改演示基本完畢,感興趣的的能夠下載源碼看看。