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;
}
}
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的创建实例的更多相关文章
- Spring IoC控制反转创建实例
Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- Spring通过工厂创建实例的注意事项
假设第三方(or别的team)提供一个工厂类(此类是不能够改动的.往往以jar包形式提供的),须要供给我们项目来使用. 可是我们自己的项目使用了spring来配置,所以我们当然希望可以通过spring ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)
使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)
梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...
- spring-security-4 (3)spring security过滤器的创建与注册原理
spring security是通过一个过滤器链来保护你的web应用安全.在spring security中,该过滤链的名称为springSecurityFilterChain,类型为FilterCh ...
- 你还不了解基于session的授权认证吗?
前言 在漫长的开发过程中,权限认证是一个永恒不变的话题,随着技术的发展,从以前的基于sessionId的方式,变为如今的token方式.session常用于单体应用,后来由于微服务的兴起,分布式应用占 ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
随机推荐
- javac编译后运行提示找不到或无法加载主类
第一种常见错误: package demo_01; public class hello { public static void main(String[] args) { System.out.p ...
- spark MLlib BasicStatistics 统计学基础
一, jar依赖,jsc创建. package ML.BasicStatistics; import com.google.common.collect.Lists; import org.apach ...
- NOIP2017 d1t2 时间复杂度
题目传送门:洛谷P3952 大模拟不解释 #include<iostream> #include<cstdio> #include<cmath> #include& ...
- CSS(八)
CSS3 transform变换 1.translate(x,y) 设置盒子位移2.scale(x,y) 设置盒子缩放3.rotate(deg) 设置盒子旋转4.skew(x-angle,y-angl ...
- MyBatis(三)MyBatis的增删改查
(1)接口中编写方法 public Emp getEmp(Integer id); public void addEmp(Emp emp); public void deleteEmp(Integer ...
- __x__(13)0906第三天__xhtml 的语法规范
html中不区分大小写,但是最好用小写. 注释不能嵌套. html标签必须结束,即 <></> 或者 < /> html标签不能交叉嵌套. html的标签,有 ...
- bootstrap_开始
bootstrap 一个移动设备优先 UI 库,底层是用 less 写的,依赖于 jQuery. 面试点: bootstrap 的所有盒子都是怪异盒子模型(box-sizing: border-box ...
- Go九九乘法表
package main import "fmt" func main(){ ; i < ; i ++ { k ++ ; j ++ { { fmt.Printf(" ...
- 2018-2019-1 20189210 《LInux内核原理与分析》第九周作业
进程的切换和系统的一般执行过程 (1)进程调度的时机 1.schedule是一个内核函数,不是一个系统调用,进程的调度只发生在内核中,进程调度函数schedule()只能在内核中被调用,用户进程无法调 ...
- Jmeter遇到打不开的问题
1.JDK的版本,一定版本的jmeter需要特定版本以上的JDK支持,比如此次运行的apache-jmeter-2.12,就需要JDK1.6以上的版本支持.我原来装的是JDK1.5,配置好JMETER ...