最近疯了一段时间,感觉忘得差不多了,找到以前做的项目,重温一下
jdbc连接下基于servlet的最原始的javaWeb项目
工具:Eclipse ,oracle数据库,tomcat7 ,JDK 7
首先说一下需求: 简易的图书管理系统,顾名思义,简约就好,可以少一些表,但是该有的架子还是需要有的
看一下数据库的:
先看一下代码的结构图:分层嘛
再看一下运行的截图,做了拦截器,不登陆是没法访问这个界面的
下面我准备开始一步一步回忆啦,
就已图书那块为例,首先我要见数据库建表,
数据库完成后,就转入java 端啦,分层的思想,先新建包:dao, service ,servlet, database,vo
vo:存实体类,比如图书类
database:操作数据库的类,连接数据库啦,关闭数据库啦等等
dao: 存对数据库增删改查的语句
service :进行事务控制
servlet:响应jsp 的请求
基本流程就是:(以用户查询图书为例)用户访问网站会发起请求(查询),请求先到servlet,端,servlet调用service里的查询图书的方法,service不是直接处理,而是转发任务去dao,dao调用database进行连接数据库,继而进行实际的查询工作,查出来的结果要进行格式化,就用到了我们的vo,以vo的格式将查询出来的数据格式化,再将结果返回service,service在这个例子里看不出什么作用,但是当用户进行新增或者修改删除时,就有用了,做这些操作可能会失败,service的作用就是如果失败,就进行事务回滚,不破坏数据库原有信息,service将结果返回servlet,servlet跳转至相应页面,将数据展示给用户
没听懂我也没办法啦
我这个项目是把功能也分层啦,图书是图书的,用户是用户的,然后连接数据库的我给封装在一起啦,common里存的就是公共的,什么过滤器啦,登陆登出,验证码啦这些
继续说图书这个模块,
数据的连接和增删改查的语句我都封装在了一起,所以图书模块里就没有这些啦
看看Book 这个类:
public class BookVO { // id private String bid; // 书名 private String btitle; // 作者 private String bauthor; // 封面图片 private String bimage; // 图书简介 private String bbriefinfo; // 是否可借 private String bcanborrow; public String getBcanborrow() { return bcanborrow; } public void setBcanborrow(String bcanborrow) { this.bcanborrow = bcanborrow; } public String getBid() { return bid; } public void setBid(String bid) { this.bid = bid == null ? null : bid.trim(); } public String getBtitle() { return btitle; } public void setBtitle(String btitle) { this.btitle = btitle == null ? null : btitle.trim(); } public String getBauthor() { return bauthor; } public void setBauthor(String bauthor) { this.bauthor = bauthor == null ? null : bauthor.trim(); } public String getBimage() { return bimage; } public void setBimage(String bimage) { this.bimage = bimage == null ? null : bimage.trim(); } public String getBbriefinfo() { return bbriefinfo; } public void setBbriefinfo(String bbriefinfo) { this.bbriefinfo = bbriefinfo == null ? null : bbriefinfo.trim(); } }因为用户要借还书,所有这个功能我给写在一起啦 StudentBorrowBook类
public class StudentBorrowBookVO { // id private String sbbid; // 学生id private String sid; // 学生name private String sname; // 图书name private String bname; // 图书id private String bid; // 借书时间 private Date borrowtime; // 还书时间 private Date returntime; public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public String getSbbid() { return sbbid; } public void setSbbid(String sbbid) { this.sbbid = sbbid == null ? null : sbbid.trim(); } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid == null ? null : sid.trim(); } public String getBid() { return bid; } public void setBid(String bid) { this.bid = bid == null ? null : bid.trim(); } public Date getBorrowtime() { return borrowtime; } //java.util.Dat ----> java.sql.Date public void setBorrowtime(java.util.Date borrowtime) { this.borrowtime = new Date(borrowtime.getTime()); } public Date getReturntime() { return returntime; } public void setReturntime(java.util.Date returntime) { this.returntime = new Date(returntime.getTime()); } }添加图书的界面:
<span style="white-space:pre"> </span><form id="addBook" action="<%=request.getContextPath() %>/bookServlet?action=addBook" method="post" enctype="multipart/form-data"> <table cellpadding="3" cellspacing="1" align="center"> <tr> <td align="center" valign="middle">书名:</td> <td align="center" valign="middle"> <input type="text" name="bookTitle"/></td> </tr> <tr> <td align="center" valign="middle">作者:</td> <td align="center" valign="middle"><input type="text" name="bookAuthor" /></td> </tr> <tr> <td align="center" valign="middle" colspan="2"> <div ><img id="ImgPr" width="150px" height="150px"/></div> </td> </tr> <tr> <td align="center" valign="middle">图片:</td> <td align="center" valign="middle"><input type="file" id ="file" name= "file"></td> </tr> <tr> <td align="center" valign="middle">简介:</td> <td align="center" valign="middle"><textarea cols="40" rows="10" name="Bbriefinfo" ></textarea></td> </tr> <tr> <td align="center" valign="middle">可借:</td> <td align="center" valign="middle"><input type="checkbox" name="Bcanborrow" /> </td> </tr> <tr> <td colspan="2" align="center" valign="middle"><input type="submit" value="更新图书" /></td> </tr> </table> </form>主要有个头像的上传,没有使用框架只能自己处理啦,看看servlet就知道了
<span style="white-space:pre"> </span>if("addBook".equals(action)){ //新增图书 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(factory); String[] name =new String[5]; int namelength = 0; boolean flag = true;//标记是否有新图片上传 try{ List<FileItem> items = sfu.parseRequest(request); namelength = items.size(); for(int i = 0;i<items.size();i++){ FileItem item = items.get(i); if(item.isFormField()){ //普通表单域 name[i] = item.getString(); //System.out.println(item.getString()); } else{ //文件上传域 ServletContext sctx = getServletContext(); //String path = "upload"+File.separator+"img"; if(item.getName().equals("")){ //没有上传 name[i] = ""; flag = false; }else{ Date date= new Date(); String path = sctx.getRealPath("upload"+File.separator+"img"); //System.out.println(path); String filename = date.getTime()+""+item.getName(); String picture = path+File.separator+filename; System.out.println(picture); name[i] = picture; File file = new File(picture); item.write(file); } } } }catch( Exception e){ e.printStackTrace(); } BookVO book = new BookVO(); book.setBtitle(name[0]); book.setBauthor(name[1]); String str = name[2]; if(flag){ //没有图片上传 str = str.substring(str.indexOf("upload"+File.separator+"img")); } //System.out.println(str); book.setBimage(str); book.setBbriefinfo(name[3]); //如果未选中 type="checkbox" 读取不到参数 if(namelength==5){ //可借 book.setBcanborrow("1"); }else{ book.setBcanborrow("0"); } <strong> BookService bookSerice = new BookSericeImpl(); try { bookSerice.insertBook(book);</strong> PageVO page = new PageVO(); page.setCurrentPage(1); page.setRowsPerPage(10); //回主页面 backToMian(request, response,page); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }service层调用dao层,事务控制的大概框架:
<span style="white-space:pre"> </span>conn = DBUtil.openConnection(); try { conn.setAutoCommit(false); //插入1表 //插入2表 //都成功后才提交commit. conn.commit(); } catch (SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { DBUtil.close(); }
dao层:
<span style="white-space:pre"> </span>public void insertBook(BookVO bookVo) throws Exception { String id = UUID.randomUUID().toString(); //BOOK (BID, BTITLE, BAUTHOR, BIMAGE, BBRIEFINFO, BCANBORROW) String sql = "INSERT INTO BOOK VALUES(?,?,?,?,?,?)"; List params = new ArrayList(); params.add(id); params.add(bookVo.getBtitle()); params.add(bookVo.getBauthor()); params.add(bookVo.getBimage()); params.add(bookVo.getBbriefinfo()); params.add(new BigDecimal(bookVo.getBcanborrow())); executeUpdate(sql,params); }这里做了查询时的分页
分页代码:
oracle:
sql = "select * from (select p.*, rownum rn from (select * from product order by productid) p where rownum<=?) where rn >?";mysql:
String mysql = "select * from (#mysqlstatement#) as mysql_db limit ?,?";
查询图书时做了分类查询,使用模糊查询就好了
其他的功能跟这个类似,框架打好后,主要工作量就在servlet端啦
贴上book 模块的servlet的全部代码
一个极其简易的 ,serlvet写了400+,感觉没爱了
package com.booksystem.module.book.action.servlet; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.booksystem.common.vo.PageVO; import com.booksystem.module.book.service.BookSericeImpl; import com.booksystem.module.book.service.BookService; import com.booksystem.module.book.service.BorrowBooksService; import com.booksystem.module.book.service.BorrowBooksServiceImpl; import com.booksystem.module.book.vo.BookVO; import com.booksystem.module.book.vo.StudentBorrowBookVO; public class BookServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); String action = request.getParameter("action"); // URL http://localhost:8008/BooksSystem/bookServlet?action=main if("main".equals(action)){ PageVO page = new PageVO(); // 当前页,即要查询的是第几页 int currentPage = 1; // 每页记录数 ,写死 int rowsPerPage = 10; if(request.getParameter("currentPage")!=null) { currentPage = Integer.parseInt(request.getParameter("currentPage")); } if(request.getParameter("rowsPerPage")!=null) { rowsPerPage = Integer.parseInt(request.getParameter("rowsPerPage")); } page.setCurrentPage(currentPage); page.setRowsPerPage(rowsPerPage); backToMian(request, response,page); }else if("searchByNum".equals(action)){ String queryNum = java.net.URLDecoder.decode(request.getParameter("queryNum"), "UTF-8"); String way = request.getParameter("search"); if(way.equals("BookId")){ //对queryNum 合法性要进行检查 BookService bookSerice = new BookSericeImpl(); try { BookVO book = bookSerice.findBookById(queryNum); request.setAttribute("book", book); request.getRequestDispatcher("source/byBookNum.jsp").forward(request, response); // request.getRequestDispatcher("source/addBook.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } }else if("UserId".equals(way)){ BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); try { List<StudentBorrowBookVO> studentBorrowBookVO = borrowBooksService.findBookByStudentId(queryNum); request.setAttribute("studentBorrowBookVO",studentBorrowBookVO); request.getRequestDispatcher("source/byUserNum.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } }else if("BookName".equals(way)){ //此处未分页!!!因为点击下一页时servlet参数乱了,需要单独写一个servlet。 BookService bookSerice = new BookSericeImpl(); try { List<BookVO> books = bookSerice.findBookByName(queryNum,null); request.setAttribute("books", books); request.getRequestDispatcher("source/viewBooks.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } }else if("UserName".equals(way)){ BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); try { List<StudentBorrowBookVO> studentBorrowBookVO = borrowBooksService.findBookByStudentname(queryNum); request.setAttribute("studentBorrowBookVO", studentBorrowBookVO); request.getRequestDispatcher("source/byUserNum.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } } }else if("searchBookById".equals(action)){ //更新图书--查询 String id = request.getParameter("queryNum"); BookService bookSerice = new BookSericeImpl(); try { BookVO book = bookSerice.findBookById(id); request.setAttribute("book", book); request.getRequestDispatcher("source/editBook.jsp").forward(request, response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else if("editBookDo".equals(action)){ //更新图书--修改 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(factory); String[] name =new String[8]; int namelength = 0; boolean flag = true;//标记是否有新图片上传 try{ List<FileItem> items = sfu.parseRequest(request); namelength = items.size(); for(int i = 0;i<items.size();i++){ FileItem item = items.get(i); if(item.isFormField()){ //普通表单域 name[i] = item.getString(); } else{ //文件上传域 ServletContext sctx = getServletContext(); if(item.getName().equals("")){ //没有上传,获得原图片 name[i] = request.getParameter("ImgPr"); flag = false; }else{ //String path = "upload"+File.separator+"img"; Date date= new Date(); String path = sctx.getRealPath("upload"+File.separator+"img"); //System.out.println(path); //有上传 String filename = date.getTime()+item.getName(); String picture = path+File.separator+filename; //System.out.println(picture); name[i] = picture; File file = new File(picture); item.write(file); } } } }catch( Exception e){ e.printStackTrace(); } BookVO book = new BookVO(); book.setBid(name[0]); book.setBtitle(name[1]); book.setBauthor(name[2]); String str = name[3]; if(flag){ //没有图片上传 str = str.substring(str.indexOf("upload"+File.separator+"img")); } //System.out.println(str); book.setBimage(str); book.setBbriefinfo(name[4]); //如果未选中 type="checkbox" 读取不到参数 if(namelength==6){ //可借 book.setBcanborrow("1"); }else{ book.setBcanborrow("0"); } BookService bookSerice = new BookSericeImpl(); try { bookSerice.updateBook(book); PageVO page = new PageVO(); page.setCurrentPage(1); page.setRowsPerPage(10); //回主页面 backToMian(request, response,page); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else if("addBook".equals(action)){ //新增图书 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(factory); String[] name =new String[5]; int namelength = 0; boolean flag = true;//标记是否有新图片上传 try{ List<FileItem> items = sfu.parseRequest(request); namelength = items.size(); for(int i = 0;i<items.size();i++){ FileItem item = items.get(i); if(item.isFormField()){ //普通表单域 name[i] = item.getString(); //System.out.println(item.getString()); } else{ //文件上传域 ServletContext sctx = getServletContext(); //String path = "upload"+File.separator+"img"; if(item.getName().equals("")){ //没有上传 name[i] = ""; flag = false; }else{ Date date= new Date(); String path = sctx.getRealPath("upload"+File.separator+"img"); //System.out.println(path); String filename = date.getTime()+""+item.getName(); String picture = path+File.separator+filename; System.out.println(picture); name[i] = picture; File file = new File(picture); item.write(file); } } } }catch( Exception e){ e.printStackTrace(); } BookVO book = new BookVO(); book.setBtitle(name[0]); book.setBauthor(name[1]); String str = name[2]; if(flag){ //没有图片上传 str = str.substring(str.indexOf("upload"+File.separator+"img")); } //System.out.println(str); book.setBimage(str); book.setBbriefinfo(name[3]); //如果未选中 type="checkbox" 读取不到参数 if(namelength==5){ //可借 book.setBcanborrow("1"); }else{ book.setBcanborrow("0"); } BookService bookSerice = new BookSericeImpl(); try { bookSerice.insertBook(book); PageVO page = new PageVO(); page.setCurrentPage(1); page.setRowsPerPage(10); //回主页面 backToMian(request, response,page); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else if("deleteBook".equals(action)){ //删除图书 String id = request.getParameter("queryNum"); BookService bookSerice = new BookSericeImpl(); PageVO page = new PageVO(); page.setCurrentPage(1); page.setRowsPerPage(10); try { bookSerice.deleteBook(id); //回主页面 backToMian(request, response,page); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* ----------------借阅图书-------------------- */ else if("borrowBook".equals(action)){ //借阅图书 //对是否可借,是否达到借阅上数 检查,修改 String bookId = request.getParameter("bookId"); String userId = request.getParameter("userId"); BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); StudentBorrowBookVO studentBorrowBookVO = new StudentBorrowBookVO(); studentBorrowBookVO.setBid(bookId); studentBorrowBookVO.setSid(userId); Date borrowDate = new Date(); Calendar calender = Calendar.getInstance(); calender.setTime(borrowDate); //可借一个月 calender.add(Calendar.MONTH, 1); Date returnDate = calender.getTime(); studentBorrowBookVO.setBorrowtime(borrowDate); studentBorrowBookVO.setReturntime(returnDate); try { borrowBooksService.insertStudentBorrowBook(studentBorrowBookVO); //request.getRequestDispatcher("source/borrowManage.jsp").forward(request, response); response.sendRedirect("source/borrowManage.jsp"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if("reBorrowBook".equals(action)){ //续借图书--加一个月 BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); StudentBorrowBookVO studentBorrowBookVO =new StudentBorrowBookVO(); try { String sbbid = request.getParameter("sbbid"); String returntime = request.getParameter("returntime"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(returntime) ; Calendar calender = Calendar.getInstance(); calender.setTime(date); calender.add(Calendar.MONTH, 1); date = calender.getTime(); studentBorrowBookVO.setReturntime(date); studentBorrowBookVO.setSbbid(sbbid); borrowBooksService.editStudentBorrowBook(studentBorrowBookVO); // request.getRequestDispatcher("source/borrowManage.jsp").forward(request, response); response.sendRedirect("source/borrowManage.jsp"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if("returnBook".equals(action)){ //归还图书 String sbbid = request.getParameter("sbbid"); BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); try { borrowBooksService.deleteStudentBorrowBook(sbbid); // request.getRequestDispatcher("source/borrowManage.jsp").forward(request, response); response.sendRedirect("source/borrowManage.jsp"); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if("borrowManage".equals(action)){ String queryNum = java.net.URLDecoder.decode(request.getParameter("queryNum"), "UTF-8"); String way = request.getParameter("search"); // if(way.equals("BookId")){ // /////////////////////////// // BookService bookSerice = new BookSericeImpl(); // try { // BookVO book = bookSerice.findBookById(queryNum); // request.setAttribute("book", book); // request.getRequestDispatcher("source/byBookNum.jsp").forward(request, response); //// request.getRequestDispatcher("source/addBook.jsp").forward(request, response); // } catch (Exception e) { // e.printStackTrace(); // //错误页面 // } // }else if("BookName".equals(way)){ //可以分页 PageVO page = new PageVO(); // 当前页,即要查询的是第几页 int currentPage = 1; // 每页记录数 ,写死 int rowsPerPage = 5; if(request.getParameter("currentPage")!=null) { currentPage = Integer.parseInt(request.getParameter("currentPage")); } if(request.getParameter("rowsPerPage")!=null) { rowsPerPage = Integer.parseInt(request.getParameter("rowsPerPage")); } page.setCurrentPage(currentPage); page.setRowsPerPage(rowsPerPage); String userid = request.getParameter("userid"); BookService bookSerice = new BookSericeImpl(); try { List<BookVO> books = bookSerice.findBookByName(queryNum,page); request.setAttribute("books", books); request.setAttribute("page", page); request.setAttribute("userid", userid); request.getRequestDispatcher("source/borrowBooks.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } }else if("UserId".equals(way)){ BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); try { List<StudentBorrowBookVO> studentBorrowBookVO = borrowBooksService.findBookByStudentId(queryNum); request.setAttribute("studentBorrowBookVO",studentBorrowBookVO); request.getRequestDispatcher("source/byUserNum.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } }else if("UserName".equals(way)){ BorrowBooksService borrowBooksService = new BorrowBooksServiceImpl(); try { List<StudentBorrowBookVO> studentBorrowBookVO = borrowBooksService.findBookByStudentname(queryNum); request.setAttribute("studentBorrowBookVO", studentBorrowBookVO); request.getRequestDispatcher("source/byUserNum.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //错误页面 } } } } //返回全部查询页面,需要分页 private void backToMian(HttpServletRequest request, HttpServletResponse response,PageVO page) throws ServletException, IOException{ BookService bookSerice = new BookSericeImpl(); try { List<BookVO> books = bookSerice.findAllBook(page); request.setAttribute("books", books); request.setAttribute("page", page); request.getRequestDispatcher("source/viewBooks.jsp").forward(request, response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
看一下过滤器的主要代码
<span style="white-space:pre"> </span>String needInterceptUrl = "(.*source.*\\.jsp)|(.*Servlet.*)"; //用户没有登陆,并且访问后面的需要登陆才能访问的页面,跳转到登陆页面;如果用户已经登陆了,无视 if(session.getAttribute(Constant.USER_INFO)==null && servletPath.matches(needInterceptUrl)){ response.sendRedirect("/BooksSystem/index.jsp"); }
为什么需要 1 分,首先申明我不是缺这一分,是担心有人瞎下载源码,用作其他用途,所以加了限制,但是又不会需要你太多分
如果你需要,但是有没有分,可以私信我,或者:[email protected],不一定及时回复哦!
项目源码:http://download.csdn.net/detail/i_do_can/9383757