首页 > 代码库 > JSP中使用Spring注入的Bean时需要注意的地方
JSP中使用Spring注入的Bean时需要注意的地方
遇到问题
遇到一个问题:在JSP中,使用Spring注入的Bean对象时,未能正确地获取到想要的对象。
郁闷的是,它也没报错。
研究问题
使用DEBUG功能(好久不在JSP里写Java代码了,都忘了JSP也可以打断点调试),跟踪了一下代码,发现确实有了我想使用的类的实例,不过是个代理类。
想到反射、代理相关的知识,貌似知道问题在哪了。
赶紧试了一下,果然……
解决
在JSP里你要获得的Bean对象的类型,要定义成接口类,而不是实现类。
当然,这也视情况而定,我不确定,在JSP里使用Spring注入的Bean对象是不是都是代理类。
举个例子吧!
(注意,例子中的代码[伪代码]不一定正确,只是为了说明问题的一个类比)
首先定义在JSP中要用到的类。
两个,一个接口,一个实现类。
接口
1 package com.blabla;2 3 interface IFoo {4 5 String sayHello(String name);6 }
实现类
1 package com.blabla;2 3 public class FooImpl implements IFoo {4 5 public String sayHello(String name) {6 7 return "Hello " + name + " !!";8 }9 }
Spring,Bean的定义
省略……
使用Bean的JSP文件
1 <!-- 该引入的要引入 --> 2 <%@page import="org.springframework.web.context.WebApplicationContext" %> 3 <%@page import="org.springframework.web.context.support.WebApplicationContextUtils" %> 4 5 <%@page import="com.blabla.IFoo" %> 6 7 <!-- 下面开始使用JAVA --> 8 <% 9 // 10 WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());11 12 /*13 * 注意,这里不能使用实现类来定义对象,即:14 * FooImpl fooObj = (FooImpl) ctx.getBean("beanFoo");15 * 即使,你在Spring的Bean文件中定义的是这个实现类FooImpl,16 * 但在接收时,需要使用 接口类 IFoo 来定义17 *18 * 为什么要这样??19 * 去看看反射机制、代理机制吧20 *21 */22 IFoo fooObj = (IFoo) ctx.getBean("beanFoo");23 24 String helloStr = fooObj.sayHello("Angle");25 26 System.out.println(helloStr);27 %>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。