需求

提供一个网页,根据导入的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. C# 实现登录并跳转界面

    Program.cs文件添加如下内容 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(f ...

  2. spring boot 2.0 neo4j 使用

    参考文档 官方文档 http://spring.io/projects/spring-data-neo4j#learn https://docs.spring.io/spring-data/neo4j ...

  3. Eigen::Matrix与array数据转换

    1. 数组转化为Eigen::Matrix ]; cout << "colMajor matrix = \n" << Map<Matrix3i> ...

  4. .net core2.x - 关于工作单元(UnitOfWork) 模式

    概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...

  5. Python学习之MySQLdb模块

    摘要: MySQLdb模块用于操作mysql数据库.1.安装MySQLdb模块 yum install MySQL-python -y2.操作流程①.导入模块: import MySQLdb②.连接数 ...

  6. 在DOM加载之前insertScript

    起因 由于工作原因需要联调碧桂园的SDK 大概是以下代码,起初我是放在head中的,因为最初这样调试,包括线上环境都是OK的,可以获取到SDK的内容,换句话说js节点是可以插入到root内的,自从换了 ...

  7. java 图片裁剪

    图片裁剪功能,我一直以为是前端那边去做,后台不用做过多的考虑,现在我发现,前端去做裁剪好像不是太理想,我在这里简单地介绍一下我们大java的裁剪功能 前端只需要上传,x (x轴),y(y轴) , h( ...

  8. Java8新特性----Stream

    Stream Stream 是用函数式编程方式在集合类上进行复杂操作的工具. 一)常用的流操作 惰性求值方法:只描述Stream,最终不产生新集合的方法(返回的还是Stream). 及早求值方法:最终 ...

  9. ElasticSearch 6.4.3 启动报错: [Cannot assign requested address: bind]

    今天在本地搭建一个测试用的最新版ElasticSearch6.4.3 的环境时,遇到一个报: [Cannot assign requested address: bind]的错误. 错误日志内容如下: ...

  10. 嵌入式linux内存越界定位和解决 (转)

    https://blog.csdn.net/meejoy/article/details/41729585 https://blog.csdn.net/killmice/article/details ...