本节内容,实现ShopController功能
1.在web包下创建shopadmin包,并创建ShopController类。
2.在util包下创建HttpRequestServletUtil
处理HttpServletRequest参数,从request请求中根据key提取value,并转换为相应的类型。
package com.imooc.o2o.util;
import javax.servlet.http.HttpServletRequest;
/**
* 处理HttpServletRequest参数
* 从request请求中根据key提取value,并转换为相应的类型
* @author zhanghui
*
*/
public class HttpServletRequestUtil {
public static int getInt(HttpServletRequest request,String key) {
try {
return Integer.decode(request.getParameter(key));
}catch (Exception e) {
return -1;//转换失败
}
}
public static long getLong(HttpServletRequest request,String key) {
try {
return Long.valueOf(request.getParameter(key));
}catch (Exception e) {
return -1;//转换失败
}
}
public static double getDouble(HttpServletRequest request,String key) {
try {
return Double.valueOf(request.getParameter(key));
}catch (Exception e) {
return -1d;//转换失败
}
}
public static boolean getBoolean(HttpServletRequest request,String key) {
try {
return Boolean.valueOf(request.getParameter(key));
}catch (Exception e) {
return false;//转换失败
}
}
public static String getString(HttpServletRequest request,String key) {
try {
String result = request.getParameter(key);
if(result != null) {
result = result.trim();
}
if("".equals(result)) {
return null;
}
return result;
}catch (Exception e) {
return null;//转换失败
}
}
}
3.实现ShopController
package com.imooc.o2o.web.shopadmin;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
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.fasterxml.jackson.databind.ObjectMapper;
import com.imooc.o2o.dto.ShopExecution;
import com.imooc.o2o.entity.PersonInfo;
import com.imooc.o2o.entity.Shop;
import com.imooc.o2o.enums.ShopStateEnum;
import com.imooc.o2o.service.ShopService;
import com.imooc.o2o.util.HttpServletRequestUtil;
import com.imooc.o2o.util.ImageUtil;
import com.imooc.o2o.util.PathUtil;
@Controller
@RequestMapping("/shopadmin")
public class ShopManagementController {
@Autowired
private ShopService shopService;
/**
* 接收表单
* @param request
* @return
*/
@RequestMapping(value = "/registershop",method = RequestMethod.POST)
@ResponseBody
private Map<String,Object> registerShop(HttpServletRequest request){
//用来返回map
Map<String,Object> modelMap = new HashMap<String, Object>();
//1.接收并转化相应的参数,包括店铺信息和图片信息
String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
ObjectMapper mapper = new ObjectMapper();
Shop shop = null;
try {
shop = mapper.readValue(shopStr, Shop.class);//json对象转换为shop.class
}catch(Exception e){
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
return modelMap;
}
CommonsMultipartFile shopImg = null;//接收图片
//文件上传解析器,解析request中的文件信息
//从本次会话中获取相关文件上传的内容
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
if(commonsMultipartResolver.isMultipart(request)) {
//multipartHttpServletRequest可提取相关的文件流
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
shopImg = (CommonsMultipartFile)multipartHttpServletRequest.getFile("shopImg");
}else {
modelMap.put("success", false);
modelMap.put("errMsg", "上传图片不能为空");
return modelMap;
}
//2.注册店铺
if(shop != null && shopImg != null) {
PersonInfo owner = new PersonInfo();
owner.setUserId(1L);
shop.setOwner(owner);
File shopImgFile = new File(PathUtil.getImgBasePath() + ImageUtil.getRandomFileName());//空文件接收
try {
shopImgFile.createNewFile();
}catch (IOException e) {
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
return modelMap;
}
try {
inputStreamToFile(shopImg.getInputStream(), shopImgFile);
} catch (IOException e) {
e.printStackTrace();
}
ShopExecution se = shopService.addShop(shop,shopImgFile );
if(se.getState() == ShopStateEnum.CHECK.getState()) {
modelMap.put("success", true);
}else {
modelMap.put("success", false);
modelMap.put("errMsg", se.getStateInfo());
}
return modelMap;
}else {
modelMap.put("success", false);
modelMap.put("errMsg", "请输入店铺信息");
return modelMap;
}
//3.返回结果
}
/**
* 将inputStream转换为file
* @param is
* @param file
*/
private static void inputStreamToFile(InputStream is,File file) {
FileOutputStream os = null;
try {
os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[1024];
while((bytesRead = is.read(buffer))!=-1) {
os.write(buffer,0,bytesRead);
}
}catch (Exception e) {
throw new RuntimeException("调用inputStreamTofile产生异常:" + e.getMessage());
}finally {
try {
if(os != null) {
os.close();
}
if(is != null) {
is.close();
}
}catch (IOException e) {
throw new RuntimeException("inputStreamTofile关闭io产生异常:" + e.getMessage());
}
}
}
}
1.接收并转化相应的参数,店铺信息和图片
2.注册店铺
3.返回
使用ObjectMapper进行JSON对象转换
引入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
图片处理
图片处理使用Spring自带的CommonsMultipartResolver作为文件上传解析器。从本次会话中获取相关文件上传的内容
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
//判断请求中是否存在文件上传的内容
if(commonsMultipartResolver.isMultipart(request)) {
//multipartHttpServletRequest可提取相关的文件流
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
//从请求中提取文件
shopImg = (CommonsMultipartFile)multipartHttpServletRequest.getFile("shopImg");
}
此处提取的文件为CommonsMultipartFile类型,service层的方法接收参数问file类型,固将CommonsMultipartFile转换为File类型,由于CommonsMultipartFile无法直接转换为File,可通过将CommonsMultipartFile转换为Inputstream类型,然后再转为File类型。
可见上文中inputStreamToFile()方法。