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 ...
随机推荐
- wordpress设置“固定链接”后,页面404错误的解决方法
Nginx 解决方案: 网上盛传的方法是: 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.htm ...
- Java 编程 订单、支付、退款、发货、退货等编号主动生成类
订单.支付.退款.发货.退货等编号主动生成类 在商城网站中,订单编号的自动生成,ERP中各个单据的编号自动生成,都可以按照一下的方式来自动生成. 第一步:定义常量订单编号前缀.订单编号起始数.订单编号 ...
- KNN算法--python实现
邻近算法 或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
- Python用Pillow(PIL)进行简单的图像操作
Python用Pillow(PIL)进行简单的图像操作 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为 ...
- LAP+mysql-主从+redis
Redis是一个开源的,内存中的数据结构存储系统,他可以用作数据库,缓存和消息中间介.支持多种类型数据库结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有 ...
- Selenium实现的技巧
截图功能: try { File srcFile = ((TakesScreenshot)dr).getScreenshotAs(OutputType.FILE); ...
- Linux - 简明Shell编程11 - 调用脚本(CallTheScript)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 主脚本: CallTheScript.sh #!/bi ...
- mongodb相关 (population)
记录Mongodb的populate Mongodb是文档型数据库,不存在像关系型数据库一样的外键设置,但通过Mongodb中的populate函数可以模拟关系型数据库的外键连接后的查询功能. 文档型 ...
- js的call,apply,bind的使用与区别
在原生js中会有三个很常见的函数,call,apply,bind 他们的作用就是改变当前函数的this指针, 但是细微来说他们还是有不同的. 1)call,apply都是执行某一函数,发现this有变 ...
- Ubuntu 如何安装Google Chrome浏览器
1.上Chrome 官网下载http://www.google.cn/chrome/browser/desktop/ 2.保存下载文件到Home路径下(个人习惯) 3.按Ctrl+Alt +T 调出终 ...