Java高并发秒杀Api-web 层

作者: markfork | 来源:发表于2018-05-06 09:57 被阅读43次

    章节目录

    • 前端交互设计
    • 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;
        }
    }
    

    相关文章

      网友评论

        本文标题:Java高并发秒杀Api-web 层

        本文链接:https://www.haomeiwen.com/subject/iwperftx.html