【左京淳的JAVA WEB学习笔记】第十五章 商品上架&用户购买纪录

管理员在网站後台,需有商品上、下架操作功能。

新建BookAdd.jsp

  <form action="<%=basePath%>back/BookAddSvl" method="post" enctype="multipart/form-data" id="myform">
    <table border="0" width="60" align="center">
      <tr>
        <td>书号ISBN</td>
        <td>
          <input type="text" name="isbn" value="${isbn }" id="isbn" onkeyup="isValid()">
          <span id="isbnAlert" style="color:red;font-size:8px;"></span>
        </td>
      </tr>
      <tr>
        <td>书名</td>
        <td><input type="text" name="bname" value="${bname }" id="bname"></td>
      </tr>
      <tr>
        <td>出版社</td>
        <td><input type="text" name="press" value="${press }"></td>
      </tr>
      <tr>
        <td>出版日期</td>
        <td><input type="text" name="pdate" value="${pdate }" class="easyui-datebox"></td>
      </tr>
      <tr>
        <td>价格</td>
        <td><input type="text" name="price" value="${price }" class="easyui-numberbox" value="0" precision="2"></td>
      </tr>
      <tr>
        <td>图片上传</td>
        <td><input type="file" name="pic"></td>
      </tr>
      <tr>
        <td></td>
        <td>
          <input type="button" value="送出" onclick="submit()">
          <p style="color:red;font-size:8px;">${msg }</p>
          <span id="info" style="color:red;font-size:8px;"></span>
        </td>
      </tr>
    </table>
  </form>

记忆重点

  • 表单中有档案上传时,enctype="multipart/form-data"
  • 使用onkeyup="isValid()进行书号确认
  • 使用onclick="submit()"进行商品上架
    (方法的细节请参阅前面章节)

新建BoodAddSvl

@WebServlet("/back/BookAddSvl")
@MultipartConfig(maxFileSize=100*1024)
public class BookAddSvl extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/back/BookAdd.jsp");
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String isbn = request.getParameter("isbn");
    String bname = request.getParameter("bname");
    String press = request.getParameter("press");
    String pdate = request.getParameter("pdate");
    String price = request.getParameter("price");
    TBook book = new TBook();
    book.setIsbn(isbn);
    book.setBname(bname);
    book.setPress(press);
    //pdate与price需要套用格式所以处理稍微不同
    if(pdate != null && !pdate.equals("")) {
      SimpleDateFormat sd = new SimpleDateFormat();
      try {
        book.setPdate(sd.parse(pdate));
      }catch(Exception e) {
        Log.logger.error(e.getMessage(),e);
      }
    }
    if(price != null && !price.equals("")) {
      try {
        book.setPrice(Double.parseDouble(price));
      }catch(Exception e) {
        Log.logger.error(e.getMessage(),e);
      }
    }
    try {
      Part part = request.getPart("pic");
      InputStream in = part.getInputStream();
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      byte[] buff = new byte[1024];
      int len;
      //若in.read(buff)能读到资料,把资料长度设给len,让out写出资料(从0写到len的长度)
      while((len = in.read(buff)) != -1) {
        out.write(buff, 0, len);
      }
      //out写出完成後,把资料转存为byte[]
      byte[] pic = out.toByteArray();
      
      //存入javaBean
      book.setPic(pic);
      
      //将javaBean加入DB中
      BookBiz biz = new BookBiz();
      biz.addBook(book);
      request.setAttribute("msg", bname + "上传成功");
      request.getRequestDispatcher("/WEB-INF/back/Bookadd.jsp").forward(request, response);
    }catch(Exception e){
      Log.logger.error(e.getMessage(),e);
      request.setAttribute("msg", e.getMessage());
      request.getRequestDispatcher("/error.jsp").forward(request, response);
    }
  }
}

记忆重点

  1. 将表格资料存到javaBean中,需转换的资料要先进行非空判定。
  2. 图片档上传
  3. 将阵列档案存进javaBean
  4. 将javaBean存进DB
  5. 将成功或失败讯息设给request并转发至其他网页。

档案上传步骤:

  1. 使用request.getPart("pic")取得档案
  2. 使用part.getInputStream()取得输入流
  3. 使用new ByteArrayOutputStream()取得输出流
  4. 使用in.read(buff)读取档案,搭配while回圈使用out.write(buff, 0, len)将档案写出到输出流
  5. 使用out.toByteArray()将输出流转成2位元阵列

在BookBiz新增addBook()

  public void addBook(TBook book) {
    IBookDao dao = new BookDaoMysql();
    try {
      dao.addBook(book);
    }finally {
      dao.closeConnection();
    }
  }

在BookDaoMysql新增addBook()

  public void addBook(TBook book) throws Exception{
    String sql = "insert into tbook(isbn,bname,press,price,pdate,pic,bkcount) value(?,?,?,?,?,?,?)";
    this.openConnection(); 
    PreparedStatement ps = this.connection.prepareStatement(sql);
    ps.setString(1, book.getIsbn());
    ps.setString(2, book.getBname());
    ps.setString(3, book.getPress());
    ps.setDouble(4, book.getPrice());
    ps.setDate(5, new java.sql.Date(book.getPdate().getTime()));
    ps.setBytes(6, book.getPic());
    ps.setInt(7, 1000);
    ps.executeUpdate();
    ps.close();
  }

<<:  作为CISO最关键的任务-开发资讯安全性管理系统

>>:  系统分析师的养成之路—聆听篇

Swift纯Code之旅 Day19. 「ViewController好乱(1) - MVC介绍)」

前言 做到现在会发现每个ViewController内的程序码都一大堆,有画面元件,有逻辑,有Mod...

学习Python纪录Day7 - for回圈、while回圈

回圈 python常见的回圈有for和while回圈,而python是透过缩排(ident)定义回圈...

Day 11 - 用Kotlin解数学题:考拉兹猜想

Day 11 - 用Kotlin解数学题:考拉兹猜想 今天我们会用我前面所教的,来解今天的数学题,顺...

Day 3:建立专案(一)

软件专案通常由许多程序码档案以及资源档组成,C++ 专案透过编译、连结产生各平台的可执行档。多数专案...

Vue.js 从零开:v-bind:is 动态元件

如果要控制元件出现或是消失,依照之前讨论的章节,会使用到v-if、v-show的指令来完成,但当你的...