JSP中使用Spring注入的Bean时需要注意的地方
遇到问题
遇到一个问题:在JSP中,使用Spring注入的Bean对象时,未能正确地获取到想要的对象。
郁闷的是,它也没报错。
研究问题
使用DEBUG功能(好久不在JSP里写Java代码了,都忘了JSP也可以打断点调试),跟踪了一下代码,发现确实有了我想使用的类的实例,不过是个代理类。
想到反射、代理相关的知识,貌似知道问题在哪了。
赶紧试了一下,果然……
解决
在JSP里你要获得的Bean对象的类型,要定义成接口类,而不是实现类。
当然,这也视情况而定,我不确定,在JSP里使用Spring注入的Bean对象是不是都是代理类。
举个例子吧!
(注意,例子中的代码[伪代码]不一定正确,只是为了说明问题的一个类比)
首先定义在JSP中要用到的类。
两个,一个接口,一个实现类。
接口
package com.blabla;
interface IFoo {
String sayHello(String name);
}
实现类
package com.blabla;
public class FooImpl implements IFoo {
public String sayHello(String name) {
return "Hello " + name + " !!";
}
}
Spring,Bean的定义
省略……
使用Bean的JSP文件
<!-- 该引入的要引入 -->
<%@page import="org.springframework.web.context.WebApplicationContext" %>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils" %> <%@page import="com.blabla.IFoo" %> <!-- 下面开始使用JAVA -->
<%
//
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); /*
* 注意,这里不能使用实现类来定义对象,即:
* FooImpl fooObj = (FooImpl) ctx.getBean("beanFoo");
* 即使,你在Spring的Bean文件中定义的是这个实现类FooImpl,
* 但在接收时,需要使用 接口类 IFoo 来定义
*
* 为什么要这样??
* 去看看反射机制、代理机制吧
*
*/
IFoo fooObj = (IFoo) ctx.getBean("beanFoo"); String helloStr = fooObj.sayHello("Angle"); System.out.println(helloStr);
%>
JSP中使用Spring注入的Bean时需要注意的地方的更多相关文章
- 在Servlet中使用spring注入的bean
package abu.csdn.servlet; import java.io.IOException; import javax.servlet.ServletContext; ...
- jsp中获取spring 管理的bean(通过config)
WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...
- 如何在线程中获取spring 管理的bean
转载自:https://my.oschina.net/skyline520/blog/181158?fromerr=GjtR6Wec spring xml中定义 <!--spring 工具类-- ...
- 如何在servlet的监听器中使用spring容器的bean
另外补充下:在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对 ...
- 170630、springboot编程之普通类中调用spring管理的bean对象
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean
分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...
- jsf使用spring注入的bean
jsf的后台bean中使用spring定义的service,需要使用@ManagedProperty,并且要具有该属性的getter/setter方法. package cn.catr.lm.idc. ...
- Servlet中获取Spring管理的bean
描述: 在Servlet中调用Spring管理的接口,可以使Dao/Service/ServiceImpl. 前提是在调用的bean中有注解: @Repository("beanName&q ...
- 在Servlet中获取Spring注解的bean
最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...
随机推荐
- Git -- 工作区 和 暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...
- XP远程桌面连接2008提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证
原文链接:http://kong62.blog.163.com/blog/static/1760923052011319113044653/ 解决办法: 修改注册表2个地方 开始-运行-regedit ...
- Springmvc 的post请求的json格式参数
背景: 这两天在项目中遇到了一个问题.我的环境是springmvc4.1.9,写了几个可以用ajax请求的接口(ajax.jsonp 调用正常).突然一时兴起就用 HTTP 请求的工具(比如火狐浏览器 ...
- javascript对数据处理
数组去重 法一: // 遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 function unique(ar) { var ret = []; ...
- spark 非常好的学习内容
http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html
- EA修改生成代码的表头注释
我们在做项目的过程中,每个代码文件都应有此文件的注释,比如说作者,文件说明等.但是如果用EA生成的代码文件的注释是纯英文的,而且有些不是我们需要显示的注释,有些我们需要显示的它又不具备.那么我们就可以 ...
- C语言的基本数据类型长度
PS:以下内容是在Xcode的编辑器64位环境下的测试结果,网上有关于64位和32位各数据类型存在的差异,请自行online search. main.m #import <Foundation ...
- UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念
lienhua342014-10-05 1 main 函数是如何被调用的? 在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址.当内核执行 C ...
- 修改vs2005,vs2008,vs2010调试默认浏览器
前些日子不小心安装上了一个sogou的浏览器,感觉这个浏览器用起来也算方便,所以就么有卸载,一直就这么用着,但当我用vs来调试web程序的 时候问题出来了,默认的调试浏览器变成了搜狗的浏览器了,我在v ...
- 怎么使用ABBYY中的Bates编号
ABBYY PDF Transformer+ 可让您将 Bates 编号添加到 PDF 文档.Bates 编号可方便文档搜索和检索,并更加有利于电子归档.下面小编给小伙伴们讲讲ABBYY PDF Tr ...