zoukankan      html  css  js  c++  java
  • 秒杀系统-web

     秒杀系统Web层主要涉及前端交互设计、Restful:url满足Restful设计规范、Spring MVC、bootstrap+jquery这四个方面的开发。秒杀系统的前端交互流程设计如下图6-3所示。

    整合配置Spring MVC框架:
    在web.xml中进行我们前端控制器DispatcherServlet的配置,配置springMVC需要加载的配置文件spring-dao.xml,spring-service.xml和spring-web.xml,详细配置如下。
    web.xml:
    <servlet>
        <servlet-name>seckill-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
             <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>
    spring-web.xml:
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
        <mvc:annotation-driven/>
        <mvc:default-servlet-handler/>
        <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>
        <context:component-scan base-package="org.seckill.web"/>
    </beans>
    完成Spring MVC的相关配置后,接下来就要基于Restful接口实现项目中的Controller开发。Controller中的每一个方法都对应我们系统中的一个资源URL,其设计应该遵循Restful接口的设计风格。在web包下创建一个SeckillController.java,内容如表6-11所示。

    SeckillController.java:
    @Controller
    @RequestMapping("/seckill")
    public class SeckillController {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
        @Autowired
        private SeckillService seckillService;
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public String list(Model model) {
            List<Seckill> list = seckillService.getSeckillList();
            model.addAttribute("list", list);
            //list.jsp + model = ModelAndView
            return "list";
        }
        @RequestMapping(value = "/{seckillId}/detail", method = RequestMethod.GET)
        public String detail(@PathVariable("seckillId") Long seckillId, Model model) {
            if (seckillId == null) {
                return "redirect:/seckill/list";
            }
            Seckill seckill = seckillService.getById(seckillId);
            if (seckill == null) {
                return "forward:/seckill/list";
            }
            model.addAttribute("seckill", seckill);
            return "detail";
        }
        @RequestMapping(value = "/{seckillId}/exposer",
                method = RequestMethod.POST,
                produces = {"application/json;charset=UTF-8"})
        @ResponseBody
        public SeckillResult<Exposer> exposer(@PathVariable Long seckillId) {
            SeckillResult<Exposer> result;
            try {
                Exposer exposer = seckillService.exportSeckillUrl(seckillId);
                result = new SeckillResult<Exposer>(true, exposer);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                result = new SeckillResult<Exposer>(false, e.getMessage());
            }
            return result;
        }
        @RequestMapping(value = "/{seckillId}/{md5}/execution",
                method = RequestMethod.POST,
                produces = {"application/json;charset=UTF-8"})
        @ResponseBody
        public SeckillResult<SeckillExecution> execute(@PathVariable("seckillId") Long seckillId,
        @PathVariable("md5") String md5,
        @CookieValue(value = "killPhone", required = false) Long phone) {
            //springmvc valid
            if (phone == null) {
                return new SeckillResult<SeckillExecution>(false, "未注册");
            }
            SeckillResult<SeckillExecution> result;
            try {
                SeckillExecution execution = seckillService.executeSeckillProcedure(seckillId, phone, md5);
                return new SeckillResult<SeckillExecution>(true,execution);
            } catch (RepeatKillException e) {
                SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.REPEAT_KILL);
                return new SeckillResult<SeckillExecution>(true,execution);
            } catch (SeckillCloseException e) {
               SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.END);
                return new SeckillResult<SeckillExecution>(true,execution);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.INNER_ERROR);
                return new SeckillResult<SeckillExecution>(true,execution);
            }
        }
        @RequestMapping(value = "/time/now",method = RequestMethod.GET)
        @ResponseBody
        public SeckillResult<Long> time(){
            Date now = new Date();
            return new SeckillResult(true,now.getTime());
        }
    }
    json数据的一个Vo类,即SeckillResult.java,在dto包中创建它,内容如下。
    SeckillResult.java:
    public class SeckillResult<T> {
        private boolean success;
        private T data;
        private String error;
        public SeckillResult(boolean success, T data) {
            this.success = success;
            this.data = data;
        }
        public SeckillResult(boolean success, String error) {
            this.success = success;
            this.error = error;
        }
        public boolean isSuccess() {
            return success;
        }
        public void setSuccess(boolean success) {
            this.success = success;
        }
        public T getData() {
            return data;
        }
        public void setData(T data) {
            this.data = data;
        }
        public String getError() {
            return error;
        }
        public void setError(String error) {
            this.error = error;
        }
    }
  • 相关阅读:
    百家号开发文档测试
    python使用selenium模拟登录网易
    python使用selenium模拟操作Chrome浏览器
    java 解析网易邮箱里面的附件地址,获取下载地址
    python连接hive
    linux重定向标准输入输出,标准错误
    linux 查看网络流量命令
    kafka源码阅读环境搭建
    tomcat启动index页面显示不出来
    git学习笔记
  • 原文地址:https://www.cnblogs.com/smuxiaolei/p/8979768.html
Copyright © 2011-2022 走看看