需求

提供一个网页,根据导入的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. 微信支付的安全漏洞之XXE

    1.场景:国外安全社区公布微信支付官方SDK存在严重漏洞,可导致商家服务器被入侵(绕过支付的效果).目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大(已确认陌陌.vivo因使用该SDK而存在该漏洞 ...

  2. 将Emacs Org任务树导出至Freeplane思维导图

    Emacs Org mode作为实施GTD方法的任务与项目管理工具是极为强大和有效的.尽管如此,我在使用过程中亦发现了一个因Emacs文本操作模式而难以解决的情况,即对于具有复杂结构与大量细节的项目, ...

  3. [原创]基于Zynq Linux环境搭建(四)

    此篇编译根文件系统 下载busybox和dropbear, [#73#13:04:52 FPGADeveloper@ubuntu ~/Zybo_Demo/XilinxFS]$wget --no-che ...

  4. Java List根据对象的某个属性合并list

    package com.test; import java.util.ArrayList; import java.util.List; public class FileTest { public ...

  5. Python3中的真值测试

    1. 真值测试 所谓真值测试,是指当一种类型对象出现在if或者while条件语句中时,对象值表现为True或者False.弄清楚各种情况下的真值对我们编写程序有重要的意义. 对于一个对象a,其真值定义 ...

  6. vue-cli按需加载,懒加载组件

    vue来做一个单页面应用,当我们的项目越来越大,组件越来越多的时候,首次启动项目户特别慢,就算做一个加载框,蒙层之类的,体验也不会好,这个时候就需要按需加载 1.什么叫按需加载 所谓按需加载,顾名思义 ...

  7. Codeforces 375B Maximum Submatrix 2 (DP)

    <题目链接> 题目大意:给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积. #include <bits/stdc++.h> using namespa ...

  8. Beta(0/7)

    组长重选议题 Beta阶段计划改进完善的功能 Beta阶段计划新增的功能 需要改进的团队分工 需要改进的工具流程 Beta冲刺的时间计划安排 组长重选议题 没人想当,所以没有换. Beta阶段计划改进 ...

  9. Linux安装nginx详细步骤

    安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 在/usr/local/下创建一个nginx的文件夹 ...

  10. Spring 依赖注入中 Field 注入的有害性

    大致分为:Field 注入.构造注入.setter 注入 其中 Field 注入被认为有害的: 1. 违反了单一原则 当一个 class 中有多个依赖时,如果仅仅使用 Field 注入,则看不出有很多 ...