Java高并发秒杀Api-web 层
章节目录 前端交互设计 Restful Spring MVC理论 整合配置MVC框架 bootstrap+jquery 福利彩蛋 前端交互设计 前端交互设计 详情页流程逻辑 Restful接口 什么是Restful Restful 是接口设计规范 一种优雅的URI表达方式 资源的状态和状态转移 获取的是资源的状态,删除的时候,其实是更改资源的状态 put、post、delete Restful示例 image.png image.png 不同的请求方法代表着对资源的不同操作类型。操作类型应与资源的接下来发生的状态状态转移对应起来 GET 请求是幂等性的 URL设计 url设计 秒杀Api设计 Spring MVC理论 理论部分 围绕handler开发 image.png Spring mvc 的运行流程 image.png 解释: 用户请求->前端控制器->寻找对应处理请求的handler,默认为DefaultAnnotationHandlerMapping->DefaultAnnotationHandlerAdapter->寻找处理请求的Controller->请求生成ModelAndView至中央控制器->中央控制器将数据转发给InternalResourceViewResolver去解析->解析完成的数据及页面结构,组合后,被生成资源,返回给用户。 HTTP请求映射的原理 image.png 默认使用DefaultAnnotationHandlerMapping->handler方法 注解映射技巧 @RequestMapping 注解 (1) 支持标准标准的URL (2) Ant风格URL (3) 带{xxx}占位符的URL 注解映射技巧 请求方法细节处理 (1) 请求参数绑定 (2) 请求方式限制 (3) 请求转发与重定向 (4) 数据模型赋值 (5) 返回json数据 (6) cookie的访问 请求参数绑定、重定向与转发、model数据绑定 返回json数据 cookie 数据 整合配置Spring MVC配置文件 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <!-- 修改servlet版本为3.1 --> <!-- 配置DispatcherServlet--> <servlet> <servlet-name>seckill-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置SpringMVC需要加载的配置文件 Spring-dao.xml, spring-service.xml, spring-web.xml MyBatis -> Spring -> SpringMVC --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>seckill-dispatcher</servlet-name> <!-- 默认匹配所有的请求--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> Spring MVC 配置 spring-web.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置Spring MVC--> <!--1:开启Spring MVC注解模式--> <!--简化配置 (1):自动注册DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter url->handler 映射 (2):默认提供一系列功能、数据绑定、数字与日期format @NumberFormat @DateTimeFormat xml json 默认读写支持 --> <mvc:annotation-driven/> <!--servlet-mapping 映射路径 /--> <!--静态资源配置,默认servlet配置--> <!-- 1:加入对静态资源的处理:js、png 2:允许使用"/"作为映射 --> <mvc:default-servlet-handler/> <!--配置jsp 显示 view Resolver--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--扫描web相关的bean--> <context:component-scan base-package="org.seckill.web"/> </beans> **SecKillController ** package org.seckill.web; import org.seckill.domain.SecKill; import org.seckill.dto.Exposer; import org.seckill.dto.SecKillResult; import org.seckill.service.SecKillService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller @RequestMapping("/seckill") //url:/模块/资源/{id}/细分 public class SecKillController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private SecKillService secKillService; /** * 获取秒杀商品list * * @param model * @return */ @RequestMapping(value = "/list", method = RequestMethod.GET) public String list(Model model) { //1.获取列表页面 List<SecKill> secKillList = secKillService.getSecKillList(); model.addAttribute("list", secKillList); //2.返回页面并携带model 数据list.jsp + model = ModelAndView return "list"; } /** * 接收参数、参数验证、业务逻辑调用并处理 * 获取秒杀商品详情 * * @param model * @param secKillId * @return */ @RequestMapping(value = "/{secKillId}/detial", method = RequestMethod.GET) public String detial(Model model, @PathVariable("secKillId") Long secKillId) { if (secKillId == null) {//请求重定向到list页面 return "redirect:/seckill/list"; } SecKill secKill = secKillService.getSecKillById(secKillId); if (secKill == null) { return "forward:/seckill/list"; } model.addAttribute("seckill", secKill); return "detial"; } /** * ajax接口-返回类型 json * 获取秒杀曝露地址 * * @param secKillId */ @RequestMapping(value = "/{secKillId}/exposer", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}//告诉浏览器返回数据类型是json ) @ResponseBody public SecKillResult<Exposer> /*TODO*/ exposer(@PathVariable("secKillId") Long secKillId) { SecKillResult<Exposer> result; try { Exposer exposer = secKillService.exportSecKillUrl(secKillId);//返回秒杀地址 result = new SecKillResult<Exposer>(true, exposer); } catch (Exception e) { logger.error(e.getMessage()); result = new SecKillResult<Exposer>(false, e.getMessage()); } return result; } } 福利彩蛋 职位:腾讯OMG 广告后台高级开发工程师; Base:深圳; 场景:海量数据,To B,To C,场景极具挑战性。 基础要求: 熟悉常用数据结构与算法; 熟悉常用网络协议,熟悉网络编程; 熟悉操作系统,有线上排查问题经验; 熟悉MySQL,oracle; 熟悉JAVA,GoLang,c++其中一种语言均可; 可内推,欢迎各位优秀开发道友私信[微笑] 期待关注我的开发小哥哥,小姐姐们私信我,机会很好,平台对标抖音,广告生态平台,类似Facebook 广告平台,希望你们用简历砸我~ 联系方式 微信 13609184526