chinaren_beijing 2011-05-30 15:55
浏览 112

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

在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条回答

    报告相同问题?

    悬赏问题

    • ¥15 matlab数字图像处理频率域滤波
    • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
    • ¥15 ELGamal和paillier计算效率谁快?
    • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
    • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
    • ¥15 Arcgis相交分析无法绘制一个或多个图形
    • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
    • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
    • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
    • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误