校园商铺-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>
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+"\t年龄:"+value.age);
//写入json
String jsonString = mapper.writeValueAsString(value);
logger.warn("json结果:"+jsonString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}

## 3. Controller层
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类型。
ShopManagerController.java
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());
}
}
}
}
校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现的更多相关文章
- 校园商铺-4店铺注册功能模块-8店铺注册之Controller层的改造
不合理的地方: 1. 并不需要将InputStream转换成File类型,直接将InputStream传进入交给CommonsMultipartfile去处理就可以了 如果做这样的转换,每次都需要生成 ...
- 校园商铺-4店铺注册功能模块-5店铺注册之Service层的实现
1. 创建接口 ShopService.java package com.csj2018.o2o.service; import java.io.File; import com.csj2018.o2 ...
- 校园商铺-4店铺注册功能模块-10店铺注册之js实现
1. 建立js目录和文件 1.1 建立js目录 在webapp下新建文件夹js,再在js目录下新建shop文件夹. 1.2 js文件 js的功能: 1.从后台获取到店铺分类.区域等是信息,将它填充到前 ...
- 校园商铺-4店铺注册功能模块-4Dto之ShopExecution的实现
1. DTO:添加店铺的返回类型 问题:为什么不直接用实体类Shop呢? 原因:在操作Shop的时候,必然会有一个状态.添加店铺,添加成功,还是添加失败? 如果添加失败,失败是一个什么状态,这些都是要 ...
- springboot项目整合-注册功能模块开发
工程简介 准备工作:项目所用到的html界面以及sql文件链接如下:链接: https://pan.baidu.com/s/18loHJiKRC6FI6XkoANMSJg?pwd=nkz2 提取码: ...
- 校园商铺-4店铺注册功能模块-3thumbnailator图片处理和封装Util
1. 初步使用thumbnailator 1.1 下载依赖 <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator - ...
- 校园商铺-4店铺注册功能模块-1Dao层之更新店铺
dao层增加更新店铺的方法 package com.csj2018.o2o.dao; import com.csj2018.o2o.entity.Shop; public interface Shop ...
- SSM到Spring Boot-从零开发校园商铺平台
第1章 开发准备 本章包含课程介绍,同时讲解开发网站所需要准备的事情,并且带领大家从零开始搭建一个Maven Web. 1-1 课程导学 1-2 开发准备 第2章 项目设计和框架搭建 本章主要先带领大 ...
- ios 注册功能研究学习
通常,移动App的注册功能通常采用手机号码注册或者邮箱帐号注册. 不过在国内这样隐私堪忧的环境下,需要手机号来注册会流失不少用户.即便是新浪微博这样的应用,需要绑定手机号也令我不信任.除非是像淘宝.支 ...
随机推荐
- 找到最大或者最小的N个元素
heapq模块中的两个函数nlargest()和nsmallest() import heapq nums = [1,5,6,458,6,787,5,45,6] print(heapq.nlarges ...
- Gulp执行预处理
1. 在项目中安装 gulp-sass插件来编译Sass npm install gulp-sass --save-dev 2. 在gulpfile.js中编写 var gulp = require( ...
- wordpress Warning: Parameter 2 to qtranxf_postsFilter() expected to be a reference
wordpress qtranslate-x Warning: Parameter 2 to qtranxf_postsFilter() expected to be a reference Para ...
- lsof 详解
lsof常用参数 lsof 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位lsof -i 列出所有网络连接lsof -i tcp 列出所有tcp连接信息lsof -i udp ...
- Nmap扫描与Tcpdump抓包分析
扫描与抓包分析 3.1 问题 本案例要求熟悉Linux主机环境下的常用安全工具,完成以下任务操作: 使用NMAP扫描来获取指定主机/网段的相关信息 使用EtterCAP截获明文通信的密码.检测非加密通 ...
- 使用GDI+绘制的360风格按钮控件
将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50 ...
- hive的数据存储格式
hive的数据存储格式 Hive支持的存储数的格式主要有:TEXTFILE(行式存储) .SEQUENCEFILE(行式存储).ORC(列式存储).PARQUET(列式存储). 1 列式存储和行式存储 ...
- NOIp2018集训test-9-23
这个NOI模拟题怕是比你们的NOIp模拟题要简单哦.. 友好的生物 应该是一道简单题,但是机房只有辉神一个人想到正解似乎. 被我kd-tree水过去了(这不是kd-tree的裸题吗???(不是)) / ...
- Java-Class-@I:org.springframework.validation.annotation.Validated
ylbtech-Java-Class-@I:org.springframework.validation.annotation.Validated 1.返回顶部 2.返回顶部 1. package ...
- hadoop2.x需要知道的默认yarn配置
在Hadoop 2.2.0中,YARN框架有很多默认的参数值,如果你是在机器资源比较不足的情况下,需要修改这些默认值,来满足一些任务需要.NodeManager和ResourceManager都是在y ...