目錄
項(xiàng)目介紹
數(shù)據(jù)庫設(shè)計(jì)
各包結(jié)構(gòu)設(shè)計(jì)與說明
功能實(shí)現(xiàn)
1. 登錄功能
2. 分頁查詢、模糊查詢
3. 增、刪、改操作
總結(jié)
項(xiàng)目介紹
本項(xiàng)目主要實(shí)現(xiàn)了對用戶信息的管理,能夠在客戶端很好的操作各個(gè)功能,并實(shí)時(shí)更新用戶數(shù)據(jù)。采用?MySQL數(shù)據(jù)庫?存儲數(shù)據(jù),JDBC?連接數(shù)據(jù)庫,Servlet、JSP?等技術(shù)完成各個(gè)功能的具體實(shí)現(xiàn)。界面采用?Bootstrap框架?技術(shù),實(shí)現(xiàn)了一個(gè)簡單的界面效果。
數(shù)據(jù)庫設(shè)計(jì)
為了方便起見,將管理員的用戶名和密碼寫在了用戶信息表中。(不合理的設(shè)計(jì),當(dāng)個(gè)反面教材)
圖示:
各包結(jié)構(gòu)設(shè)計(jì)與說明
![]() |
userInfo_project:模塊名 src / dao:操作數(shù)據(jù)庫的接口(訪問數(shù)據(jù)庫層) src / dao / impl:操作數(shù)據(jù)庫接口的具體實(shí)現(xiàn)類 src / domain:實(shí)體類 src / service:一系列數(shù)據(jù)處理的接口(業(yè)務(wù)邏輯層) src / service / impl:數(shù)據(jù)處理接口的具體實(shí)現(xiàn)類 src / util:連接數(shù)據(jù)庫的工具類 src / web:存放各個(gè)servlet web:前端展示界面(界面層) |
功能實(shí)現(xiàn)
1. 登錄功能
設(shè)計(jì)思路:管理員填寫用戶名和密碼后,通過表單提交到 LoginServlet 進(jìn)行數(shù)據(jù)驗(yàn)證操作。
LoginServlet:
//登錄 @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設(shè)置編碼 request.setCharacterEncoding("utf-8"); //獲取用戶輸入的驗(yàn)證碼 String verifycode = request.getParameter("verifycode"); //獲取系統(tǒng)生成的驗(yàn)證碼 HttpSession session = request.getSession(); String checkCode_server = (String) session.getAttribute("CHECKCODE_SERVER"); //刪除session,確保驗(yàn)證碼的一次性 session.removeAttribute("CHECKCODE_SERVER"); //判斷驗(yàn)證碼:驗(yàn)證碼不正確 if (!checkCode_server.equalsIgnoreCase(verifycode)) { //提示信息 request.setAttribute("login_msg", "驗(yàn)證碼錯誤!"); //跳轉(zhuǎn)登錄頁面,轉(zhuǎn)發(fā) request.getRequestDispatcher("/login.jsp").forward(request, response); return; } //獲取所有參數(shù)的map集合 Map<String, String[]> map = request.getParameterMap(); //封裝User對象 User user = new User(); try { BeanUtils.populate(user, map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } //調(diào)用Service查詢 UserService service = new UserServiceImpl(); User loginUser = service.login(user); //判斷是否登錄成功 if (loginUser != null) { //登錄成功,將用戶存到session session.setAttribute("user", loginUser); //跳轉(zhuǎn)到主頁面,重定向 response.sendRedirect(request.getContextPath() + "/index.jsp"); } else { //登錄失敗,提示錯誤信息 request.setAttribute("login_msg", "用戶名或密碼錯誤!"); //跳轉(zhuǎn)登錄頁面,轉(zhuǎn)發(fā) request.getRequestDispatcher("/login.jsp").forward(request, response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
注意:數(shù)據(jù)的查詢操作是通過調(diào)用封裝在UserServiceImpl類中的login方法來實(shí)現(xiàn)的,而其中的login方法是根據(jù)封裝在UserDaoImpl類中的findUserByUsernameAndPassword方法來實(shí)現(xiàn)的。
login:
//驗(yàn)證登錄信息 @Override public User login(User user) { return dao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword()); }
findUserByUsernameAndPassword:
//根據(jù)用戶名和密碼查詢User對象 @Override public User findUserByUsernameAndPassword(String username, String password) { try { String sql = "select * from user where username = ? and password = ?"; User user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), username, password); return user; } catch (Exception e) { e.printStackTrace(); return null; } }
實(shí)現(xiàn)效果:
2. 分頁查詢、模糊查詢
設(shè)計(jì)思路:創(chuàng)建一個(gè)分頁的實(shí)體類對象 PageBean,主頁跳轉(zhuǎn)到?FindUserByPageServlet?中進(jìn)行查詢。
PageBean屬性:
//總記錄數(shù) private int totalCount; //總頁碼 private int totalPage; //每頁的數(shù)據(jù) private List<T> list; //當(dāng)前頁碼 private int currentPage; //每頁顯示的記錄數(shù) private int rows;
FindUserByPageServlet:
//查詢 @WebServlet("/findUserByPageServlet") public class FindUserByPageServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設(shè)置編碼 request.setCharacterEncoding("utf-8"); //當(dāng)前頁碼 String currentPage = request.getParameter("currentPage"); //每頁顯示條數(shù) String rows = request.getParameter("rows"); //判斷當(dāng)前頁碼、每頁顯示的條數(shù) if (currentPage == null || "".equals(currentPage)) { currentPage = "1"; } if (rows == null || "".equals(rows)) { rows = "5"; } //獲取條件查詢參數(shù) Map<String, String[]> condition = request.getParameterMap(); //調(diào)用service查詢 UserService service = new UserServiceImpl(); PageBean<User> pb = service.findUserByPage(currentPage, rows, condition); //將PageBean存入request request.setAttribute("pb", pb); //將查詢條件存入request request.setAttribute("condition", condition); //轉(zhuǎn)發(fā)到list.jsp request.getRequestDispatcher("/list.jsp").forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
注意:數(shù)據(jù)的查詢是通過調(diào)用封裝在UserServiceImpl類中的findUserByPage方法實(shí)現(xiàn)的,然而具體的數(shù)據(jù)庫操作是根據(jù)封裝在UserDaoImpl類中的?findTotalCount 和 findByPage 方法?來實(shí)現(xiàn)的。
findTotalCount:
//查詢總記錄條數(shù) @Override public int findTotalCount(Map<String, String[]> condition) { //定義模板初始化sql String sql = "select count(*) from user where 1 =1 "; StringBuilder sb = new StringBuilder(sql); //遍歷map Set<String> keySet = condition.keySet(); //定義參數(shù)集合 List<Object> params = new ArrayList<>(); for (String key : keySet) { //排除分頁條件參數(shù) if ("currentPage".equals(key) || "rows".equals(key)) { continue; } //獲取value String value = condition.get(key)[0]; //判斷value是否有值 if (value != null && !"".equals(value)) { //有值 sb.append(" and " + key + " like ? "); //?條件的值 params.add("%" + value + "%"); } } return template.queryForObject(sb.toString(), Integer.class, params.toArray()); }
findByPage:
//在數(shù)據(jù)庫中查詢數(shù)據(jù),獲取一個(gè)User的對象集合 @Override public List<User> findByPage(int start, int rows, Map<String, String[]> condition) { String sql = "select * from user where 1 = 1 "; StringBuilder sb = new StringBuilder(sql); //遍歷map Set<String> keySet = condition.keySet(); //定義參數(shù)集合 List<Object> params = new ArrayList<>(); for (String key : keySet) { //排除分頁條件參數(shù) if ("currentPage".equals(key) || "rows".equals(key)) { continue; } //獲取value String value = condition.get(key)[0]; //判斷value是否有值 if (value != null && !"".equals(value)) { //有值 sb.append(" and " + key + " like ? "); //?條件的值 params.add("%" + value + "%"); } } if (start < 0) start = 0; //添加分頁查詢 sb.append(" limit ?,? "); //添加分頁查詢參數(shù)值 params.add(start); params.add(rows); return template.query(sb.toString(), new BeanPropertyRowMapper<>(User.class), params.toArray()); }
findUserByPage:
//處理查詢 @Override public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) { //類型轉(zhuǎn)換 int currentPage = Integer.parseInt(_currentPage); int rows = Integer.parseInt(_rows); //第一頁時(shí),不能點(diǎn)擊上一頁 if (currentPage <= 0) currentPage = 1; //創(chuàng)建PageBean對象 PageBean<User> pb = new PageBean<>(); //調(diào)用dao查詢總記錄數(shù) int totalCount = dao.findTotalCount(condition); pb.setTotalCount(totalCount); //計(jì)算總頁碼 int totalPage = (totalCount % rows) == 0 ? totalCount / rows : totalCount / rows + 1; pb.setTotalPage(totalPage); //最后一頁時(shí),不能點(diǎn)擊下一頁 if (currentPage >= totalPage) currentPage = totalPage; //設(shè)置參數(shù) pb.setCurrentPage(currentPage); pb.setRows(rows); //調(diào)用dao查詢list集合 //計(jì)算開始記錄索引 int start = (currentPage - 1) * rows; List<User> list = dao.findByPage(start, rows, condition); pb.setList(list); return pb; }
實(shí)現(xiàn)效果:
3. 增、刪、改操作
設(shè)計(jì)思路:管理員選擇對應(yīng)的功能操作后,JSP頁面的數(shù)據(jù)就會提交到對應(yīng)的?Servlet 中進(jìn)行處理,通過調(diào)用業(yè)務(wù)邏輯層中的方法,業(yè)務(wù)邏輯層再調(diào)用數(shù)據(jù)庫操作層中的方法,從而實(shí)現(xiàn)用戶信息的增、刪、改。
實(shí)現(xiàn)效果:
?
總結(jié)
????????本項(xiàng)目綜合性很強(qiáng),涉及到的知識點(diǎn)比較多,盲目的敲代碼是不理智的,明確項(xiàng)目的設(shè)計(jì)思路十分重要。本次介紹只展示出了幾個(gè)比較重要功能的部分代碼,其他部分就不詳細(xì)介紹了。博主認(rèn)為最難的點(diǎn)就在于數(shù)據(jù)的交互,前端到后端,后端到前端,前端到前端,后端到后端,使用的數(shù)據(jù)傳遞方式不盡相同,要明確是哪一種數(shù)據(jù)傳遞場景,這樣就很好解決了。文章來源:http://www.zghlxwxcb.cn/news/detail-474967.html
源碼
可在博主主頁獲?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-474967.html
到了這里,關(guān)于JavaEE 項(xiàng)目:用戶信息管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!