SpringBoot实现Java高并发秒杀系统之Web层开发(三)
SpringBoot实现Java高并发秒杀系统之Web层开发(三)
接着上一篇文章:SpringBoot实现Java高并发之Service层开发,今天我们开始讲SpringBoot实现Java高并发秒杀系统之Web层开发。
Web层即Controller层,当然我们所说的都是在基于Spring框架的系统上而言的,传统的SSH项目中,与页面进行交互的是struts框架,但struts框架很繁琐,后来就被SpringMVC给顶替了,SpringMVC框架在与页面的交互上提供了更加便捷的方式,MVC的设计模式也是当前非常流行的一种设计模式。这次我们针对秒杀系统讲解一下秒杀系统需要和页面交互的操作和数据都涉及哪些?
本项目的源码请参看:springboot-seckill 如果觉得不错可以star一下哦(#^.^#)
本项目一共分为四个模块来讲解,具体的开发教程请看我的博客文章:
-
SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
-
SpringBoot实现Java高并发秒杀系统之Service层开发(二)
-
SpringBoot实现Java高并发秒杀系统之Web层开发(三)
-
SpringBoot实现Java高并发秒杀系统之并发优化(四)
首先如果你对SpringBoot项目还是不清楚的话,我依然推荐你看一下我的这个项目:优雅的入门SpringBoot2.x,整合Mybatis实现CRUD
前端交互流程设计
编写Controller就是要搞清楚:1.页面需要什么数据?2.页面将返回给Controller什么数据?3.Controller应该返回给页面什么数据?
带着这些问题我们看一下秒杀详情页流程逻辑(不再讲基本的findById
和findAll()
方法):
因为整个秒杀系统中最核心的业务就是:1.减库存;2.查询订单明细。我们看一下Controller层的源码:
@Controller |
下面我以问答的形式讲解一下Controller层方法的定义:
1.
@ResponseBody
和@RestController
注解分别有什么作用?
-
@ResponseBody
注解标识的方法,Spring会将此方法return的数据转换成JSON格式且不会被Spring视图解析器所扫描到,也就是此方法永不可能返回一个视图页面。且这个注解只能用在方法体上,不能用在类上。 -
@RestController
注解标识的类,Spring会将其下的所有方法return的数据都转换成JSON格式且不会被Spring视图解析器扫描到,也就是此类下面的所有方法都不可能返回一个视图页面。且这个注解只能用在类上,不能用在方法体上。
2.
@RequestMapping
中{xx}
的语法是什么?@PathVariable
注解的用处是什么?
Spring框架很早就支持开发REST资源。也是就是现在我们定义的RESTful URL,在Spring框架上支持的尤为完美,我们可以在Controller中定义这样一个URL映射地址:/{id}/detail
,他是合理的RESTful URL定义方式。
这种URL的特点:URL地址由动态的数据拼接组成的,而不是将所有的资源全部映射到一个路径下,比如:/article/detail
。
这种URL结构的优势:我们能很容易从URL地址上判断出该地址所展示的页面是什么?比如:/1/detail
就可能表示ID为1的文章的详情页,看起来设计的很清晰。
这种URL如何进行交互:我们定义了/{id}/detail
这样一个URL映射地址,其对应的映射方法上就应该添加@PathVariable
注解标识,如:@PathVariable("id") Long id
Spring就能装配前端传递的URL中指定位置的数据并赋值给id
这个参数。比如前端调用后端接口:localhost:8080/seckill/1/detail
,后端存在一个映射方法:@RequestMapping("/{id}/detail")
,这样就能刚好匹配上这个URL映射地址。
所以我们看一下秒杀系统的RESTful URL设计:
3.为什么要单独写一个接口用来获取当前系统时间?
由于我们开发的系统肯定不是给自己用的,我们的用户可能处于不同的时区,他们的当前系统时间也是不同的,所以我们写一个通用的时间规范:就是当前服务器的时间。
4.SeckillResult是什么?
在前面我们将Service层系统开发的时候就手动创建了很多类来封装一些通用的结果信息。而对于Controller层也会返回很多结果数据,比如传入的URL中id值为null,那么就没必要继续向下请求,而是直接给页面返回false信息。
于是我们创建:SeckillResult.java
public class SeckillResult<T> { |
泛型T
表示可以代表不同类型的对象。这是泛型类应用很广泛的一个特性,我们调用SeckillResult类,将其中的T用什么替换那么T就表示这个替换的对象类型。
页面设计
用了哪些技术?
- HTML页面,用Bootstrap绘制。
- Thymeleaf模板引擎渲染HTML页面,使得HTML页面拥有类似JSP页面一样功能。
- JS方面使用原生的JQuery。
我们来看一下前端的页面设计:
本项目使用Cookie存储用户手机号的方式模拟用户登录功能,实际上没有与后端交互的操作。如果用户没有登录就打开了商品详情页会直接弹出一个手机号登录框提醒用户登录,且没有登录时无法关闭登录框的。
具体的源码请看:GitHub
思考
在从JSP页面转换到HTML页面的时候我常会遇到这么一个问题:前端如何取出来后端查询到的数据?
在之前我们写的JSP页面中,可以通过将后端查询到的数据放进request,session域对象中,JSP页面可以直接调用Java中域对象的数据,甚至可以通过EL表达式(${}
)来直接获取参数,但是这种方法有一个弊端:Controller必须是返回一个视图,这样才能在此视图中获取存进域对象中的数据。
而我们现在都开始用HTML页面,也无法从域对象中取出数据该怎么办呢?我这里提供两个思路:
-
1.像本项目中一样,前端使用Thymeleaf模板引擎渲染页面,那么Thymeleaf内置很多方法如同JSP页面的EL表达式。Thymeleaf在HTML中取出域对象数据使用:
<span th:text="${xx}">
;在JS中取出域对象数据:var v = [[${xx}]]
(当然都必须是在HTML页面中,在外部JS文件中是得不到数据的)。 -
2.使用原生js提供的
location
对象,我们先看一下URL的组成结构:
详细介绍请看:博文
举个栗子
function QueryUrl(name){ |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
spring + groovy 实现动态代码注入执行
昨天线上的代码调用一个远程的服务无缘无故不成功,又没加那么多日志,不好定位问题,好想在线上执行一下代码,打印点log看看于是想着怎么动态执行点java代码,忽然想起以前玩过的groovy,于是搞起来 大概思路是这样,写一个控制器,接收一段代码,动态执行,然后返回执行结果,切记,做好权限控制,免得杯具 没想到实现起来异常简单 1、gradle.build加入groovy依赖 compile "org.codehaus.groovy:groovy:2.5.3" 2、写个工具类,方便拿到spring上下文对象,这个很常见 import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringContextUtils implements ApplicationContextAware { static...
- 下一篇
在 Eclipse 中部署 Spring Boot / Spring Cloud 应用到阿里云
Spring Cloud 和 Spring Boot 可以说是当前最流行的微服务开发框架了,在本文中,将向读者介绍如何在 在 Eclipse 中部署 Spring Boot / Spring Cloud 应用到阿里云。 本地开发 无论是编写云端运行的,还是编写本地运行的 Spring Boot 应用程序,代码编写本身并没有特别大的变化,因此本文采用一个极其基础的样例《在 Web 页面打印 HelloWorld 的 Spring Boot 》为例,通过启动内置的 Tomcat 容器,处理 HTTP 请求,在 Web 页面上打印一串“Hello World”的文案。 内嵌的 Tomcat 监听来自根目录的请求 package com.aliyun.toolkit.demo; import org.springframework.web.bi
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装