JAVA秒杀mysql层实现_Java高并发秒杀API之web层
第1章 设计Restful接口
1.1前端交互流程设计
1.2 学习Restful接口设计
什么是Restful?它就是一种优雅的URI表述方式,用来设计我们资源的访问URL。通过这个URL的设计,我们就可以很自然的感知到这个URL代表的是哪种业务场景或者什么样的数据或资源。基于Restful设计的URL,对于我们接口的使用者、前端、web系统或者搜索引擎甚至是我们的用户,都是非常友好的。
第2章 SpringMVC整合spring
2.1 SpringMvc理论
蓝色部分是需要我们自己开发的
?表一个字符
*表任意个字符
**表任意路径
{}中的字符以参数形式传入
2.2 整合配置springMVC框架
首先在WEB-INF的web.xml中进行我们前端控制器DispatcherServlet的配置,如下:
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"metadata-complete="true">
seckill-dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-*.xml
seckill-dispatcher
/
然后在spring容器中进行web层相关bean(即Controller)的配置,在spring包下创建一个spring-web.xml,内容如下:
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
这样我们便完成了Spring MVC的相关配置(即将Spring MVC框架整合到了我们的项目中)
第3章 实现秒杀相关的Restful接口
在org.myseckill下新建一个web文件夹,用于存放我们的controller
在该包下创建一个SeckillController.java,内容如下:
controller即MVC中的C控制层,职责是接收参数,做跳转的控制
/*** controller即MVC中的C控制层,职责是接收参数,做跳转的控制
* Controller开发中的方法完全是对照Service接口方法进行开发的,第一个方法用于访问我们商品的列表页,
* 第二个方法访问商品的详情页,第三个方法用于返回一个json数据,数据中封装了我们商品的秒杀地址,
* 第四个方法用于封装用户是否秒杀成功的信息,第五个方法用于返回系统当前时间。
*@authorTwoHeads
**/@Controller
@RequestMapping("/seckill") //一级映射,相当于二级映射前面都有"/seckill" url:模块/资源/{}/细分
public classSeckillController {private Logger logger = LoggerFactory.getLogger(this.getClass());
@AutowiredprivateSeckillService seckillService;
@RequestMapping(value="/list",method=RequestMethod.GET) //二级映射
publicString list(Model model) {//model用于存放渲染list的数据 list.jsp是页面的模板,model是数据//list.jsp+mode=ModelAndView//获取秒杀的列表页
List list =seckillService.getSeckillList();
model.addAttribute("list",list);return "list"; //即WEB-INF/jsp/"list".jsp
}
@RequestMapping(value="/{seckillId}/detail",method=RequestMethod.GET)public String detail(@PathVariable("seckillId") Long seckillId,Model model) {//判断seckillId有没有传
if(seckillId == null) { //之前把Long seckillId写为了long seckillId,不是一个对象,导致无法判断null
return "redirect:/seckill/list";
}
Seckill seckill=seckillService.getById(seckillId);//如果传的id不存在
if(seckill == null) {return "forward:/seckill/list";
}
model.addAttribute("seckill",seckill);return "detail";
}//ajax接口 返回类型是json 暴露秒杀接口的方法//只接受post方式,即直接在浏览器中输入这个地址是无效的,地址栏回车属于get方式。post方式只能设计一个表单,一个提交按钮,才可以。//produces告诉浏览器我们的contentType是json
@RequestMapping(value="/{seckillId}/exposer",
method=RequestMethod.POST,
produces= {"application/json;charset=UTF-8"})//@ResponseBody这个注解告诉springMVC返回的是一个json类型的数据
@ResponseBodypublic SeckillResultexposer(Long seckillId) {
SeckillResultresult;try{
Exposer exposer=seckillService.exportSeckillUrl(seckillId);
result= new SeckillResult(true,exposer);
}catch(Exception e) {
logger.error(e.getMessage(),e);//出现异常则调用SeckillResult的另一个构造方法
result = new SeckillResult(false,e.getMessage());
}returnresult;
}//所有的ajax请求都统一的返回SeckillResult,dto用于web层和service层的数据传递,SeckillResult和Exposer,SeckillExecution全都是dto包下的类
@RequestMapping(value="/{seckillId}/{md5}/execution",
method=RequestMethod.POST,
produces= {"application/json;charset=UTF-8"})
@ResponseBody//参数seckillId和md5都可以从url映射的请求参数中{seckillId},{md5}取得,而用户标识killPhone在url中并没有,从用户浏览器request请求的cookie中取得//required = false使当cookie没有killPhone参数时springMVC不报错,把killphone的验证逻辑放到程序中来
public SeckillResult execute(@PathVariable("seckillId") Long seckillId,
@PathVariable("md5")String md5,
@CookieValue(value= "killPhone",required = false)Long phone){if(phone == null) {return new SeckillResult(false,"未注册");
}
SeckillResultresult;try{
SeckillExecution execution=seckillService.executeSeckill(seckillId, phone, md5);return new SeckillResult(true, execution);
}catch(SeckillCloseException e) {//SeckillCloseException和RepeatKillException是允许的异常
SeckillExecution execution = newSeckillExecution(seckillId, SeckillStatEnum.END);return new SeckillResult(false, execution);
}catch(RepeatKillException e) {
SeckillExecution execution= newSeckillExecution(seckillId, SeckillStatEnum.REPEAT_KILL);return new SeckillResult(false, execution);
}catch(Exception e) {
logger.error(e.getMessage(), e);//其他所有未知异常算作INNER_ERROR
SeckillExecution execution = newSeckillExecution(seckillId, SeckillStatEnum.INNER_ERROR);return new SeckillResult(false, execution);
}
}
@RequestMapping(value="/time/now",method=RequestMethod.GET)public SeckillResulttime(){
Date now= newDate();return new SeckillResult(true, now.getTime());
}
}
所有的ajax请求都统一的返回SeckillResult,
dto用于web层和service层的数据传递,SeckillResult和Exposer,SeckillExecution全都是dto包下的类
@ResposeBody注解的使用
1、
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
2、
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
Controller开发中的方法完全是对照Service接口方法进行开发的,第一个方法用于访问我们商品的列表页,第二个方法访问商品的详情页,第三个方法用于返回一个json数据,数据中封装了我们商品的秒杀地址,第四个方法用于封装用户是否秒杀成功的信息,第五个方法用于返回系统当前时间。代码中涉及到一个将返回秒杀商品地址封装为json数据的一个Vo类,即SeckillResult.java,在dto包中创建它,内容如下:
//封装json数据结果,将所有的ajax请求返回类型,全部封装成json数据
//泛型SeckillResult可以为SeckillResult也可以为SeckillResult
public class SeckillResult{private boolean success; //标识,判断请求是否成功
private T data; //泛型类型的数据
private String error; //错误信息//如果success是true则有数据
public SeckillResult(booleansuccess, T data) {super();this.success =success;this.data =data;
}//如果success是false则传递错误信息
public SeckillResult(booleansuccess, String error) {super();this.success =success;this.error =error;
}//getter和setter
}
第4章 基于bootstrap开发页面结构
在WEB-INF下新建jsp文件夹和list.jsp和detail.jsp
直接在http://www.runoob.com/bootstrap/bootstrap-environment-setup.html中找到bootstrap模板,拷贝到list.jsp和detail.jsp中并进行修改
在jsp文件夹下创建common文件夹用于存放公用的的jsp,在其下创建head.jsp如下:
list.jsp和detail.jsp中便不需要以上内容了
剩下前端的内容暂时先复制了代码
list.jsp:
秒杀商品列表
秒杀列表
JAVA秒杀mysql层实现_Java高并发秒杀API之web层相关推荐
- java 秒杀 源码 下载_java高并发秒杀系统3-4节秒杀功能实现.mp4
本Java商城秒杀系统视频教程目录如下: java高并发秒杀系统1-1节java高并发商城秒杀优化学习指引.mp4 java高并发秒杀系统1-2节项目环境搭建(Eclipse)-节.mp4 ja ...
- java商品详情页设计_java高并发秒杀系统3-2节商品详情页上.mp4
本Java商城秒杀系统视频教程目录如下: java高并发秒杀系统1-1节java高并发商城秒杀优化学习指引.mp4 java高并发秒杀系统1-2节项目环境搭建(Eclipse)-节.mp4 ja ...
- java service层 事务_Java高并发秒时啊API之Service层1
---2-1 使用Spring托管Service依赖理论---------------------------- spring ioc优势(工厂模式): 1.对象创建统一托管 2.规范的生命周期管理 ...
- java 多进程写一个文件_java高并发多线程及多进程同时写入文件研究
测试&思考: 环境:windows 七.linux centos 6.三.java8html java多线程同时写一个文件 java高并发环境下多线程同时写入一个文件时, 经过 FileLoc ...
- java高并发秒杀活动的各种简单实现
最近遇到比较多数据不一致的问题,大多数都是因为并发请求时,没及时处理的原因,故用一个比较有代表性的业务场景[活动秒杀]来模拟一下这个这种高并发所产生的问题. 众所周知,电商系统的秒杀活动是高并发的很好 ...
- 当Golang遇到高并发秒杀
遇到go也是工作上的调整,工作上做架构相关的事情,对新发展比较火爆的语言肯定要关注下.就这样步入了GO语言的世界,GO给我带来了全新的体验: 一直做一件事情的人往往会被一件事情所困,开始实践GO语言的 ...
- JAVA秒杀mysql层实现_Java商城高并发秒杀系统架构分析设计与开发实战
课程大纲 1-1课程整体介绍.mp4 1-2核心技术列表.mp4 1-3课程要求与收益.mp4 1-4系统的整体演示.mp4 2-1微服务项目的搭建-SpringBoot搭建多模块项目一.mp4 2- ...
- SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...
- SpringBoot实现Java高并发秒杀系统之Service层开发(二)
继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...
最新文章
- python装饰设备_Python: 装饰器的小例子
- Tomcat的常用配置
- HTML5 中的canvas元素用于,HTML5中的Canvas元素
- oracle数据表管理
- Linux学习路径(小白必看)
- SAP成都研究院CEC团队三巨头之一:M君的文章预告
- anaconda和python区别_初学 Python 者自学 Anaconda 的正确姿势是什么?
- 持续集成部署Jenkins工作笔记0013---配置远程触发构建的TOKEN值
- 给Editplus去掉.bak文件
- 中值滤波器 ( Median Filter ) C++ 实现
- 我是如何高效录制出那么多高质量 gif 动图的呢?
- VPC中安装Windows Server 2008
- 计算机文字录入在线打字,汉字输入方法-在线打字吧-在线拼音五笔打字练习软件,中文录入打字软件...
- 通过 Bitmap Font Generator 生成 fnt 与 png 文件供 cocos2d-x 中 LabelBMFont 使用达到以图片表现数字
- badboy录制过程不能登录, 提示脚本错误详解
- 龙威ol服务器维护是什么意思,《龙威OL》六大职业定位介绍
- 专访盖国强李轶楠丨通过数据库服务能力评估背后的故事
- 服务器连接硬盘出错,IBM服务器硬盘常见问题与故障诊断
- 小米平板4能装Linux系统吗,终于迎来它!小米平板4进行重大更新
- python下雪的实例_javascript实现下雪效果【实例代码】
热门文章
- oracle linux telnet,linux如何开启telnet服务
- python随机选取列表中的一个字符串_如何从Python中的列表中选择随机字符串?
- 树莓派开发3-wiring库控制继电器和继电器组
- python 调用函数内部参数
- vmware ESXI6.7 设置 Nvidia 显卡直通
- ubuntu18.04.4 安装百度硬盘
- 六、线程的实现方式---多线程模型
- 分类算法-支持向量机(SVM)
- 【tensorflow】tf.nn.conv2d的使用
- matlab arr3(5 end),matlab复习笔记.doc