我们知道,struts2获取request的方法有两种,一种是通过ServerletActionContext.getRequest方法来获取,另一种是继续接口ServletResponseAware。
先来讨论第一种:是通过ServerletActionContext.getRequest方法来获取
1.首先ServerletActioncontext继承ActionContext,有一个getRequest的静态方法。2.在ServerletActioncontext的静态方法getRequest中调用ActionContext的静态方法getContext然后再get(get(HTTP_REQUEST)),getContext会返回当前线程的ActionContext对象。3.ActionContext类里有一个Map,Map里保存了java容器传输过来的request,response等4.第2完成后,ActionContext.getContext().get(HTTP_REQUEST)中的get(HTTP_REQUEST)会去调用ActionContext(这个ActionContext已经是当前的ActionContext)的getMap方法,最终把request对象获取出来。第二种我就不明白了,只是简单的继承ServletResponseAware接口,接口里只定义了一个方法
public void setServletResponse(HttpServletResponse response);然后在bean里对接口进行实现,这样我就不明白了,为什么只要继承了这个接口就能获取request对象?如果我不继承接口,通过以下方法就不能获取对象public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}
这样的一个方法跟用上面代码去实现接口从功能上看没什么区别,但为什么不实现接口就获取不了request对象,而实现接口就可以获取request对象?忘高手赐教
先来讨论第一种:是通过ServerletActionContext.getRequest方法来获取
1.首先ServerletActioncontext继承ActionContext,有一个getRequest的静态方法。2.在ServerletActioncontext的静态方法getRequest中调用ActionContext的静态方法getContext然后再get(get(HTTP_REQUEST)),getContext会返回当前线程的ActionContext对象。3.ActionContext类里有一个Map,Map里保存了java容器传输过来的request,response等4.第2完成后,ActionContext.getContext().get(HTTP_REQUEST)中的get(HTTP_REQUEST)会去调用ActionContext(这个ActionContext已经是当前的ActionContext)的getMap方法,最终把request对象获取出来。第二种我就不明白了,只是简单的继承ServletResponseAware接口,接口里只定义了一个方法
public void setServletResponse(HttpServletResponse response);然后在bean里对接口进行实现,这样我就不明白了,为什么只要继承了这个接口就能获取request对象?如果我不继承接口,通过以下方法就不能获取对象public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}
这样的一个方法跟用上面代码去实现接口从功能上看没什么区别,但为什么不实现接口就获取不了request对象,而实现接口就可以获取request对象?忘高手赐教
解决方案 »
- 关于用String类型获取Date类型的数据,或者反过来
- java 乱码问题
- actionform的validate()方法返回了很多错误,在页面上用<html:errors/>显示所有错误,这样错误全部显示在一行,如何让各个错误分行显示
- 怎样用JS或者JAVA编写IE工具栏按钮
- 我的Applet只有界面的时候可以在JSP网页中显示正常。为什么加上数据库以后就不行了阿?
- word转pdf,各位大哥急救啊在线等待分不够我加!!!
- 我是JAVA新手这个问题很久没解决了,谢谢各位帮忙。
- 能否详细介绍一下jsp,Servlet,javaBean的MVC模式如何实现?
- 怎样在网页链接中直接打开 .doc文件?在JSP 里是不是还有什么限制呢?
- 利用JavaBean制作购物车,如何取得客户端传递来得数据?
- StringBuffer类 的append方法 怎么添加字符串
- windows2003下如何解决并发量大的问题
容器在生成ACTION实例后,会通过类似的这样ServletRequestAware.class.isInstance(new Action())
如果是则调用其setServletRequest(HttpServletRequest request) 将request注入成为其属性
如果不是由不予以处理
ServletResponseAware action = new YourAction();
action.setServletRequest(request);
if(action instanceof ServletResponseAware) {
((ServletResponseAware)action).setServletRequest(request);
}
所以你必须实现了ServletResponseAware,Struts2才会知道你需要调用setRequest方法