需求

提供一个网页,根据导入的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;
}
}

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;
}
}

Servie层

总结

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

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

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

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

Spring 基于Session的创建实例的更多相关文章

  1. Spring IoC控制反转创建实例

    Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...

  2. Java进阶知识17 Spring Bean对象的创建细节和创建方式

    本文知识点(目录): 1.创建细节         1) 对象创建: 单例/多例         2) 什么时候创建?         3)是否延迟创建(懒加载)         4) 创建对象之后, ...

  3. Spring通过工厂创建实例的注意事项

    假设第三方(or别的team)提供一个工厂类(此类是不能够改动的.往往以jar包形式提供的),须要供给我们项目来使用. 可是我们自己的项目使用了spring来配置,所以我们当然希望可以通过spring ...

  4. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)

    使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...

  5. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  6. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)

    梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...

  7. spring-security-4 (3)spring security过滤器的创建与注册原理

    spring security是通过一个过滤器链来保护你的web应用安全.在spring security中,该过滤链的名称为springSecurityFilterChain,类型为FilterCh ...

  8. 你还不了解基于session的授权认证吗?

    前言 在漫长的开发过程中,权限认证是一个永恒不变的话题,随着技术的发展,从以前的基于sessionId的方式,变为如今的token方式.session常用于单体应用,后来由于微服务的兴起,分布式应用占 ...

  9. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

随机推荐

  1. 141. 环形链表 [JS Undefined类型的运用]

    [解析] 1.遍历每个节点 2.遍历过的节点用新的空间来标记 JS新的空间不用在使用前声明,用法参考实现. 3.如果遇到标记过的节点则是环形 [实现] /** * Definition for sin ...

  2. java动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  3. centos7 yum安装LAMP

    说明:我安装后的版本号分别是: apache : Apache/2.4.6 (CentOS)mysql:5.6.42php:5.6.39 一.配置网络. 我们首先需要让我们的虚拟机能够连接上外网,这样 ...

  4. day13_DOM

    一,document可以获得HTML页面全部内容, 1.①document.getElementById:获取全部id标签,②document.getElementById("i1" ...

  5. 报错!!!Servlet.service() for servlet [action] in context with path [/myssh] threw exception [java.lang.NullPointerException] with root cause java.lang.NullPointerException

    这个为什么报错啊~~ at com.hsp.basic.BasicService.executeQuery(BasicService.java:33) 这个对应的语句是   Query query = ...

  6. Linux——模拟实现一个简单的shell(带重定向)

    进程的相关知识是操作系统一个重要的模块.在理解进程概念同时,还需了解如何控制进程.对于进程控制,通常分成1.进程创建  (fork函数) 2.进程等待(wait系列) 3.进程替换(exec系列) 4 ...

  7. JDBC API 可滚动可编辑的结果集

    JDBC的API中的链接数据和创建statement并且执行读取ResultSet大家已经很熟悉了,这边介绍设置statement的属性使结果集可以移动并且进行编辑同步回数据库. Statement ...

  8. JavaScript开发者应懂的33个概念

    简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的.它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南. 本篇文章是参照 @leonardomso 创立,英文版项 ...

  9. Python 学习笔记5 变量-列表

    列表是python常用的一种变量. 是由一些列按照特定顺序排列的元素组成的.你可以创建包含字母表中的所有字母,数字.可以将任何东西都加入到列表中. 通常情况下,列表中都包含多个元素,所以建议变量的名称 ...

  10. go/wiki/MutexOrChannel Golang并发:选channel还是选锁?

    https://mp.weixin.qq.com/s/JcED2qgJEj8LaBckVZBhDA https://github.com/golang/go/wiki/MutexOrChannel M ...