请问一个Struts2的问题,我知道action的执行环境ActionContext里面的request和session等都是一个Map

而我在action中取得HttpServletRequest对象,然后设置name-value,然后在jsp页面中仍然可以通过ognl表达式#request.name从ActionContext中获取到value,我想问是不是ActionContext将HttpServletRequest里面的东西拷贝到ActionContext里面的request(Map)当中了,如果是的话,什么时候的事情呢,谢谢

3个回答

[b]
[quote]ActionContext将HttpServletRequest里面的东西拷贝到ActionContext里面的request(Map)当中了[/quote][/b]
[color=blue][b]
是这样的。[/b][/color]

[quote][b]我在action中取得HttpServletRequest对象,然后设置name-value[/b][/quote]
[color=blue]
[b]这种情况下,copy发生了2次:

1、从HttpServletRequet --> Action , 这样你的 HttpServletRequet中的参数,自动填充到 Action的属性。(前置处理)

2、从Action --> Result Page渲染时, 由于你在Action获取了HttpServletRequet 对象,所以,又发生了一次 copy。(后置处理。直接获取HttpServletRequet等对象,是Struts2不推荐的!)[/b][/color]
[b]
这些处理是由拦截器提供的:[/b]

[code="xml"] [/code]
[b]
PS: 最好不要直接使用HttpServletRequet等与Servlet规范相关的对象。[/b]

你的理解是正确的

这个是由struts2内置的拦截器来实现

[quote]是不是ActionContext将HttpServletRequest里面的东西拷贝到ActionContext里面的request(Map)当中了,如果是的话,什么时候的事情呢,谢谢 [/quote]

的确如此,下载个源码可以追一下,或看这篇文章:
http://www.blogjava.net/myyate/articles/Struts2_source_java.html

在上面的网页中寻找关键字: createContextMap

PS: 从源码看,把request拷贝到ActionContext里并不是在拦截器层上实现的。而是在调用拦截器之前就已经做完了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问