博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2中ActionContext与ServletActinContext
阅读量:6498 次
发布时间:2019-06-24

本文共 2866 字,大约阅读时间需要 9 分钟。

先来看看下面的一个功能需求: 我们需要在Action中取得request请求参数“username”的值: ActionContext context = ActionContext.getContext(); Map params = context.getParameters(); String username = (String) params.get(“username”); 为了实现这个功能,我们用了三个步骤: 1、取得我们当前的ActionContext对象context,ActionContext是个什么冬冬? 2、从context对象里获取我们所有的请求参数,取得的却是一个Map对象params? 3、居然可以从我们的Map对象params里获取我们需要的request请求参数“username”的值。 ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已), 它存放放的是Action在执行时需要用到的对象,比如:在使用WebWork时,我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。 在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。 我们可以通过ActionContext的静态方法:ActionContext.getContext()来取得当前的ActionContext对象,我们看看这段代码: public static ActionContext getContext() {
ActionContext context = (ActionContext) actionContext.get(); if (context == null) {
OgnlValueStack vs = new OgnlValueStack(); context = new ActionContext(vs.getContext()); setContext(context); } return context; } 一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的。 我们再来看看这里的actionContext对象的创建:static ThreadLocal actionContext = new ActionContextThreadLocal();, ActionContextThreadLocal是实现ThreadLocal的一个内部类。 ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本, 使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。 下面我们看看怎么通过ActionContext取得我们的HttpSession: Map session = ActionContext.getContext().getSession(); 原来我们取得的session却是Map类型的对象,这是为什么?原来,我们的WebWork框架将与Web相关的很多对象重新进行了包装,比如这里就将HttpSession对象重新包装成了一个Map对象, 供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。 如果我们的Action需要直接与JavaServlet的HttpSession、HttpServletRequest等一些对象进行操作, 我们又该如何处理?请看下面的ServletActionContext。 ServletActionContext ServletActionContext(com.opensymphony.webwork. ServletActionContext), 这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有: 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除了提供了上面这些对象访问,它当然也继承了它父类ActionContex的很多功能, 比如:对OgnlValueStack、Action名字等的访问。 下面我们看看几个简单的例子,让我们了解如何从ServletActionContext里取得JavaServlet的相关对象: 1、取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest(); 2、取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession(); ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中, 该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能, 那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。 在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext() ,因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。

转载于:https://www.cnblogs.com/luvsic/p/7690908.html

你可能感兴趣的文章
Jfinal Generator 不需要生成带某个前缀的表名数组的方法
查看>>
struts2中使用标签操作静态方法等
查看>>
熬夜写了一个小游戏,向SpaceX聊表敬意
查看>>
身份证工具类
查看>>
JPA增删改查,
查看>>
apache 开启 gzip 压缩服务
查看>>
python mysql
查看>>
开源 免费 java CMS - FreeCMS1.5-建站向导
查看>>
Selenium的延迟等待
查看>>
jquery 1.6以上版本 全选
查看>>
UNIX--stat、fstat和lstat函数
查看>>
wpa_supplicant学习
查看>>
AppCan 学习
查看>>
flask框架
查看>>
android App流量统计
查看>>
《疯狂Java讲义》学习笔记(十)异常处理
查看>>
Lua(Codea) 中 table.insert 越界错误原因分析
查看>>
ELK 5.x日志分析 (二) Elasticserach 5.2 安装
查看>>
sbt配置nexus仓库
查看>>
Tomcat性能优化
查看>>