zoukankan      html  css  js  c++  java
  • 校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现

    1. 从request请求获取获取相关的值

    HttpservletRequest request代表的是客户端的请求。当客户端通过http协议访问服务器的时候,http请求头中的所有信息,都封装在这个对象中,通过这个对象提供的方法,就可以获得客户端请求的所有信息。
    以用户注册为例,当用户注册店铺时,用户需要在前端提交店铺的相关信息,这个店铺的信息都会被保存这个request中,返回值类型是Map类型,用来返回必要的健值对结果。
    新建工具类HttpServletRequestUtil.java,从HttpServletRequest对象中获取相关的值

    package com.csj2018.o2o.util;
    
    import javax.servlet.http.HttpServletRequest;
    
    public class HttpServletRequestUtil {
        /*
    		 * HttpServiceRequest request代表的客户端的请求。
    		 * 当客户端通过http协议访问服务器的时候,http请求头中的所有信息,都封装在这个对象中,通过这个对象提供的方法就可以获得客户端请求的所有信息。
    		 * 以用户注册为例,当用户注册店铺时,用户需要在前端的表格里面,提交店铺相关的信息,这个店铺的信息都会被保存在这个request中,返回值类型是Map类型,用来返回必要的健值对结果。
    		 */
    	 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 -1L;
    		}
    	}
    	 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)) {
    				result = null;
    			}
    			return result;
    		}catch (Exception e) {
    			return null;
    		}
    	}
    }
    

    2. Jackson-databind

    		<!-- json解析 -->
    		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    		<dependency>
    			<groupId>com.fasterxml.jackson.core</groupId>
    			<artifactId>jackson-databind</artifactId>
    			<version>2.9.8</version>
    		</dependency>
    

    jackson-databind1分钟教程

    package com.csj2018.o2o.util;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    class MyValue{
    	public String name;
    	public int age;
    }
    public class TestJackson {
    	private static Logger logger = LoggerFactory.getLogger(TestJackson.class);
    	public static void main(String[] args) {
    		ObjectMapper mapper = new ObjectMapper();
    		try {
    			//读取json
    			MyValue value = mapper.readValue("{"name":"Bob","age":15}", MyValue.class);
    			logger.warn("姓名:"+value.name+"	年龄:"+value.age);
    			//写入json
    			String jsonString = mapper.writeValueAsString(value);
    			logger.warn("json结果:"+jsonString.toString());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}		
    	}
    }
    
    

    3. Controller层ShopManagerController.java

    ShopManagerController实现店铺管理相关的逻辑:
    首先在Controller里面定义了SpringMVC相关的标签,这个标签包含了Controller和registershop方法的访问路径,同时给它在执行的时候通过Spring容器注入一个我们之前实现好的ShopService实现类,用来提供addShop服务。
    在registerShop里显示处理了传入的用户请求参数,将参数里面的店铺相关的信息解析出来,通过Jackson将它转换成shop的实体类,同时还将请求里面的文件剥离出来,通过Multipart去接收,之后再将转换出来的Shop实例和店铺图片传入给ShopService的addShop去处理。
    处理之前还需要完善店铺相关的信息,就是Owner信息。由于Owner是可以直接从Session里面获取,而不需要依赖于表单的信息,对于上层传过来的信息,越少依赖越好,因此这里提倡从Session获取,但是由于还没有对用户的注册信息去实现相关的功能,因此这里直接硬编码一个默认的OwnerId为1,后面会完善。
    由于ShopService的addShop的第2个参数要求是File类型的,而传入的ShopImg是CommentsMultipartFile这样的一个类型,因此需要将CommonsMultipartFile转换成File类型。

    package com.csj2018.o2o.web.shopadmin;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import java.io.InputStream;
    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.csj2018.o2o.dto.ShopExecution;
    import com.csj2018.o2o.entity.PersonInfo;
    import com.csj2018.o2o.entity.Shop;
    import com.csj2018.o2o.enums.ShopStateEnum;
    import com.csj2018.o2o.service.ShopService;
    import com.csj2018.o2o.util.HttpServletRequestUtil;
    import com.csj2018.o2o.util.ImageUtil;
    import com.csj2018.o2o.util.PathUtil;
    import com.fasterxml.jackson.databind.ObjectMapper;
    // 首先在Controller里面定义了SpringMVC相关的标签,这个标签包含了Controller的访问路径以及registerregisterShop方法的访问路径,
    @Controller
    @RequestMapping("/shopadmin")
    public class ShopManagerController {
    	//同时给它在执行的时候通过Spring容器注入之前实现好的ShopService实现类,用来提供addShop的服务。
    	@Autowired
    	private ShopService shopService;
    	@RequestMapping(value="/registershop",method=RequestMethod.POST)
    	@ResponseBody
    	private Map<String,Object> registerShop(HttpServletRequest request){
    		//先定义一个返回值
    		Map<String,Object> modelMap = new HashMap<String,Object>();
    		//1.接收并转换相应的参数,包括店铺信息以及图片信息
    		//获取请求头的店铺信息
    		String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
    		//将json转换为Shop实例
    		ObjectMapper mapper = new ObjectMapper();
    		Shop shop = null;
    		try {
    			shop = mapper.readValue(shopStr, Shop.class);
    		}catch(Exception e) {
    			modelMap.put("success",false);
    			modelMap.put("errMeg",e.getMessage());
    			return modelMap;
    		}
    		//将请求中的文件流剥离出来,通过CommonsMultipartFile去接收
    		CommonsMultipartFile shopImg = null;
    		CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
    				request.getSession().getServletContext());
    		if(commonsMultipartResolver.isMultipart(request)) {
    			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();
    			//预期从Session获取,目前自定义,以后完善
    			owner.setUserId(1L);
    			shop.setOwner(owner);
    			//由于addShop的第二个参数是File类型的,而传入的ShopImg是CommonsMultipartFile这样的一个类型,因此需要将CommonsMultipartFile转换成File类型
    			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(Exception e) {
    				modelMap.put("success",false);
    				modelMap.put("errMsg", e.getMessage());
    				return modelMap;
    			}
    			//注册店铺
    			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;
    			}
    			return modelMap;
    		}else {
    			modelMap.put("success",false);
    			modelMap.put("errMsg", "请输入店铺信息");
    			return modelMap;
    		}
    
    	}
    	private static void inputStreamToFile(InputStream inputStream,File file) {
    		FileOutputStream os = null;
    		try {
    			os = new FileOutputStream(file);
    			int bytesRead = 0;
    			byte[] buffer = new byte[1024];
    			while((bytesRead=inputStream.read(buffer))>0) {
    				os.write(buffer,0,bytesRead);
    			}
    		}catch (Exception e) {
    			throw new RuntimeException("调用inputStreamToFile产生异常:"+e.getMessage());
    		}finally {
    			try {
    				if(os != null) {
    					os.close();
    				}
    				if(inputStream != null) {
    					inputStream.close();
    				}
    			}catch (IOException e) {
    				throw new RuntimeException("调用inputStreamToFile产生异常:"+e.getMessage());
    			}
    		}
    	}
    }
    
  • 相关阅读:
    RPC 调用简述
    bootstrap tab切换无效的一种情况
    html块元素和内联元素介绍
    重装系统后,Linux虚拟机无法联网
    datatables.js表头挤在一列的解决办法
    &nbsp; &ensp; &emsp; &thinsp;&zwnj;&zwj; 6种空白空格的区别
    pagination.js通过ajax请求获取数据
    谷歌浏览器调制,控制面板各命令总结
    点击表格弹窗获取另外一套数据之后,原表格相关数据的调用
    datatable columns与columnDefs
  • 原文地址:https://www.cnblogs.com/csj2018/p/11598284.html
Copyright © 2011-2022 走看看