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的容器管理 ...
随机推荐
- 使用appledoc 生成技术API文档具体解释
一. 首先安装 appledoc 第一步:使用终端命令进行下载安装 git clone git://github.com/tomaz/appledoc.git cd ./appledoc sudo s ...
- CentOS7修改设置静态IP和DNS
当前位置: 主页 > CentOS入门 > 系统配置 > CentOS7修改设置静态IP和DNS 时间:2016-02-22 00:55来源:blog.csdn.net 作者:get ...
- Solaris10 修改hostname
修改/etc/nodename 及 /etc/hosts & /etc/hostname.<NIC Name> 这三个文件就可以了 重启
- 实现mysql按月统计的教程
From: http://www.jbxue.com/db/758.html 实现mysql按月统计的教程 mysql有个字段是DATETIME类型,要实现可以按月统计,该怎么写sql语句? se ...
- java多线程入门学习(一)
java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程. 线程:同一类线程共享代码 ...
- 在IE和Firefox中实现Flash透明背景
要在一个静态的背景上加一个透明的Flash会显示动态的效果,按照常规方式加了代码后,在IE中能显示透明背景Flash,但是用Firefox浏览器却发现没有透明的效果,那究竟应该怎么加呢?于是搜索和研究 ...
- SharePoint 2013 处理videoplayerpage.aspx下的个人图片显示有误问题
问题: Personal site's photo can't correct display in the videos page The url address of personal site' ...
- EF6 Code First & Auto Migration on Appharbor
之前不小心看到EF的code first在appharbor上进行migration的时候比较麻烦,今天碰巧也要更新数据库了,顺便试试. modify model public class SiteI ...
- spring原理机制
转自:http://blog.csdn.net/nrain2/article/details/45459311 1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spr ...
- Vim 操作符命令和动作命令
http://www.cnblogs.com/littlerabbit/articles/2349951.html