• Spring 基于Session的创建实例


    需求

    提供一个网页,根据导入的Excel数据计算结果。

    第一版本设计

    Controller层

    @RestController
    public class QuoteController {
        private static Logger logger = LoggerFactory.getLogger(QuoteController.class.getName());
        private String SESSION_KEY_QUOTE = "quote";
        private String SESSION_KEY_QUOTE_RESULT = "quote_result";
        @Autowired
        QuoteService quoteService;
    
        //报价数据导入
        @RequestMapping(value = "quote/import", method = RequestMethod.POST)
        public String quoteImport(MultipartFile file, Double ratio) {
            // 判断文件是否为空
            if(!file.isEmpty()){
                try {
                    List<QuoteItem> items = quoteService.upload(file);
                    List<QuoteCacResult> cacResult = quoteService.calculate(items, ratio);
    
                    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                    request.getSession().setAttribute(SESSION_KEY_QUOTE, items);
                    request.getSession().setAttribute(SESSION_KEY_QUOTE_RESULT, cacResult);
    
                } catch (Exception e) {
                    logger.error(e.getMessage());
                    return e.getMessage();
                }
            }
    
            return "success";
        }
    
        @RequestMapping(value = "quote/recalculate", method = RequestMethod.POST)
        public String recalculate(Double ratio){
            CommonResult<List<QuoteCacResult>> result = new CommonResult<>();
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    
            if (request.getSession().getAttribute(SESSION_KEY_QUOTE) != null){
                List<QuoteItem> items = (List<QuoteItem>)request.getSession().getAttribute(SESSION_KEY_QUOTE);
                List<QuoteCacResult> cacResult = quoteService.calculate(items, ratio);
                request.getSession().setAttribute(SESSION_KEY_QUOTE_RESULT, cacResult);
            }
    
            return "success";
        }
    
        @RequestMapping(value = "quote/result", method = RequestMethod.GET)
        public CommonResult<List<QuoteCacResult>> quoteCala(){
            CommonResult<List<QuoteCacResult>> result = new CommonResult<>();
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    
            if (request.getSession().getAttribute(SESSION_KEY_QUOTE_RESULT) == null) {
                result.setData(new ArrayList<>());
            }else {
                List<QuoteCacResult> data = (List<QuoteCacResult>)request.getSession().getAttribute(SESSION_KEY_QUOTE_RESULT);
                result.setData(data);
            }
    
            return result;
        }
    }
    View Code

     Service层

    存在的问题

    1,导入的数据通过参数返回给计算函数,没有对象数据的封装

    2,Controller存在大量关于Session存储、获取代码

    改进版本

     Controller层

    @RestController
    public class QuoteController {
        private static Logger logger = LoggerFactory.getLogger(QuoteController.class.getName());
        @Autowired
        private QuoteService quoteService;
    
        //报价数据导入
        @RequestMapping(value = "quote/import", method = RequestMethod.POST)
        public String quoteImport(MultipartFile file, Double ratio) {
            // 判断文件是否为空
            if(!file.isEmpty()){
                try {
                    quoteService.upload(file);
                    quoteService.calculate(ratio);
                } catch (Exception e) {
                    logger.error(e.getMessage());
                    return e.getMessage();
                }
            }
    
            return "success";
        }
    
        @RequestMapping(value = "quote/recalculate", method = RequestMethod.POST)
        public String recalculate(Double ratio){
            quoteService.calculate(ratio);
            return "success";
        }
    
        @RequestMapping(value = "quote/result", method = RequestMethod.GET)
        public CommonResult<List<QuoteCacResult>> quoteCala(){
            CommonResult<List<QuoteCacResult>> result = new CommonResult<>();
            result.setData(quoteService.getCalcResult());
            return result;
        }
    }
    View Code

     Servie层

    总结

    1, 改进版本更简洁,更面向对象

    2,注意calcResult必须声明封装get,set方法。否则proxy不起作用,参见

      https://stackoverflow.com/questions/39488124/how-to-use-session-scoped-component-in-controller

    3, 采用Spring Boot搭建的项目,无须配置RequestContextListener上面代码就能生效。

       

  • 相关阅读:
    Kingbase数据库中查询锁表以及解锁
    数据库事务隔离级别
    DB2数据库报错:com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=204, SQLSTATE=42704, SQLERRMC=DB2INSTL.USER, DRIVER=4.19.80
    MySQL数据库中查询锁表以及解锁
    Maven 项目报错SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
    uniapp微信小程序自动检测更新
    uniapp云开发实现微信小程序实现login并记录用户信息
    【转载】Eclipse完善代码自动补全功能(很好用)
    【杂项】+IT培训机构名录
    【Java】json排序/根据key排序/不限层级/字母排序
  • 原文地址:https://www.cnblogs.com/season2009/p/10245343.html
Copyright © 2020-2023  润新知