来源:http://blog.csdn.net/alex197963/article/details/2219912

在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作。

我们需要在Action中取得request请求参数"username"的值:

ActionContext context = ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。

一般情况,我们的ActionContext都是通过:

ActionContext context = (ActionContext) actionContext.get();

来获取的(详细见ActionContext.class)。我们再来看看这里的actionContext对象的创建:

static ThreadLocal actionContext = new ActionContextThreadLocal();

ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
下面我们看看怎么通过ActionContext取得我们的HttpSession:

Map session = ActionContext.getContext().getSession();

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里取得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。

如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入。开发Web应用程序当然免不了跟这些对象打交道。在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。

非IoC方式
 要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。另外,org.apache.struts2.ServletActionContext 作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();

 如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession() 获取或添加session范围(Scoped)的对象。

NonIoCServlet.java

package tutorial;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class NonIoCServlet extends ActionSupport {
private String message;public String getMessage() {
return message;
}@Override
public String execute() {
ActionContext.getContext().getSession().put("msg", "Hello World from Session!");HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());message = sb.toString();
return SUCCESS;
}
}

IoC方式
 要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现,请参 IocServlet.java。
IoCServlet.java

package tutorial;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response; public String getMessage() {
return message;
}publicvoid setSession(Map att) {
this.att = att;
}publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}@Override
public String execute() {
att.put("msg", "Hello World from Session!");HttpSession session = request.getSession();StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());message = sb.toString();
return SUCCESS;
}
}

Servlet.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2>
<s:property value="message" escape="false"/>
<br>Message from session: <s:property value="#session.msg"/>
</h2>
</body>
</html>

struts.xml中NonIocServlet和IoCServlet Action的配置

<action name="NonIoCServlet" class="tutorial.NonIoCServlet">
<result>/Servlet.jsp</result>
</action>
<action name="IoCServlet" class="tutorial.IoCServlet">
<result>/Servlet.jsp</result>
</action>

 运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
 在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同.

Struts2中ActionContext介绍相关推荐

  1. Struts2中ActionContext和ServletActionContext

    转自:http://blog.sina.com.cn/s/blog_6c9bac050100y9iw.html 在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在A ...

  2. java actioncontext_关于struts2中ActionContext的实现原理

    北京,雾霾天气阻止了今天的马拉松之行,蜗居一天.为一个问题"struts2如何保证ActionContext每次取的都是本次请求所对应的实例?",给一个网友解释了半天. 首先,我们 ...

  3. struts2中 ServletActionContext与ActionContext区别

    1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...

  4. 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等

    目录(?) [-] ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) Ac ...

  5. Struts2中Result类型介绍

    1.在Struts2中,Result类型有12种,分别为dispatcher,redirect,chain,redirectAction,freemarker,httpheader,stream,ve ...

  6. Struts2中的ActionContext

    转载自:http://space.itpub.net/14734416/viewspace-485659 ActionContext(Action上下文) ActionContext介绍 通过上面用户 ...

  7. Struts2中UI标签之表单标签介绍

    1.在Struts2中UI标签的表单标签分为两种:form标签本身和单个表单标签. 2.Struts2表单标签包括:form.textfield.password.radio.checkbox.che ...

  8. 在struts2中訪问servletAPI

    在struts2中訪问servletAPI,通俗点也就是使用servlet中的两个对象request对象和response对象. 前几天看到一个CRM项目的源代码,里面使用request对象和resp ...

  9. Struts2中的Action

    多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...

最新文章

  1. python社区发现_这个 Python 项目厉害了!多个实战案例教你分析时空数据处理
  2. 详解 如何在 windows 7添加启动项 ,强大的计划任务功能
  3. 笔记-高项案例题-2018年上-质量管理
  4. Day11多态部分-2 【1.2 多态的前提】
  5. React 中的父子组件 兄弟组件传值
  6. Java 解析XML的几种方法
  7. 转:elasticsearch nested嵌套查询
  8. Spring AOP源码分析(二)JDK动态代理和CGLIB介绍
  9. [转]apache MPM介绍
  10. 七年级计算机工作计划,七年级下学期信息技术教学计划(最新整理)
  11. 海森堡不确定性原理实验
  12. 深海迷航创造模式火箭怎么飞_《我的世界》怎么用火箭使鞘翅飞起来?
  13. 解决idea使用maven打自定义jar缺失
  14. aix oracle 创建实例,11gR2 for AIX使用dbca创建数据库遇到ORA-03113错误的案例
  15. crackme用来测试程序设计人员的逆向工程技能的小程序。
  16. php调用声卡,图文讲解美国ART USB Dual Pre声卡多种使用方法!
  17. cesium 漫游飞行_Cesium 之三维漫游飞行效果实现篇
  18. Start request repeated too quickly解决方法
  19. 公有继承中 构造函数和析构函数的调用(包含内嵌子对象)
  20. phpcms v9 二次开发 前台上传图片

热门文章

  1. 开源开放 | 开源大学在线实践数据集及知识图谱MOOPer(CCKS2021)
  2. 论文浅尝 | BERT:Pre-training of Deep Bidirectional Transformers
  3. 开放开源 | DeepKE:基于深度学习的开源中文关系抽取工具
  4. pycharm插件之SonarLint
  5. 3 计算机组成原理第三章 存储系统 主存简单模型及寻址 半导体寄存器 存储器分类 主存与CPU连接 双口RAM和多模块寄存器
  6. java EL表达式中${param.name}详细
  7. 在XML里的XSD和DTD以及standalone的使用
  8. log4net 小记
  9. perl里面隐式的继承
  10. Lucene-01 全文检索基本介绍