关于struts2中ActionContext的实现原理
2018-03-28 20:36
435 查看
转载地址:http://blog.51cto.com/yangfei520/1565698
转载地址:https://blog.csdn.net/smcfy/article/details/5693481
转载地址:https://blog.csdn.net/smcfy/article/details/5693481
我们知道struts2接受客户端请求,在Action中进行处理后,将视图结果返回。struts2容器自身不依赖于web容器,不用和servlet对象中的请求(request)、响应(response)进行关联,对于请求的参数,通过paramerInterceptor将参数封装在Action中,然后通过调用get、set方法将参数值设置进Action之中。如果仅仅获取参数,可能有时候满足不了开发的需求,有时我们要获取request或者response中的信息,要对其进行设置、处理。 一、ActionContext 是Action执行的上下文,Action的上下文可以看作是一个容器,里面封装了请求(Request)、会话(Session)、Application等,这里面的Request、Session、Application是Map类型的,往里面封装的是键值对,所以这就体现了struts2不与底层servlet Api打交道,那么对很多web的相关对象进行封装,这样可以达到Action与web层解耦。用ActionContext得到Map类型的Request、Session、Application。例子: 获取request: Map request = ActionContext.getContext().get("request"); 往request里封装数据 request.put("name", value); 在前台就可以用request.getAttribute("name"); 获取session Map session = ActionContext.getContext().getSession(); 将数据封装到session中 session.put("name", value); 在前台页面上用sessionScope.getAttribute("name");得到session里面封装的值。得到session、request有点区别,得到request用的是get("reqeust"),得到session用的是getSession() 也可以直接对Java Servlet Http的请求(HttpServletRequest)、响应(HttpServletResponse)操作,和上面的例子有点区别,注意区别。ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);用法就和Servlet中的request、response用法一样 二、ServletActionContext它继承ActionContext,所以ServletActionContext也可以得到HttpServetRequest、HttpServletResponse,,它也提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应对象(3)javax.servlet.ServletContext : Servlet上下文信息(4)javax.servlet.ServletConfig : Servlet配置对象(5)javax.servlet.jsp.PageContext : Http页面上下文 如何获取HttpRequest、HttpResponse例子 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();然后就可以用request.setAttribute("name", value)方法了。 总结:不难看出,两者之间还是存在很多共同功能,那么我们还是根据自己的需求进行选择,能用ActionContext对象满足就尽量使用ActionContext,避免让我们直接去访问Servlet对象。另外,不要在Action还没实例化的时候去通过ActionContext调用方法,因为Action实例在ActionContext实例之前创建,ActionContext中一些值还没有设置,会返回null。
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。(一)通过ActionContext来获取request、session和application对象的LoginAction1
[java] view plain copyActionContext context = ActionContext.getContext();
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();
request.put("greeting", "欢迎您来到程序员之家");//在请求中放置欢迎信息。
session.put("user", user);//在session中保存user对象
application.put("counter", count);
在JSP中读取
[xhtml] view plain copy<body><h3>${sessionScope.user.username},${requestScope.greeting}。<br>本站的访问量是:${applicationScope.counter}</h3>
</body>
(二)直接使用ActionContex类的put()方法ActionContext.getContext().put("greeting", "欢迎您来到http://www. sunxin.org");然后在结果页面中,从请求对象中取出greeting属性,如下:${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%> 以下是原博客的地址,以备查阅http://apps.hi.baidu.com/share/detail/9065250
为一个问题“struts2如何保证ActionContext每次取的都是本次请求所对应的实例?”,给一个网友解释了半天。 首先,我们知道,struts2和struts1的一个重要区别就是它进行了Action类和Servlet的解耦。而又提供了获取Servlet API的其它通道,就是ActionContext(别跟我说还有个ServletActionContext,其实ServletActionContext只是ActionContext的一个子类而已)。源码为证:
其次,他也知道,ActionContext是Action执行时的上下文,可以看作是一个容器,并且这个容器只是一个Map而已,在容器中存放的是Action在执行时需要用到的VALUE_STACK、ACTION_NAME、SESSION、APPLICATION、ACTION_INVOCATION等等对象,还可以存放自定义的一些对象。我想用过struts2的朋友们,大多也都知道这些吧。 第三,他奇怪的是,在一个请求的处理过程拦截器、action类和result中任何时候获取的ActionContext都是跟当前请求绑定那一个。为什么!? 我给他的建议是,带着问题读源码,呵呵。那我们一起来看看吧:首先是ActionContext类的源码:
源码清晰的说明了我们编程中再熟悉不过的一行代码:ActionContext ctx = ActionContext.getContext();,原来我们所取得的ctx来自于ThreadLocal啊!熟悉ThreadLocal的朋友都知道它是与当前线程绑定的,而且是我们Java中处理多线程问题的一种重要方式。我们再看,类中有个Map类型的变量context,其实,它才是前面我们提到的真正意义上的“容器”,用来存放Action在执行时所需要的那些数据。 到这里,他最初的那个问题已经很了然了。但是,他紧接着又一个疑惑提出来了:“那既然每个请求处理线程都有自己的ActionContext,那里面的那些数据是什么时候放进去的呢”? 这次我给他的建议是,动脑筋,用源码验证。既然ActionContext存放有HttpServletRequest及其中的参数,既然ActionContext贯穿于整个请求处理过程,那就从struts2请求处理的入口(过滤器StrutsPrepareAndExecuteFilter)找,源码:
再找到prepare对应的类PrepareOperations,查看方法createActionContext(),就一目了然了。 对于ServletActionContext作为ActionContext一个直接子类,原理也是类似的,感兴趣的朋友可以看一下。
转载地址:https://blog.csdn.net/smcfy/article/details/5693481
转载地址:https://blog.csdn.net/smcfy/article/details/5693481
ActionContext与ServletActionContext的区别及获取request、session等对象
转载 2014年08月22日 13:42:4512641我们知道struts2接受客户端请求,在Action中进行处理后,将视图结果返回。struts2容器自身不依赖于web容器,不用和servlet对象中的请求(request)、响应(response)进行关联,对于请求的参数,通过paramerInterceptor将参数封装在Action中,然后通过调用get、set方法将参数值设置进Action之中。如果仅仅获取参数,可能有时候满足不了开发的需求,有时我们要获取request或者response中的信息,要对其进行设置、处理。 一、ActionContext 是Action执行的上下文,Action的上下文可以看作是一个容器,里面封装了请求(Request)、会话(Session)、Application等,这里面的Request、Session、Application是Map类型的,往里面封装的是键值对,所以这就体现了struts2不与底层servlet Api打交道,那么对很多web的相关对象进行封装,这样可以达到Action与web层解耦。用ActionContext得到Map类型的Request、Session、Application。例子: 获取request: Map request = ActionContext.getContext().get("request"); 往request里封装数据 request.put("name", value); 在前台就可以用request.getAttribute("name"); 获取session Map session = ActionContext.getContext().getSession(); 将数据封装到session中 session.put("name", value); 在前台页面上用sessionScope.getAttribute("name");得到session里面封装的值。得到session、request有点区别,得到request用的是get("reqeust"),得到session用的是getSession() 也可以直接对Java Servlet Http的请求(HttpServletRequest)、响应(HttpServletResponse)操作,和上面的例子有点区别,注意区别。ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);用法就和Servlet中的request、response用法一样 二、ServletActionContext它继承ActionContext,所以ServletActionContext也可以得到HttpServetRequest、HttpServletResponse,,它也提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应对象(3)javax.servlet.ServletContext : Servlet上下文信息(4)javax.servlet.ServletConfig : Servlet配置对象(5)javax.servlet.jsp.PageContext : Http页面上下文 如何获取HttpRequest、HttpResponse例子 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();然后就可以用request.setAttribute("name", value)方法了。 总结:不难看出,两者之间还是存在很多共同功能,那么我们还是根据自己的需求进行选择,能用ActionContext对象满足就尽量使用ActionContext,避免让我们直接去访问Servlet对象。另外,不要在Action还没实例化的时候去通过ActionContext调用方法,因为Action实例在ActionContext实例之前创建,ActionContext中一些值还没有设置,会返回null。
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。(一)通过ActionContext来获取request、session和application对象的LoginAction1
[java] view plain copyActionContext context = ActionContext.getContext();
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();
request.put("greeting", "欢迎您来到程序员之家");//在请求中放置欢迎信息。
session.put("user", user);//在session中保存user对象
application.put("counter", count);
在JSP中读取
[xhtml] view plain copy<body><h3>${sessionScope.user.username},${requestScope.greeting}。<br>本站的访问量是:${applicationScope.counter}</h3>
</body>
(二)直接使用ActionContex类的put()方法ActionContext.getContext().put("greeting", "欢迎您来到http://www. sunxin.org");然后在结果页面中,从请求对象中取出greeting属性,如下:${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%> 以下是原博客的地址,以备查阅http://apps.hi.baidu.com/share/detail/9065250
为一个问题“struts2如何保证ActionContext每次取的都是本次请求所对应的实例?”,给一个网友解释了半天。 首先,我们知道,struts2和struts1的一个重要区别就是它进行了Action类和Servlet的解耦。而又提供了获取Servlet API的其它通道,就是ActionContext(别跟我说还有个ServletActionContext,其实ServletActionContext只是ActionContext的一个子类而已)。源码为证:
相关文章推荐
- 关于struts2中ActionContext的实现原理
- 关于struts2中ActionContext的实现原理
- 关于Struts2中文件上传代码ServletActionContext.getServletContext()编译报错的问题,
- 在struts2中关于ActionContext介绍
- 关于struts2 的ActionContext.getContext().getParameters() 的一点儿总结
- struts2中关于ActionContext.put()方法
- 关于在Struts2中ActionContext是何时创建的
- 关于ActionContext.getContext()取得的值是什么,和struts2如何获取request,session,appliaction作用域
- struts2中,一个Form表单配置多个action实现原理及案例
- Ajax与struts2实现过程中出现ServletActionContext找不到的情况
- struts2 实现原理解析 此博文包含图片 (2010-07-27 14:49:36)转载▼ 标签: filter dispatcher threadlocal actionproxy 杂谈 分
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- struts2 Action里实现在前台弹出提示框
- 关于Struts2的Action的跳转方式(跳转到JSP)(跳转到Action)
- struts2如何实现弹出action返回的错误信息
- 关于函数strtok和strtok_r的使用要点和实现原理(一)
- Struts2中ServletActionContext.getServletContext().getRealPath("/")空指针
- 关于ActionContext.getContext()的使用方法心得
- struts2中通过Action以InputStream的下载文件以及在iOS以及Android端接收的实现方式
- 关于struts2中action获取参数的三种方法