Struts中ActionContext和ServletActionContext的比较
一、ActionContext
在Struts2开发中除了将请求参数自动设置到Action的字段中,往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest)和响应(HttpServletResponse)操作。
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。一般情况我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get()来获取的。
actionContext对象的创建过程是static ThreadLocal actionContext = new ActionContextThreadLocal()。
ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
通过ActionContext取得相关对象
取得session:Map session = ActionContext.getContext().getSession();
取得request:Map request = (Map)ActionContext.getContext().get("request");
在Action中取得request请求参数"username"的值:
若有一个提交过来的username,那么通过param.get("username")可以取值。值得注意的是param.get("username")是一个String数组,Struts就是这样设计的。既然是String数组就需要这样取值:
String value[] = (String[])param.get("username");
String username = "";
for(int i=0;i<value.length;i++)
{
username +=value[i];
}
二 、ServletActionContext
ServletActionContext(com.opensymphony.webwork.ServletActionContext),该类直接继承了ActionContext提供直接与Servlet相关对象访问的功能,故ServletActionContext也线程安全。可取得对象:
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页面上下文
从ServletActionContext里取得Servlet的相关对象
取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();
取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();
三 、ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,该如何去抉择?
遵循的原则是:ActionContext能够实现我们的功能,最好就不要使用ServletActionContext,让Action尽量不要直接去访问Servlet的相关对象。
四 、注意点
不要在Action的构造函数里使用ActionContext.getContext(),因为此时ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。同样HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。
原因是static ThreadLocal actionContext = new ActionContextThreadLocal()可以看出ActionContext是线程安全的,而ServletActionContext继承自ActionContext故ServletActionContext也线程安全。线程安全要求每个线程都独立进行,故req的创建也要求独立进行,故ServletActionContext.getRequest()不要放在构造函数中,也不要直接放在类中,而应放在每个具体方法体中如login(),queryAll(),insert()等,才能保证每次产生对象时独立的建立了一个req。
Struts中ActionContext和ServletActionContext的比较的更多相关文章
- Struts2中ActionContext及ServletActionContext介绍(转载)
1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...
- Struts2中ActionContext和ServletActionContext
转自:http://blog.sina.com.cn/s/blog_6c9bac050100y9iw.html 在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在A ...
- Struts 中 ActionContext ctx.put()把数据放到ValueStack里之数据传输背后机制:ValueStack(值栈)
1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL要了解ValueStack,必须先理解OGNL ...
- Struts中文件的上传与下载
前面学到的用组件去上传 前台: 1.post表单提交 2.表单类型 multipart/form-data 3.intput type=file 后台: Apach提供的FileUpload组件 核心 ...
- Struts中的数据处理的三种方式
Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...
- ActionContext和ServletActionContext区别
1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...
- Struts中的OGNL和EL表达式笔记
Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...
- Struts中常用的几个技术
Struts ognl表达式语言几个符号 # 获取非根元素值 . 动态都建map集合 $ 配置文件取值 % 提供一个ognl表达式运行环境 代码示例一:在action类的一个方法中讲一个值存入 ...
随机推荐
- YII缓存之数据缓存
1.开启缓存组件 2. ================ 二 先在配置文件components数组中加上: 'cache'=>array( 'class'=>'CFileCache'), ...
- ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面(转)
ecshop 其他页面(商品详情页.商品分类页.团购页.优惠活动页.积分商城) 判断如果是智能手机访问跳转到ECTouch1.0手机版对应页面 方法 首先在ecshop 根目录下 includes/l ...
- Java Integer和String内存存储
标签: java内存string 2016-01-10 12:51 1545人阅读 评论(2) 收藏 举报 分类: Java(7) 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看代码: ...
- (转)Makefile经典教程(掌握这些足够)
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...
- ubuntu上安装Adminer
Apache 安装 $ sudo apt-get install apache2 php 安装 $ sudo apt-get install php7.0 $ sudo apt-get install ...
- Python 列表笔记
列表解析 squares = []for i in range(1,11): square = i**2 squares.append(square)print squares ########## ...
- java代码实现从键盘输入编号,输出价格,并且不再编号内的,无效输入!!!!
总结:请给我更好的建议 package com.badu; import java.util.Scanner; //从键盘输入次数,通过输入的编号,输出对应的的商品价格: public class t ...
- C#获取程序代码执行时长
ArrayList list = new ArrayList(); long startTicks = DateTime.Now.Ticks; for (int i = 0; i < 10000 ...
- C#编程技巧
拷贝/克隆(深度/浅拷贝).序列化.反射 Json/Xml 窗体的单例模式 https://www.cnblogs.com/imstrive/p/5426503.html 使用XmlSerialize ...
- 生成signature
签名规则说明 1. 将参数先按键值排序(只做一级排序),进行key和value的拼接 2. 拼接完后,在最后面再拼接上分配的 appSecret 然后用sha1对拼接串加密 签名示例 假如传入参数: ...