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 %>

 

 

 

JSP中使用Spring注入的Bean时需要注意的地方,布布扣,bubuko.com

JSP中使用Spring注入的Bean时需要注意的地方

上一篇:allpaths 使用


下一篇:2336: [HNOI2011]任务调度 - BZOJ