文章目录

  • 概述
  • ProductController
  • 单元测试
  • Github地址

概述

商品添加Controller层的逻辑如下:

1. 获取前端传递过来的Product对象,通过FastJson提供的api将其转换为Product对象

2. 获取前端传递过来的商品缩略图以及商品详情图片,通过CommonsMultipartResolver来处理

3. 调用Service层的服务来持久化数据及图片的操作


ProductController

package com.artisan.o2o.web.shopadmin;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;import com.artisan.o2o.dto.ImageHolder;
import com.artisan.o2o.dto.ProductExecution;
import com.artisan.o2o.entity.Product;
import com.artisan.o2o.entity.Shop;
import com.artisan.o2o.enums.ProductStateEnum;
import com.artisan.o2o.exception.ProductOperationException;
import com.artisan.o2o.service.ProductService;
import com.artisan.o2o.util.HttPServletRequestUtil;
import com.artisan.o2o.util.VerifyCodeUtil;
import com.fasterxml.jackson.databind.ObjectMapper;@Controller
@RequestMapping("/shopadmin")
public class ProductController {@Autowiredprivate ProductService productService;// 最大上传图片数量private static final int IMAGEMAXCOUNT = 6;/*** * * @Title: addProduct* * @Description: 1. 验证码校验* *               2. 接收前端参数:包括 商品、 商品缩略图、商品详情图片实体类* *               前端页面通过post方式传递一个包含文件上传的Form会以multipart/form-data请求发送给服务器,* *               需要告诉DispatcherServlet如何处理MultipartRequest,我们在spring-web.*               xml中定义了multipartResolver。* *               如果某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,*               然后再转发相应的Controller。* *               在Controller中,*               将HttpServletRequest转型为MultipartHttpServletRequest*               ,可以非常方便的得到文件名和文件内容* * @param request* * @return: Map<String,Object>* *          注解@ResponseBody 负责将返回的map对象转换为JSON,供前端使用*/@RequestMapping(value = "/addproduct", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> addProduct(HttpServletRequest request) {Map<String, Object> modelMap = new HashMap<String, Object>();Product product = null;// 接收前端传递过来的productString productStr = null;// 商品图片缩略图(输入流和名称的封装类)ImageHolder thumbnail = null;// 将HttpServletRequest转型为MultipartHttpServletRequest,可以很方便地得到文件名和文件内容MultipartHttpServletRequest multipartHttpServletRequest = null;// 接收商品缩略图CommonsMultipartFile thumbnailFile = null;// 接收商品详情图片List<ImageHolder> productDetailImgList = new ArrayList<ImageHolder>();// 创建一个通用的多部分解析器CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());// Step1:校验验证码if (!VerifyCodeUtil.verifyCode(request)) {modelMap.put("success", false);modelMap.put("errMsg", "验证码不正确");return modelMap;}// Step2: 使用FastJson提供的api,实例化Product 构造调用service层的第一个参数ObjectMapper mapper = new ObjectMapper();// 获取前端传递过来的product,约定好使用productStrtry {productStr = HttPServletRequestUtil.getString(request, "productStr");product = mapper.readValue(productStr, Product.class);} catch (Exception e) {modelMap.put("success", false);modelMap.put("errMsg", e.toString());return modelMap;}// Step3: 商品缩略图 和 商品详情图 构造调用service层的第二个参数和第三个参数try {// 判断 request 是否有文件上传,即多部分请求if (commonsMultipartResolver.isMultipart(request)) {// 将request转换成多部分requestmultipartHttpServletRequest = (MultipartHttpServletRequest) request;// 得到缩略图的CommonsMultipartFile ,和前端约定好使用thumbnail 传递// ,并构建ImageHolder对象thumbnailFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("thumbnail");if(thumbnailFile == null){modelMap.put("success", false);modelMap.put("errMsg", "上传图片不能为空~");return modelMap;}// 转化为ImageHolder,使用service层的参数类型要求thumbnail = new ImageHolder(thumbnailFile.getInputStream() ,thumbnailFile.getOriginalFilename());// 得到 商品详情的列表,和前端约定使用productImg + i 传递 ,并构建ImageHolder对象for (int i = 0; i < IMAGEMAXCOUNT; i++) {CommonsMultipartFile productDetailImgFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("productImg" + i);if (productDetailImgFile != null) {ImageHolder productDetailImg = new ImageHolder(productDetailImgFile.getInputStream(),productDetailImgFile.getOriginalFilename());productDetailImgList.add(productDetailImg);}else{// 如果从请求中获取的到file为空,终止循环break;}}} else {modelMap.put("success", false);modelMap.put("errMsg", "上传图片不能为空");return modelMap;}} catch (Exception e) {modelMap.put("success", false);modelMap.put("errMsg", e.toString());return modelMap;}// Step4 调用Service层if (product != null && thumbnailFile != null && productDetailImgList.size() > 0) {try {// 从session中获取shop信息,不依赖前端的传递更加安全Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");product.setShop(currentShop);// 调用addProductProductExecution pe = productService.addProduct(product, thumbnail, productDetailImgList);if (pe.getState() == ProductStateEnum.SUCCESS.getState()) {modelMap.put("success", true);} else {modelMap.put("success", false);modelMap.put("errMsg", pe.getStateInfo());}} catch (ProductOperationException e) {modelMap.put("success", false);modelMap.put("errMsg", e.toString());return modelMap;}} else {modelMap.put("success", false);modelMap.put("errMsg", "请输入商品信息");}return modelMap;}}

单元测试

待前端页面开发完毕后,一并测试


Github地址

代码地址: https://github.com/yangshangwei/o2o

实战SSM_O2O商铺_30【商品】商品添加之Controller层的实现相关推荐

  1. 实战SSM_O2O商铺_31【商品】商品添加之View层的实现

    文章目录 概述 productoperation.html productoperation.js 联调 检查结果 库表数据: 磁盘上的图片 Github地址 概述 在完成了 实战SSM_O2O商铺_ ...

  2. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现

    文章目录 概述 Dao层接口 ProductDao#selectProductById ProductDao#updateProduct ProductImgDao#deleteProductImgB ...

  3. 实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现

    文章目录 概述 重温实体类 Prouct ProductImg ProductDao接口 Mapper配置文件 ProductImgDao接口 Mapper配置文件 单元测试 #ProductDaoT ...

  4. 实战SSM_O2O商铺_38【商品类别】解除商品与商品类别的关联

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层完善 ProductCategoryServiceImpl#deleteProduct ...

  5. 实战SSM_O2O商铺_34【商品】商品编辑之Controller层的实现

    文章目录 概述 ProductController 单元测试 Github地址 概述 在完成了 实战SSM_O2O商铺_33[商品]商品编辑之Service层的实现之后,我们继续来实现Controll ...

  6. 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口增加接口方法 ProductCategoryDao SQL映射文件 闭环的单元测试 Servie层 接口 接口实现 单元测试 Cont ...

  7. 实战SSM_O2O商铺_26【商品类别】批量新增商品类别从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口 ProductCategoryDao SQL映射文件 单元测试 Service层 ProductCategoryExecution ...

  8. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层 ProductService.java ProductServiceImpl.jav ...

  9. 实战SSM_O2O商铺_25【商品类别】商品类别列表展示从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口 ProductCategoryDao Mapper配置文件 单元测试 Service层 ProductCategoryService ...

最新文章

  1. python 笔记 之 类的继承与重写
  2. 问得最多的十个JavaScript前端面试问题
  3. python自学教程推荐-学习python中的pandas有没有好的教程推荐?
  4. Session机制二(简易购物车案例)
  5. 5 控件固定大小_【聊技术】在Android中实现自适应文本大小显示
  6. Linux系统编程----8(竞态条件,时序竞态,pause函数,如何解决时序竞态)
  7. 关于NIOS ii烧写的几种方式(转)
  8. Win32窗体应用程序如何添加资源文件?
  9. java项目怎么导出成jar_如何在eclipse将程序导出成jar文件
  10. 使用Java8的进来,这几个方法不香吗?
  11. 第四届 AI City 挑战赛 @ CVPR 2020 开始啦!
  12. “萝莉变大妈”事件系主播策划!斗鱼出拳:永久封停!
  13. 服务器自动post,Go Web服务器自动重定向POST请求
  14. Matlab图像分割---使用主动轮廓 (snake) 方法进行图像分割
  15. 【洛谷】P1216数字三角形
  16. 电子元器件选型——功率电感
  17. linux版本信息i686,i686 linux gnu
  18. 【Python】断言(assert)
  19. 应届生Java后台开发面试整理(含答案,不定期更新)
  20. PAT测试 cccc竞赛

热门文章

  1. java wav 波形_java读取wav文件(波形文件)并绘制波形图的方法
  2. C++基本序列式容器效率比较
  3. python 字符串join
  4. sql 数组三 展平数组
  5. 深度学习核心技术精讲100篇(一)-数据分析中有哪些分析指标?
  6. 数据挖掘系列(4)使用weka做关联规则挖掘
  7. 【Linux】7_存储管理基本分区
  8. QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)
  9. 5分钟解析Facebook最新推荐算法
  10. python2 'str' object has no attribute 'decode'