chinaren_beijing
chinaren_beijing
2011-05-30 15:55

spring 如何给struts2的action设置request对象的?详情见全文

  • spring

在ioc环境里,在一个UserAction 要获得 request对象,可以这么实现:
让UserAction 实现ServletRequestAware接口,然后在UserAction里面写下面这个方法:
public HttpServletRequest request;//定义request属性
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
就这样可以正确使用request。
然而我的问题是什么呢? 是spring是如何给这个request赋值的? 我想知道spring内部是如何实现的?
实现这个接口后,spring 是如何给他赋值的?
请高手解释?
我的理解 是spring用了动态代理实现的,不知道对不对?
问题补充

java_bigniu 写道
HttpServletRequest request = ServletActionContext.getRequest();

我想知道,spring在哪里给他赋值的?我想知道spring内部的代码,哪块处理的?原理是什么?
你的这个方式是在非ioc的方式下获得request对象的
问题补充
其实我的意思,想明白咱们实现spring的这个接口后,spring内部是如何处理这个的? 为什么我实现这个接口后,
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
这个方法的参数HttpServletRequest request 是从哪儿传来的?
request 是怎么生成的?
问题补充
kjj 写道
晕,这有啥难的,你忘了,spring的容器是怎么初始化的么,web就是webapplicationcontext,所以,每次请求这个对象的时候,把当前线程的requet注入了

呵呵,我知道不难,我就明白,spring内部是如何实现的?在哪个类里面注入的?我看了源代码,没找到在哪儿注入啊?是动态代理实现的。

还有,这个问题不仅仅在spring里面有,在jdk里面也很普遍啊,比如让你实现某个接口,就能得到某个功能。他内部肯定是用动态代理实现的,特别是这个接口有参数的时候,这个参数就是动态代理传进来的。基于接口的就是动态代理才能实现。


问题补充
kjj 写道
晕,这有啥难的,你忘了,spring的容器是怎么初始化的么,web就是webapplicationcontext,所以,每次请求这个对象的时候,把当前线程的requet注入了


你的意思是 有个监听器:org.springframework.web.context.request.RequestContextListener
这个监听到后,会注入?
问题补充
Aaronlong31 写道
这个和spring有什么关系吗?是struts2的拦截器处理的,在struts2的默认拦截器栈中有个ServletConfigInterceptor,它会判断你是否实现了ServletRequestAware接口,如果实现了,它就帮你注入HttpServletRequest对象,这样的Aware接口还有很多,如SessionAware等。


那他的注入也是通过spring的ioc注入的,怎么没关呢?
在ioc下是实现接口可以获得request,非ioc下直接获得就行了,不用实现接口的。
问题补充
rentianchou 写道
么人所让你非得实现接口啊

嗨,标题讨论就是讨论ioc下面的情况,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
总之感谢大家一起交流了。
问题补充
池中物 写道
这个跟spring没关系,是struts做的

明白,呵呵。拦截器的原理也是动态代理实现的,我说的没错。
问题补充
ok 明白了
问题补充
不是的,但是动态代理用的很多,aop 拦截器 filter 都是动态代理
问题补充
究其本质还是 动态代理,就是struts2的这个拦截器ServletConfigInterceptor,本质也是动态代理实现的,我说的有错吗?和动态代理能脱离关系吗?
问题补充
不是我和动态代理脱不了关系,是他们的原理实现就是这样的,我是这么理解的。
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答