沒有學習MVC以前我只寫了一個Servlet類(Note_List.java),分層以後,我將這個類分紅了5個類(NoteDao.java,,NoteDaoImpl.java,,NoteService.java,,NoteServiceImpl.java,,Note_List.java),MVC的基礎知識我就不在此贅述,這裏只是寫一個MVC分層思想的示例,便於瞭解這種編程思想。java
分層以前的Note_List.javasql
1 public class Note_List extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 doPost(req,resp); 6 } 7 8 @Override 9 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 10 req.setCharacterEncoding("UTF-8"); 11 resp.setCharacterEncoding("UTF-8"); 12 DBHelp db = new DBHelp(); 13 String sql = "select * from note"; 14 List<Map<String, String>> lmap = new ArrayList<Map<String, String>>(); 15 lmap = db.query(sql, null); 16 List<Note> list = new ArrayList<Note>(); 17 if (lmap.size() > 0) { 18 for (Map<String, String> map : lmap) { 19 Note note = new Note(); 20 note.setTitle(map.get("title")); 21 note.setTags(map.get("tags")); 22 note.setAuthor(map.get("author")); 23 note.setContent(map.get("content")); 24 note.setCreatetime(map.get("createtime")); 25 list.add(note); 26 } 27 28 List<String> imgSrc = new ArrayList<String>();// 提取每一個文檔內容中的圖片地址集合 29 List<String> imgSrcFirst = new ArrayList<String>();// 提取每一個文檔內容中的第一個圖片地址 30 List<String> contentTxt = new ArrayList<String>();// 提取每一個文檔內容中的純文本內容的前101字節 31 32 for (int i = 0; i < lmap.size(); i++) { 33 String ct = lmap.get(i).get("content"); 34 35 if (ct == null || ct.equals("")) {// 判斷文檔內容是否爲空或者爲空串 36 contentTxt.add(null); 37 imgSrcFirst.add(null); 38 } else { 39 String ctTxt = Get_ContentTxt_FormHTML.getContentTxt(ct); 40 if (ctTxt == null) { 41 contentTxt.add(null); 42 } else { 43 int l = ctTxt.getBytes().length; 44 if (l <= 100) {// 字符串不等於NULL,字節數確定大於0 45 contentTxt.add(ctTxt); 46 } else { 47 contentTxt.add(ctTxt.substring(0, 100) + "..."); 48 } 49 contentTxt.add(null); 50 } 51 52 imgSrc = Get_Image_FormHTML.getImageSrc(ct); 53 if (imgSrc.size() == 0) { 54 imgSrcFirst.add(null); 55 } else { 56 imgSrcFirst.add(imgSrc.get(0)); 57 } 58 } 59 } 60 61 HttpSession sesImg = req.getSession(); 62 sesImg.setAttribute("img", imgSrcFirst); 63 64 HttpSession sesConTxt = req.getSession(); 65 sesConTxt.setAttribute("txt", contentTxt); 66 67 req.setAttribute("list", list); 68 req.getRequestDispatcher("note_list_user.jsp").forward(req, resp); 69 } 70 } 71 }
可見,沒有分層的代碼雜亂無章,複雜難懂,因此應該把項目分層:
分層後的5個類:(按順序閱讀)編程
第1個類:NoteDao.java 接口:
1 public interface NoteDao { 2 public List<NoteBean> queryAll();// 查詢全部文檔全部字段內容 3 public List<String>contentAll();//提取全部文檔中content字段內容 4 public List<List<String>>contentImg();// 提取全部文檔內容中的每個文檔的圖片地址集合 5 public List<String>contentImgFirst();// 提取每個文檔內容中的圖片地址集合中第一個圖片地址的集合 6 public List<String>contentTxt(); //提取每一個文檔內容中純文本內容 7 public List<String>contentTxtHundred();//提取每一個文檔內容中純文本內容的前101字節 8 }
第2個類:NoteDaoImpl.java 實現類:
1 public class NoteDaoImpl implements NoteDao { 2 DBUtil db = new DBUtil(); 3 4 // 查詢全部文檔全部字段內容 5 @Override 6 public List<NoteBean> queryAll() { 7 String sql = "select * from note"; 8 List<Map<String, String>> lmap = new ArrayList<Map<String, String>>(); 9 lmap = db.query(sql, null); 10 List<NoteBean> list = new ArrayList<NoteBean>(); 11 for (Map<String, String> map : lmap) { 12 NoteBean nb = new NoteBean(); 13 nb.setAuthor(map.get("author")); 14 nb.setContent(map.get("content")); 15 nb.setCreatetime(map.get("createtime")); 16 nb.setId(Integer.parseInt(map.get("id"))); 17 nb.setTags(map.get("tags")); 18 nb.setTitle(map.get("title")); 19 list.add(nb); 20 } 21 return list; 22 } 23 24 // 提取全部文檔中content字段內容 25 @Override 26 public List<String> contentAll() { 27 NoteDao nd = new NoteDaoImpl(); 28 List<NoteBean> lnb = nd.queryAll(); 29 30 List<String> content = new ArrayList<String>(); 31 if (lnb!=null&&lnb.size() > 0) { 32 for (int i = 0; i < lnb.size(); i++) { 33 content.add(lnb.get(i).getContent()); 34 } 35 } 36 return content; 37 } 38 39 // 提取全部文檔內容中的每個文檔的圖片地址集合 40 @Override 41 public List<List<String>> contentImg() { 42 NoteDao nd = new NoteDaoImpl(); 43 List<String> lnb = nd.contentAll(); 44 45 List<List<String>> imgSrc = new ArrayList<List<String>>(); 46 if (lnb!=null&&lnb.size() > 0) {// 判斷全部文檔總內容的集合是否爲null 47 for (int i = 0; i < lnb.size(); i++) { 48 String ct = lnb.get(i); 49 if (ct == null || ct.equals("")) {// 判斷每個文檔的內容是否爲空 50 imgSrc.add(null); 51 } else { 52 imgSrc.add(Get_ContentImg_FormHTML.getImageSrc(ct));//此處調用了公共類 53 } 54 } 55 } 56 return imgSrc; 57 } 58 59 // 提取每個文檔內容中的圖片地址集合中第一個圖片地址的集合 60 @Override 61 public List<String> contentImgFirst() { 62 NoteDao nd = new NoteDaoImpl(); 63 List<List<String>> lnb = nd.contentImg(); 64 65 List<String> imgSrcFirst = new ArrayList<String>(); 66 if (lnb!=null&&lnb.size() > 0) {// 判斷全部文檔圖片地址集合是否爲空 67 for (int i = 0; i < lnb.size(); i++) { 68 if (lnb.get(i)!=null&&lnb.get(i).size() > 0) {// 判斷每個文檔中圖片地址集合是否爲空 69 imgSrcFirst.add(lnb.get(i).get(0));// 提取每個文檔中的圖片地址集合中第一個圖片 70 } else { 71 imgSrcFirst.add(null); 72 } 73 } 74 } 75 return imgSrcFirst; 76 } 77 78 // 提取每一個文檔內容中純文本內容 79 @Override 80 public List<String> contentTxt() { 81 NoteDao nd = new NoteDaoImpl(); 82 List<String> lnb = nd.contentAll(); 83 84 List<String> ctTxt = new ArrayList<String>();// 提取每一個文檔內容中的純文本內容 85 if (lnb!=null&&lnb.size() > 0) {// 判斷全部文檔內容的集合是否爲空 86 for (int i = 0; i < lnb.size(); i++) { 87 String ctText = Get_ContentTxt_FormHTML.getContentTxt(lnb.get(i));//此處調用了公共類 88 if (ctText == null || ctText.equals("")) {// 判斷每個文檔的內容是否爲空 89 ctTxt.add(null); 90 } else { 91 ctTxt.add(ctText); 92 } 93 } 94 } 95 return ctTxt; 96 } 97 98 // 提取每一個文檔內容中純文本內容的前101字節 99 @Override 100 public List<String> contentTxtHundred() { 101 NoteDao nd = new NoteDaoImpl(); 102 List<String> ctTxt = nd.contentTxt(); 103 104 List<String> ctTxtHundred = nd.contentTxt(); 105 if (ctTxt!=null&&ctTxt.size() > 0) {// 判斷全部文檔的純內容的集合是否爲空 106 for (int i = 0; i < ctTxt.size(); i++) { 107 if (ctTxt.get(i) == null || ctTxt.get(i).equals("")) {// 判斷每個文檔的內容是否爲空 108 ctTxtHundred.add(null); 109 } else { 110 int l = ctTxt.get(i).getBytes().length; 111 if (l <= 100) {// 字符串不等於NULL,字節數確定大於0,判斷總字節數是否大於100 112 ctTxtHundred.add(ctTxt.get(i)); 113 } else { 114 ctTxtHundred.add(ctTxt.get(i).substring(0, 100) + "..."); 115 } 116 } 117 } 118 } 119 return ctTxtHundred; 120 } 121 122 }
第3個類:NoteService.java 接口:
1 public interface NoteService { 2 public List<NoteBean> queryAll();// 查詢全部文檔全部字段內容 3 public List<String>contentAll();//提取全部文檔中content字段內容 4 public List<List<String>>contentImg();// 提取全部文檔內容中的每個文檔的圖片地址集合 5 public List<String>contentImgFirst();// 提取每個文檔內容中的圖片地址集合中第一個圖片地址的集合 6 public List<String>contentTxt(); //提取每一個文檔內容中純文本內容 7 public List<String>contentTxtHundred();//提取每一個文檔內容中純文本內容的前101字節 8 }
第4個類:NoteServiceImpl.java 實現類:
1 public class NoteServiceImpl implements NoteService{ 2 NoteDao nd=new NoteDaoImpl(); 3 @Override 4 public List<NoteBean> queryAll() { 5 List<NoteBean> nb=nd.queryAll(); 6 return nb; 7 } 8 @Override 9 public List<String> contentAll() { 10 List<String> ls=nd.contentAll(); 11 return ls; 12 } 13 @Override 14 public List<List<String>> contentImg() { 15 List<List<String>>lts=nd.contentImg(); 16 return lts; 17 } 18 @Override 19 public List<String> contentImgFirst() { 20 List<String>ls=nd.contentImgFirst(); 21 return ls; 22 } 23 @Override 24 public List<String> contentTxt() { 25 List<String>ls=nd.contentTxt(); 26 return ls; 27 } 28 @Override 29 public List<String> contentTxtHundred() { 30 List<String>ls=nd.contentTxtHundred(); 31 return ls; 32 } 33 }
第5個類:Note_List.java (Servlet類)
1 public class Note_List extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 doPost(req, resp); 6 } 7 8 @Override 9 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 10 req.setCharacterEncoding("UTF-8"); 11 resp.setCharacterEncoding("UTF-8"); 12 13 NoteService nd = new NoteServiceImpl(); 14 List<NoteBean> lnb = nd.queryAll();// 查詢全部文檔全部字段內容 15 List<String> imgSrcFirst = nd.contentImgFirst();// 提取每一個文檔內容中的第一個圖片地址的集合 16 List<String> ctTxtHundred = nd.contentTxtHundred();// 提取每一個文檔內容中的純文本內容的前101字節 17 18 HttpSession sesImg = req.getSession(); 19 sesImg.setAttribute("img", imgSrcFirst); 20 21 HttpSession sesConTxt = req.getSession(); 22 sesConTxt.setAttribute("txt", ctTxtHundred); 23 24 req.setAttribute("list", lnb); 25 req.getRequestDispatcher("note_list_user.jsp").forward(req, resp); 26 27 } 28 }
可見,分層後的代碼,簡明易懂,易於維護和代碼複用,可是代碼量增長了很多,對於程序的運行效率我以爲會有必定程度的損失。jsp