第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层相关推荐

  1. java 秒杀 源码 下载_java高并发秒杀系统3-4节秒杀功能实现.mp4

    本Java商城秒杀系统视频教程目录如下:    java高并发秒杀系统1-1节java高并发商城秒杀优化学习指引.mp4 java高并发秒杀系统1-2节项目环境搭建(Eclipse)-节.mp4 ja ...

  2. java商品详情页设计_java高并发秒杀系统3-2节商品详情页上.mp4

    本Java商城秒杀系统视频教程目录如下:    java高并发秒杀系统1-1节java高并发商城秒杀优化学习指引.mp4 java高并发秒杀系统1-2节项目环境搭建(Eclipse)-节.mp4 ja ...

  3. java service层 事务_Java高并发秒时啊API之Service层1

    ---2-1 使用Spring托管Service依赖理论---------------------------- spring ioc优势(工厂模式): 1.对象创建统一托管 2.规范的生命周期管理 ...

  4. java 多进程写一个文件_java高并发多线程及多进程同时写入文件研究

    测试&思考: 环境:windows 七.linux centos 6.三.java8html java多线程同时写一个文件 java高并发环境下多线程同时写入一个文件时, 经过 FileLoc ...

  5. java高并发秒杀活动的各种简单实现

    最近遇到比较多数据不一致的问题,大多数都是因为并发请求时,没及时处理的原因,故用一个比较有代表性的业务场景[活动秒杀]来模拟一下这个这种高并发所产生的问题. 众所周知,电商系统的秒杀活动是高并发的很好 ...

  6. 当Golang遇到高并发秒杀

    遇到go也是工作上的调整,工作上做架构相关的事情,对新发展比较火爆的语言肯定要关注下.就这样步入了GO语言的世界,GO给我带来了全新的体验: 一直做一件事情的人往往会被一件事情所困,开始实践GO语言的 ...

  7. JAVA秒杀mysql层实现_Java商城高并发秒杀系统架构分析设计与开发实战

    课程大纲 1-1课程整体介绍.mp4 1-2核心技术列表.mp4 1-3课程要求与收益.mp4 1-4系统的整体演示.mp4 2-1微服务项目的搭建-SpringBoot搭建多模块项目一.mp4 2- ...

  8. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  9. SpringBoot实现Java高并发秒杀系统之Service层开发(二)

    继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...

最新文章

  1. python装饰设备_Python: 装饰器的小例子
  2. Tomcat的常用配置
  3. HTML5 中的canvas元素用于,HTML5中的Canvas元素
  4. oracle数据表管理
  5. Linux学习路径(小白必看)
  6. SAP成都研究院CEC团队三巨头之一:M君的文章预告
  7. anaconda和python区别_初学 Python 者自学 Anaconda 的正确姿势是什么?
  8. 持续集成部署Jenkins工作笔记0013---配置远程触发构建的TOKEN值
  9. 给Editplus去掉.bak文件
  10. 中值滤波器 ( Median Filter ) C++ 实现
  11. 我是如何高效录制出那么多高质量 gif 动图的呢?
  12. VPC中安装Windows Server 2008
  13. 计算机文字录入在线打字,汉字输入方法-在线打字吧-在线拼音五笔打字练习软件,中文录入打字软件...
  14. 通过 Bitmap Font Generator 生成 fnt 与 png 文件供 cocos2d-x 中 LabelBMFont 使用达到以图片表现数字
  15. badboy录制过程不能登录, 提示脚本错误详解
  16. 龙威ol服务器维护是什么意思,《龙威OL》六大职业定位介绍
  17. 专访盖国强李轶楠丨通过数据库服务能力评估背后的故事
  18. 服务器连接硬盘出错,IBM服务器硬盘常见问题与故障诊断
  19. 小米平板4能装Linux系统吗,终于迎来它!小米平板4进行重大更新
  20. python下雪的实例_javascript实现下雪效果【实例代码】

热门文章

  1. oracle linux telnet,linux如何开启telnet服务
  2. python随机选取列表中的一个字符串_如何从Python中的列表中选择随机字符串?
  3. 树莓派开发3-wiring库控制继电器和继电器组
  4. python 调用函数内部参数
  5. vmware ESXI6.7 设置 Nvidia 显卡直通
  6. ubuntu18.04.4 安装百度硬盘
  7. 六、线程的实现方式---多线程模型
  8. 分类算法-支持向量机(SVM)
  9. 【tensorflow】tf.nn.conv2d的使用
  10. matlab arr3(5 end),matlab复习笔记.doc