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的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
随机推荐
- 剑指offer字符串1
面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...
- php无限极分类方法
仅供参考: //控制器 $data = M('category')->select(); $datas = D('Category')->_getTree($data, 0,0,TRUE) ...
- IDEA 使用笔记
IDEA 关闭默认打开上一个项目 File | Settings | Appearance & Behavior | System Settings=> Reopen last proj ...
- PHP AES的加密解密-----【弃用】
mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...
- zabbix4.0构建实录
[Nginx] #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@centos ...
- css_base_note
- Boredom
Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winte ...
- poj1106-Post Office(DP)
Description There is a straight highway with villages alongside the highway. The highway is represen ...
- PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度—Jason niu
x = 1:0.01:2; y = sin(10*pi*x) ./ x; figure plot(x, y) title('绘制目标函数曲线图—Jason niu'); hold on c1 = 1. ...
- Anaconda3 tensorflow安装 及ModuleNotFoundError: No module named 'tensorflow' 解答
Anaconda3 的安装,参考:手把手教你如何安装Tensorflow(Windows和Linux两种版本) tensorflow的安装,参考:深度学习(TensorFlow)环境搭建:(三)Ubu ...