Shop项目后台--2.商品的添加
2018-01-14 16:06
302 查看
分析:
商品的添加涉及两个部分。添加商品product到数据库,上传product图片到服务器磁盘上。
涉及图片上传,要用多部分表单提交,所以request.getParameter相关的所有方法都失效,不能用隐藏域<input type="hidden" name="method" value="addProduct">的形式编写表单。永远获取不到方法的值,为null,即不能继承BaseServlet执行代码。所以用原始的,表单直接提交给继承HttpServlet的类的执行方法即可。
1.检查表单 post提交 、multipart /form-data多部分表单 、图片上传位置<input type="file">。把表单提交给业务servlet。
2.编写AddProductServlet.目的有两个:1)封装product实体,存到数据库。2)将图片上传到服务器磁盘上。
通过文件中传核心类方法,判断普通表单项与文件上传项。
普通表单项的数据要创建一个map集合来封装,以用于BeanUtils工具封装到product实体里,pimag需要相对地址,防止数据库的迁移,所以pimage在文件上传项那里封装。
文件上传项,通过FileItem方法获取输入流,输出所在的位置与文件的名称。根据位置与名称创建一个输出流。 利用IOUtils把文件上传到服务器,同时要删除临时文件。
手动封装product对象在表单获取不到的数据,这样就完成product实体的封装,与文件的上传。然后可以重定向到后台商品显示列表或其他页面。
准备:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
步骤:
在add.jsp页面
1.编写表单提交的地址adminAddProduct,方法post 多部分表单multipart/from-data 。检查表单数据的name值
在AdminAddProductServlet
1.创建磁盘文件工厂
2.创建文件上传核心类,并设置文件名编码
3.分析request得到文件项集合,并遍历,判断普通表单项,与文件上传项
4.在普通订单项:创建一个map集合,存储普通表单的数据。
5.在文件上传项:获取读取流in,被上传文件名称,在工程创建一个文件,同时获取文件的绝对地址,创建输出流。
6.用map集合存储pimag的相对地址。删除临时文件。
7,创建Product对象用BeanUtils把map集合的数据封装到product中,手动封装pid pdate pflag Category
8.把product传到service层 dao层,
9.完成商品添加后,重定向到其他页面
add.jsp
AdminAddProductServlet
商品的添加涉及两个部分。添加商品product到数据库,上传product图片到服务器磁盘上。
涉及图片上传,要用多部分表单提交,所以request.getParameter相关的所有方法都失效,不能用隐藏域<input type="hidden" name="method" value="addProduct">的形式编写表单。永远获取不到方法的值,为null,即不能继承BaseServlet执行代码。所以用原始的,表单直接提交给继承HttpServlet的类的执行方法即可。
1.检查表单 post提交 、multipart /form-data多部分表单 、图片上传位置<input type="file">。把表单提交给业务servlet。
2.编写AddProductServlet.目的有两个:1)封装product实体,存到数据库。2)将图片上传到服务器磁盘上。
通过文件中传核心类方法,判断普通表单项与文件上传项。
普通表单项的数据要创建一个map集合来封装,以用于BeanUtils工具封装到product实体里,pimag需要相对地址,防止数据库的迁移,所以pimage在文件上传项那里封装。
文件上传项,通过FileItem方法获取输入流,输出所在的位置与文件的名称。根据位置与名称创建一个输出流。 利用IOUtils把文件上传到服务器,同时要删除临时文件。
手动封装product对象在表单获取不到的数据,这样就完成product实体的封装,与文件的上传。然后可以重定向到后台商品显示列表或其他页面。
准备:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
步骤:
在add.jsp页面
1.编写表单提交的地址adminAddProduct,方法post 多部分表单multipart/from-data 。检查表单数据的name值
在AdminAddProductServlet
1.创建磁盘文件工厂
2.创建文件上传核心类,并设置文件名编码
3.分析request得到文件项集合,并遍历,判断普通表单项,与文件上传项
4.在普通订单项:创建一个map集合,存储普通表单的数据。
5.在文件上传项:获取读取流in,被上传文件名称,在工程创建一个文件,同时获取文件的绝对地址,创建输出流。
6.用map集合存储pimag的相对地址。删除临时文件。
7,创建Product对象用BeanUtils把map集合的数据封装到product中,手动封装pid pdate pflag Category
8.把product传到service层 dao层,
9.完成商品添加后,重定向到其他页面
add.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <HTML> <HEAD> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK href="${pageContext.request.contextPath}/css/Style1.css" type="text/css" rel="stylesheet"> <!-- 引入Jquery文件 --> <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script> <!-- 添加页面加载事件 --> <script type="text/javascript"> $(function(){ //加入alert();验证绑定页面加载事件成功 //ajax 异步获取商品分类所有列表 $.post( //1.输入执行的url "${pageContext.request.contextPath}/admin?method=findAllCategory", //2.传递的数据,因为这不需要传递数据,直接省略 //3.返回数据执行的函数 function(data){ //返回的是category对象集合以json格式字符串表示[{"cid":xx,"cname":xxx},{},{}] //拼接多个<option value=""></option>放到select中 var content=""; for(var i=0;i<data.length;i++){ //因为字符串 注意value的双引号这里要改为单引号 content+="<option value='"+data[i].cid+"'>"+data[i].cname+"</option>"; } //把拼好的串放到select中 $("#cid").html(content); }, //4.返回数据的格式 "json" ); }) </script> </HEAD> <body> <!-- --> <form id="userAction_save_do" name="Form1" action="${pageContext.request.contextPath}/adminAddProduct" method="post" enctype="multipart/form-data"> <table cellSpacing="1" cellPadding="5" width="100%" align="center" bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0"> <tr> <td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4" height="26"> <strong><STRONG>添加商品</STRONG> </strong> </td> </tr> <tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 商品名称: </td> <td class="ta_01" bgColor="#ffffff"> <input type="text" name="pname" value="" id="userAction_save_do_logonName" class="bg"/> </td> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 是否热门: </td> <td class="ta_01" bgColor="#ffffff"> <select name="is_hot"> <option value="1">是</option> <option value="0">否</option> </select> </td> </tr> <tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 市场价格: </td> <td class="ta_01" bgColor="#ffffff"> <input type="text" name="market_price" value="" id="userAction_save_do_logonName" class="bg"/> </td> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 商城价格: </td> <td class="ta_01" bgColor="#ffffff"> <input type="text" name="shop_price" value="" id="userAction_save_do_logonName" class="bg"/> </td> </tr> <tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 商品图片: </td> <td class="ta_01" bgColor="#ffffff" colspan="3"> <input type="file" name="upload" /> </td> </tr> <tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 所属分类: </td> <td class="ta_01" bgColor="#ffffff" colspan="3"> <!-- 加上cname方便获取 修改name值 --> <select id="cid" name="cid"> <!-- 拼接option字符串的位置 --> </select> </td> </tr> <tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 商品描述: </td> <td class="ta_01" bgColor="#ffffff" colspan="3"> <textarea name="pdesc" rows="5" cols="30"></textarea> </td> </tr> <tr> <td class="ta_01" style="WIDTH: 100%" align="center" bgColor="#f5fafe" colSpan="4"> <button type="submit" id="userAction_save_do_submit" value="确定" class="button_ok"> 确定 </button> <FONT face="宋体"> </FONT> <button type="reset" value="重置" class="button_cancel">重置</button> <FONT face="宋体"> </FONT> <INPUT class="button_ok" type="button" onclick="history.go(-1)" value="返回"/> <span id="Label1"></span> </td> </tr> </table> </form> </body> </HTML>
AdminAddProductServlet
package com.itheima.web.servlet; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; imp 4000 ort org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import com.itheima.domain.Category; import com.itheima.domain.Product; import com.itheima.service.AdminService; public class AdminAddProductServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 目的:收集表单封装成product实体存到数据库,上传图片到服务器磁盘 //创建map集合,用来存储获取到的数据 Map<String,Object> map = new HashMap<String,Object>(); try { // 1.创建磁盘文件工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 2.创建文件上传核心类 ServletFileUpload upload = new ServletFileUpload(factory); // 因为这个单一,肯定为多部分表单,不需要判断 // 编码,文件文字 upload.setHeaderEncoding("UTF-8"); // 3.解析request,获取文件项集合 List<FileItem> parseRequest = upload.parseRequest(request); //4.遍历文件项集合,判断普通文件与上传文件 for(FileItem item :parseRequest ) { boolean formField = item.isFormField(); if(formField) { //普通表单项,获取表单数据封装到product实体中 String fieldName = item.getFieldName();// 获取名字 String fielValue = item.getString("UTF-8");//获取值 //用map集合存储数据 map.put(fieldName, fielValue); }else { //上传文件 InputStream in = item.getInputStream(); String name = item.getName(); //获取upload文件的绝对地址 String path_store = this.getServletContext().getRealPath("upload"); OutputStream out = new FileOutputStream(path_store+"/"+name); IOUtils.copy(in, out); in.close(); out.close(); item.delete(); //用map集合存储pimage的相对地址,需要用上相对地址,以防数据库迁移 map.put("pimage", "upload"+name); } } //利用BeanUtils封装produt实体 Product product = new Product(); BeanUtils.populate(product, map); //手动封装好product欠缺的属性 //String pid 商品id product.setPid(UUID.randomUUID().toString()); //Date pdate 创建日期 product.setPdate(new Date()); //String pflag 上架状态 product.setPflag(0); //Category category 因为数据库product表只需要cid,所以category只需要封装cid就可以 Category category = new Category(); category.setCid(map.get("cid").toString()); product.setCategory(category); //到此product实例封装完毕,传到service层,存到数据库 AdminService service = new AdminService(); service.saveProduct(product); } catch (Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }AdminService
package com.itheima.service; import java.sql.SQLException; import java.util.List; import com.itheima.dao.AdminDao; import com.itheima.domain.Category; import com.itheima.domain.Product; public class AdminService { //获取商品所有分类列表 public List<Category> findAllCategory() { AdminDao dao = new AdminDao(); List<Category> categoryList=null; try { categoryList = dao.findAllCategory(); } catch (SQLException e) { e.printStackTrace(); } return categoryList; } //把商品存到数据库 public void saveProduct(Product product) { AdminDao dao = new AdminDao(); try { dao.saveProduct(product); } catch (SQLException e) { e.printStackTrace(); } } }AdminDao
package com.itheima.dao; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.itheima.domain.Category; import com.itheima.domain.Product; import com.itheima.utils.DataSourceUtils; public class AdminDao { //获取所有商品分类列表集合 public List<Category> findAllCategory() throws SQLException { QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); String sql = "select * from category"; List<Category> query = runner.query(sql, new BeanListHandler<Category>(Category.class)); return query; } //把商品存到数据库 public void saveProduct(Product product) throws SQLException { QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); String sql = "insert into product values(?,?,?,?,?,?,?,?,?,?)"; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = format.format(product.getPdate()); runner.update(sql, product.getPid(),product.getPname(),product.getMarket_price(), product.getShop_price(),product.getPimage(),dateStr, product.getIs_hot(),product.getPdesc(),product.getPflag(),product.getCategory().getCid()); } }
相关文章推荐
- Shop项目后台--1.商品添加页面的类别ajax显示
- 项目实践——商品后台管理中的商品添加
- 商品SKU属性添加、上传图片、生成列表并生成json传给后台(支持IE8、谷歌、火狐等主流浏览器)
- 【SSH网上商城项目实战12】添加和更新商品功能的实现
- [thinkPHP5项目实战_09]后台添加栏目及验证
- 项目需求:将购物车中的商品添加到订单表和订单商品表
- Shop项目--4. 分页显示商品的,与分页跳转,上一页,下一页product_list.jsp
- ecshop后台商品列表添加自定义方法 例如添加商品提醒信息
- Shop项目后台--3.查询所有订单
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- IOS之UI--小实例项目--添加商品和商品名
- 商品类别导航(类别在后台可以添加)
- 商城项目实战24:实现添加商品功能
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- 框架 day75 涛涛商城项目easyUI异步tree,图片上传(nginx),KindEditor使用,商品添加
- 带着项目学PHP第九讲 - 如何给ecshop的wap版本首页和商品页添加商品图片
- ecshop后台添加新商品后默认不上架
- 网上商城shop++后台添加新权限。
- Shop项目后台--4.所有订单的订单详情/admin/order/list.jsp