Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释
在做项目的时候,有一个需求是将数据库中的信息封装到实体类返回到jsp界面
传过来的参数只是实体类的id属性,然后根据id属性去查数据库,事情就是这样,然后
结果遇到很奇怪的事情,在jsp页面中使用EL表达式取值,除了id字段,其他都是NULL
先记录结论:
分为两种情况
一:方法参数use的引用值(假设地址:0x0011)在Controller层使用中未发生改变
那么在这个方法中默认有一个req.setAttribute("类名首字母小写",use);
注意:默认意思这边你写不写这个绑定在jsp页面都是可以取值的, 绑定值是这边的参数引用,绑定名是:类名首字母小写
二:DispatcherServlet分析方法创建一个0x0011的对象赋给use, 方法在调用service层或者持久层时,因为接受调用的返回值而将use的引用值改变(假设改变为0x0022),那么有以下的结果
根据反复测试:在DispatcherServlet中有默认的req.setAttribute("类名首字母小写",use);
注意这边很关键:这边绑定的use的地址是0x0011(我大胆猜测是在DispatcherServlet中绑定的)
根据spring框架执行流程分析知道:即使你再在controller中绑定"类名首字母小写",这样的绑定名,也会到DispatcherServlet中被覆盖掉
我不知道讲的清不清晰,大家随便提问,笔者会用耐心去解释这样的结果,其次,如果有大牛能看懂spring源码给我点提示,就更好不过了
表现层中主要代码(其中lis是已经注入的Service)
@RequestMapping("/loginIn.do")
public String loginIn(User use, HttpServletRequest req) {
System.out.println(use);
System.out.println("userName:" + use.getUserName());
System.out.println("paddword:" + use.getPassword());
use = lis.toLoginIn(use);
System.out.println(use);
return "success";
}
Service层中主要代码
@Service("loginInService")
public class LoginInServiceImpl implements LoginInService {
@Resource(name="loginInDAO")
private LoginInDAO lid;
@Override
public User toLoginIn(User user) {
user = lid.loginIn(user);
return user;
}
}
持久层主要代码
@Repository("loginInDAO")
public class LoginInDAOImpl implements LoginInDAO {
@Override
public User loginIn(User user) {
user.setPassword("持久层");
return user;
}
}
实体类主要字段(get/set省)
public class User implements Serializable{
private static final long serialVersionUID = -5298720181994382985L;
private String userName;
private String password;
Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释的更多相关文章
- (转)淘淘商城系列——SSM框架整合之表现层整合
http://blog.csdn.net/yerenyuan_pku/article/details/72721120 上文我们一起学习了Service层的整合,本文将教大家如何整合表现层. 我们在t ...
- JSF Web框架与Facelets表现层技术
JSF(JavaServer Faces) JSF应用程序的生命周期从客户端对页面发出HTTP请求时开始,并在服务器响应页面时结束.JSF生命周期分为运行阶段和渲染阶段两个主要阶段. 执行阶段 当第一 ...
- Spring框架详解介绍-基本使用方法
1.Spring框架-控制反转(IOC) 2.Spring框架-面向切面编程(AOP) 3.Spring 内置的JdbcTemplate(Spring-JDBC) Spring框架-控制反转(IOC) ...
- Spring框架:Controller和RestController区别
了解如何利用SpringMVC的注释创建RESTful Web服务. Spring的基于注释的MVC框架简化了创建RESTful Web服务的过程.传统的Spring MVC控制器和RESTful W ...
- 学习Spring框架等技术的方向、方法和动机
学习Spring框架最早学习Spring框架是在大二的时候,当时看了几本书,看了一些视频,主要是传智播客的.更多的,还是写代码,单独写Spring的,也有与Struts和Hibernate等框架整合的 ...
- Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)
通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...
- 学习spring第6天(aop获取目标方法参数)
关于<aop:around>中的方法,需要第一个参数为ProceedJoinPoint,在方法体中通过该参数调用proceed()才能使目标方法得到调用. 当一个切面中有多个<aop ...
- Spring MVC-学习笔记(2)DispatcherServlet、@Controller、@RequestMapping、处理方法参数类型、可返回类型、Model、ModelMap、ModelAndView
1.前端控制器org.springframework.web.servlet.DispatcherServlet 所有的请求驱动都围绕这个DispatcherServlet来分派请求.springMV ...
- SSH实战 · 用spring框架下的hibernatetemplate的get方法出现的问题
用get方法查询: return this.getHibernateTemplate().get(Product.class, pid); 出现错误为:id to load is requi ...
随机推荐
- css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)
1.前言 之前做的好几个项目中,都会遇到打分,评分,点赞这样的需求,写了很多次,每次需要再写的时候,就会翻出之前写过的代码,然后copy过来.总觉得这样的话没有进步,没有把知识放进脑袋里,所以,自己花 ...
- echarts_部分图表配置_堆叠折线图
echarts基本图表使用: 1.获取包裹元素(var myChart = echarts.init(document.getElementById('thisId'));)2.设置option(op ...
- 解决删除元素动画的bug
效果说明 首先说明一下我需要做到的效果 其实很简单---点击删除按钮的时候,加入删除动画 删除动画是这样的,高度和宽度都会均匀的变小,内部的元素需要被隐藏(因为会有文字挤在一起):直到变为0结束,时长 ...
- This Adroid SDK r…
有时候开启eclipse时会出现如下提示框: This Adroid SDK requires Android Developer
- 51. leetcode 530. Minimum Absolute Difference in BST
530. Minimum Absolute Difference in BST Given a binary search tree with non-negative values, find th ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- centos7下nginx安装
http://www.linuxidc.com/Linux/2016-09/134907.htm 安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Window ...
- react入门之使用react-bootstrap当轮子造车(二)
react入门之使用react-bootstrap当轮子造车(二) 上一篇我们谈了谈如何配置react的webpack环境 react入门之搭配环境(一) 可能很多人已经打开过官方文档学习了react ...
- Linux - 简明Shell编程10 - 管道(Pipe)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo '##### Num ...
- oracle数据库与实例
========================================================================================== oracle数据库 ...