遇到问题
遇到一个问题:在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 %>