zoukankan      html  css  js  c++  java
  • 网上图书商城项目学习笔记-031图书管理模块介绍及添加图书

    一、流程分析

    1.图书管理模块介绍

    2.

    3.

    4.添加图书第一步

    5.添加图书第二步

    二、代码

    1.view层

    (1)body.jsp 

    1   <body>
    2 <h1 align="center">图书管理</h1>
    3 <p align="center">
    4 <a href="<c:url value='/admin/AdminBookServlet?method=addPre'/>" style="margin: 20px; font-size: 20px;">添加图书</a>
    5 <a href="<c:url value='/adminjsps/admin/book/gj.jsp'/>" style="margin: 20px; font-size: 20px;">高级搜索</a>
    6 </p>
    7   </body>

    (2)add.jsp

      1 <link rel="stylesheet" type="text/css" href="<c:url value='/adminjsps/admin/css/book/add.css'/>">
      2 <link rel="stylesheet" type="text/css" href="<c:url value='/jquery/jquery.datepick.css'/>">
      3 <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
      4 <script type="text/javascript" src="<c:url value='/jquery/jquery.datepick.js'/>"></script>
      5 <script type="text/javascript" src="<c:url value='/jquery/jquery.datepick-zh-CN.js'/>"></script>
      6 <script type="text/javascript">
      7 $(function () {
      8     $("#publishtime").datepick({dateFormat:"yy-mm-dd"});
      9     $("#printtime").datepick({dateFormat:"yy-mm-dd"});
     10     
     11     $("#btn").addClass("btn1");
     12     $("#btn").hover(
     13         function() {
     14             $("#btn").removeClass("btn1");
     15             $("#btn").addClass("btn2");
     16         },
     17         function() {
     18             $("#btn").removeClass("btn2");
     19             $("#btn").addClass("btn1");
     20         }
     21     );
     22     
     23     $("#btn").click(function() {
     24         var bname = $("#bname").val();
     25         var currPrice = $("#currPrice").val();
     26         var price = $("#price").val();
     27         var discount = $("#discount").val();
     28         var author = $("#author").val();
     29         var press = $("#press").val();
     30         var pid = $("#pid").val();
     31         var cid = $("#cid").val();
     32         var image_w = $("#image_w").val();
     33         var image_b = $("#image_b").val();
     34         
     35         if(!bname || !currPrice || !price || !discount || !author || !press || !pid || !cid || !image_w || !image_b) {
     36             alert("图名、当前价、定价、折扣、作者、出版社、1级分类、2级分类、大图、小图都不能为空!");
     37             return false;
     38         }
     39         
     40         if(isNaN(currPrice) || isNaN(price) || isNaN(discount)) {
     41             alert("当前价、定价、折扣必须是合法小数!");
     42             return false;
     43         }
     44         $("#form").submit();
     45     });
     46 });
     47 
     48 function loadChildren() {
     49     var pid = $("#pid").val();
     50     $.getJSON("/goods/admin/AdminBookServlet",
     51       {
     52         method: "ajaxFindChildren",
     53         pid: pid,
     54       },
     55       function(data, textStatus, jqXHR) {
     56           $("#cid").empty();
     57           $("#cid").append("<option>====请选择2级分类====</option>");
     58           var option;
     59         $.each(data, function(i,item){
     60           option = $("<option>").val(item.cid).text(item.cname);
     61           $("#cid").append(option);
     62         });
     63       });
     64 }
     65 
     66 
     67 </script>
     68   </head>
     69   
     70   <body>
     71   <div>
     72    <p style="font-weight: 900; color: red;">${msg }</p>
     73    <form action="<c:url value='/admin/AdminAddBookServlet'/>" enctype="multipart/form-data" method="post" id="form">
     74     <div>
     75         <ul>
     76             <li>书名: <input id="bname" type="text" name="bname" value="Spring实战(第3版)(In Action系列中最畅销的Spring图书,近十万读者学习Spring的共同选择)" style="500px;"/></li>
     77             <li>大图: <input id="image_w" type="file" name="image_w"/></li>
     78             <li>小图: <input id="image_b" type="file" name="image_b"/></li>
     79             <li>当前价:<input id="price" type="text" name="price" value="40.7" style="50px;"/></li>
     80             <li>定价: <input id="currPrice" type="text" name="currPrice" value="59.0" style="50px;"/>
     81             折扣:<input id="discount" type="text" name="discount" value="6.9" style="30px;"/>折</li>
     82         </ul>
     83         <hr style="margin-left: 50px; height: 1px; color: #dcdcdc"/>
     84         <table>
     85             <tr>
     86                 <td colspan="3">
     87                     作者:  <input type="text" id="author" name="author" value="Craig Walls" style="150px;"/>
     88                 </td>
     89             </tr>
     90             <tr>
     91                 <td colspan="3">
     92                     出版社: <input type="text" name="press" id="press" value="人民邮电出版社" style="200px;"/>
     93                 </td>
     94             </tr>
     95             <tr>
     96                 <td colspan="3">出版时间:<input type="text" id="publishtime" name="publishtime" value="2013-6-1" style="100px;"/></td>
     97             </tr>
     98             <tr>
     99                 <td>版次:  <input type="text" name="edition" id="edition" value="1" style="40px;"/></td>
    100                 <td>页数:  <input type="text" name="pageNum" id="pageNum" value="374" style="50px;"/></td>
    101                 <td>字数:  <input type="text" name="wordNum" id="wordNum" value="48700" style="80px;"/></td>
    102             </tr>
    103             <tr>
    104                 <td width="250">印刷时间:<input type="text" name="printtime" id="printtime" value="2013-6-1" style="100px;"/></td>
    105                 <td width="250">开本:  <input type="text" name="booksize" id="booksize" value="16" style="30px;"/></td>
    106                 <td>纸张:  <input type="text" name="paper" id="paper" value="胶版纸" style="80px;"/></td>
    107             </tr>
    108             <tr>
    109                 <td>
    110                     一级分类:<select name="pid" id="pid" onchange="loadChildren()">
    111                         <option value="">==请选择1级分类==</option>
    112                     <c:forEach items="${parents }" var="parent">
    113                         <option value="${parent.cid }">${parent.cname }</option>
    114                     </c:forEach>
    115                     </select>
    116                 </td>
    117                 <td>
    118                     二级分类:<select name="cid" id="cid">
    119                         <option value="">==请选择2级分类==</option>
    120                     </select>
    121                 </td>
    122                 <td></td>
    123             </tr>
    124             <tr>
    125                 <td>
    126                     <input type="button" id="btn" class="btn" value="新书上架">
    127                 </td>
    128                 <td></td>
    129                 <td></td>
    130             </tr>
    131         </table>
    132     </div>
    133    </form>
    134   </div>
    135 
    136   </body>
    137 </html>

    2.servlet层

    (1)AdminBookServlet.java

     1     /**
     2      * 查询指定一级分类的所有二级分类
     3      * @param req
     4      * @param resp
     5      * @return
     6      * @throws ServletException
     7      * @throws IOException
     8      */
     9     public String ajaxFindChildren(HttpServletRequest req, HttpServletResponse resp)
    10             throws ServletException, IOException {
    11         String pid = req.getParameter("pid");
    12         List<Category> children = categoryService.findChildren(pid);
    13         resp.getWriter().print(toJson(children));
    14         return null;
    15     }
    16 
    17     private String toJson(List<Category> categoryList) {
    18         if(categoryList == null || categoryList.size() == 0) return null;
    19         StringBuilder sb = new StringBuilder("[");
    20         for(Category category : categoryList) {
    21             sb.append(toJson(category));
    22             sb.append(",");
    23         }
    24         sb.deleteCharAt(sb.length()-1);
    25         sb.append("]");
    26         return sb.toString();
    27     }
    28 
    29     private String toJson(Category category) {
    30         StringBuilder sb = new StringBuilder("{");
    31         sb.append(""cid":"").append(category.getCid()).append("",");
    32         sb.append(""cname":"").append(category.getCname()).append(""");
    33         sb.append("}");
    34         return sb.toString();
    35     }
    36     
    37     /**
    38      * 加载一级分类
    39      * @param req
    40      * @param resp
    41      * @return
    42      * @throws ServletException
    43      * @throws IOException
    44      */
    45     public String addPre(HttpServletRequest req, HttpServletResponse resp)
    46             throws ServletException, IOException {
    47         req.setAttribute("parents", categoryService.findParents());
    48         return "/adminjsps/admin/book/add.jsp";
    49     }

    (1)AdminAddBookServlet.java 

      1 package com.tony.goods.admin.book.web.servlet;
      2 
      3 import java.awt.Image;
      4 import java.io.File;
      5 import java.io.IOException;
      6 import java.util.HashMap;
      7 import java.util.List;
      8 import java.util.Map;
      9 
     10 import javax.servlet.ServletException;
     11 import javax.servlet.http.HttpServlet;
     12 import javax.servlet.http.HttpServletRequest;
     13 import javax.servlet.http.HttpServletResponse;
     14 import javax.swing.ImageIcon;
     15 
     16 import org.apache.commons.fileupload.FileItem;
     17 import org.apache.commons.fileupload.FileItemFactory;
     18 import org.apache.commons.fileupload.FileUploadException;
     19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
     21 
     22 import cn.itcast.commons.CommonUtils;
     23 
     24 import com.tony.goods.book.domain.Book;
     25 import com.tony.goods.book.service.BookService;
     26 import com.tony.goods.category.domain.Category;
     27 import com.tony.goods.category.service.CategoryService;
     28 
     29 public class AdminAddBookServlet extends HttpServlet {
     30 
     31     public void doPost(HttpServletRequest request, HttpServletResponse response)
     32             throws ServletException, IOException {
     33         /*
     34          * 1. commons-fileupload的上传三步
     35          */
     36         // 创建工具
     37         FileItemFactory factory = new DiskFileItemFactory();
     38         /*
     39          * 2. 创建解析器对象
     40          */
     41         ServletFileUpload sfu = new ServletFileUpload(factory);
     42         sfu.setFileSizeMax(80 * 1024);//设置单个上传的文件上限为80KB
     43         /*
     44          * 3. 解析request得到List<FileItem>
     45          */
     46         List<FileItem> fileItemList = null;
     47         try {
     48             fileItemList = sfu.parseRequest(request);
     49         } catch (FileUploadException e) {
     50             error("上传的文件超出了80KB", request, response);
     51             return;
     52         }
     53         /*
     54          * 4. 把List<FileItem>封装到Book对象中
     55          * 4.1 首先把“普通表单字段”放到一个Map中,再把Map转换成Book和Category对象,再建立两者的关系
     56          */
     57         Map<String,Object> map = new HashMap<String, Object>();
     58         for(FileItem fileItem : fileItemList) {
     59             if(fileItem.isFormField()) {//如果是普通表单字段
     60                 map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
     61             }
     62         }
     63         Book book = CommonUtils.toBean(map, Book.class);//把Map中大部分数据封装到Book对象中
     64         Category category = CommonUtils.toBean(map, Category.class);//把Map中cid封装到Category中
     65         book.setCategory(category);
     66         
     67         /*
     68          * 4.2 把上传的图片保存起来
     69          *   > 获取文件名:截取之
     70          *   > 给文件添加前缀:使用uuid前缀,为也避免文件同名现象
     71          *   > 校验文件的扩展名:只能是jpg
     72          *   > 校验图片的尺寸
     73          *   > 指定图片的保存路径,这需要使用ServletContext#getRealPath()
     74          *   > 保存之
     75          *   > 把图片的路径设置给Book对象
     76          */
     77         // 获取文件名
     78         FileItem fileItem = fileItemList.get(1);//获取大图
     79         String filename = fileItem.getName();
     80         // 截取文件名,因为部分浏览器上传的绝对路径
     81         int index = filename.indexOf("\");
     82         if(index != -1) {
     83             filename = filename.substring(index + 1);
     84         }
     85         // 给文件名添加uuid前缀,避免文件同名现象
     86         filename = CommonUtils.uuid() + "_" + filename;
     87         // 校验文件名称的扩展名
     88         if(!filename.toLowerCase().endsWith(".jpg")) {
     89             error("上传的图片扩展名必须是JPG", request, response);
     90             return;
     91         }
     92         // 校验图片的尺寸
     93         // 保存上传的图片,把图片new成图片对象:Image、Icon、ImageIcon、BufferedImage、ImageIO
     94         /*
     95          * 保存图片:
     96          * 1. 获取真实路径
     97          */
     98         String savepath = this.getServletContext().getRealPath("/book_img");
     99         /*
    100          * 2. 创建目标文件
    101          */
    102         File destFile = new File(savepath, filename);
    103         /*
    104          * 3. 保存文件
    105          */
    106         try {
    107             fileItem.write(destFile);
    108         } catch (Exception e) {
    109             throw new RuntimeException(e);
    110         }
    111         // 校验尺寸
    112         // 1. 使用文件路径创建ImageIcon
    113         ImageIcon icon = new ImageIcon(destFile.getAbsolutePath());
    114         // 2. 通过ImageIcon得到Image对象
    115         Image image = icon.getImage();
    116         // 3. 获取宽高来进行校验
    117         if(image.getWidth(null) > 500 || image.getHeight(null) > 500) {
    118             error("您上传的图片尺寸超出了500*500!", request, response);
    119             destFile.delete();
    120             return;
    121         }
    122         
    123         // 把图片的路径设置给book对象
    124         book.setImage_w("book_img/"+filename);
    125         
    126         // 获取文件名
    127         fileItem = fileItemList.get(2);//获取小图
    128         filename = fileItem.getName();
    129         // 截取文件名,因为部分浏览器上传的绝对路径
    130         index = filename.lastIndexOf("\");
    131         if(index != -1) {
    132             filename = filename.substring(index + 1);
    133         }
    134         filename = CommonUtils.uuid() + "_" + filename;
    135         if(!filename.toLowerCase().endsWith(".jpg")) {
    136             error("上传的图片扩展名必须是JPG", request, response);
    137             return;
    138         }
    139         // 校验图片的尺寸
    140         // 保存上传的图片,把图片new成图片对象:Image、Icon、ImageIcon、BufferedImage、ImageIO
    141         /*
    142          * 保存图片:
    143          * 1. 获取真实路径
    144          */
    145         savepath = this.getServletContext().getRealPath("/book_img");
    146         /*
    147          * 2. 创建目标文件
    148          */
    149         destFile = new File(savepath, filename);
    150         /*
    151          * 3. 保存文件
    152          */
    153         try {
    154             fileItem.write(destFile);//它会把临时文件重定向到指定的路径,再删除临时文件
    155         } catch (Exception e) {
    156             throw new RuntimeException(e);
    157         }
    158         // 校验尺寸
    159         // 1. 使用文件路径创建ImageIcon
    160         icon = new ImageIcon(destFile.getAbsolutePath());
    161         // 2. 通过ImageIcon得到Image对象
    162         image = icon.getImage();
    163         // 3. 获取宽高来进行校验
    164         if(image.getWidth(null) > 350 || image.getHeight(null) > 350) {
    165             error("您上传的图片尺寸超出了350*350!", request, response);
    166             destFile.delete();//删除图片
    167             return;
    168         }
    169         
    170         // 把图片的路径设置给book对象
    171         book.setImage_b("book_img/" + filename);
    172         
    173         // 调用service完成保存
    174         book.setBid(CommonUtils.uuid());
    175         BookService service = new BookService();
    176         service.add(book);
    177         
    178         // 保存成功信息转发到msg.jsp
    179         request.setAttribute("msg", "添加图书成功!");
    180         request.getRequestDispatcher("/adminjsps/msg.jsp").forward(request, response);
    181     }
    182 
    183     private void error(String msg, HttpServletRequest request,
    184             HttpServletResponse response) throws ServletException, IOException {
    185         request.setAttribute("msg", msg);
    186         request.setAttribute("parents", new CategoryService().findParents());
    187         request.getRequestDispatcher("/adminjsps/admin/book/add.jsp").forward(request, response);
    188     }
    189 
    190 }

    3.service层

    (1).java

     

    4.dao层

    (1)BookDao.java

     1     /**
     2      * 添加图书
     3      * @param book
     4      * @throws SQLException 
     5      */
     6     public void add(Book book) throws SQLException {
     7         String sql = "insert into t_book(bid,bname,author,price,currPrice," +
     8                 "discount,press,publishtime,edition,pageNum,wordNum,printtime," +
     9                 "booksize,paper,cid,image_w,image_b)" +
    10                 " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    11         Object[] params = {book.getBid(),book.getBname(),book.getAuthor(),
    12                 book.getPrice(),book.getCurrPrice(),book.getDiscount(),
    13                 book.getPress(),book.getPublishtime(),book.getEdition(),
    14                 book.getPageNum(),book.getWordNum(),book.getPrinttime(),
    15                 book.getBooksize(),book.getPaper(), book.getCategory().getCid(),
    16                 book.getImage_w(),book.getImage_b()};
    17         qr.update(sql, params);
    18     }
  • 相关阅读:
    均匀分布的随机数
    第三十四章 软件工艺的话题
    第三十三章 个人性格
    MySQL常用命令(三)---最值的搜索
    lnmp环境运行laravel open_basedir restriction in effect 问题
    Host 'XXX' is not allowed to connect to this MySQL server解决方案
    CentOS 7中设置PHP7的Log文件日志
    如何查看Laravel版本号的三种方法
    CentOS 7下安装Composer + Laravel
    LNMP一键安装包
  • 原文地址:https://www.cnblogs.com/shamgod/p/5181874.html
Copyright © 2011-2022 走看看