`
catinthewater
  • 浏览: 979 次
社区版块
存档分类
最新评论

ActionContext和ServletActionContext

阅读更多
1. ActionContext
在Struts2开发中,除了将请求参数自动设置到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对象的创建:
static ThreadLocal actionContext = new ActionContextThreadLocal();

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


2. ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与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页面上下文

如何从ServletActionContext里取得Servlet的相关对象:
<1>取得HttpServletRequest对象:
HttpServletRequest request = ServletActionContext. getRequest();


<2>取得HttpSession对象:
HttpSession session = ServletActionContext. getRequest().getSession();

3. ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。

应用场景
(1)如果仅仅是为了往三个属性范围(application,session,request)放入属性,则使用ActionContext就可以了。
(2)如果仅仅是需要访问和添加这三个范围的属性,则使用ActionContext就可以了。
(3)直接要得到原始的Servlet对象来进行操作,则使用ServletActionContext。例如要得到站点目录下的绝对路径,则需要serveletActionContext。


4. struts2中获得request、response和session
(1)非IoC方式
方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。
	ActionContext ctx = ActionContext.getContext();
	ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
	Map session = ctx.getSession(); //session
	HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
	HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型. 我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.

方法二:使用org.apache.struts2.ServletActionContext类

public class UserAction extends ActionSupport {
		// 其他代码片段
		private HttpServletRequest req;
		// private HttpServletRequest req = ServletActionContext.getRequest();
		// 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。
		public String login() {
			req = ServletActionContext.getRequest(); // req的获得必须在具体的方法中实现
			user = new User();
			user.setUid(uid);
			user.setPassword(password);
			if (userDAO.isLogin(user)) {
				req.getSession().setAttribute("user", user);
				return SUCCESS;
			}
			return LOGIN;
		}
		public String queryAll() {
			req = ServletActionContext.getRequest(); // req的获得必须在具体的方法中实现
			uList = userDAO.queryAll();
			req.getSession().setAttribute("uList", uList);
			return SUCCESS;
		}
		// 其他代码片段
	}

(2)IoC方式(即使用Struts2 Aware拦截器)
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。
public class UserAction extends ActionSupport implements SessionAware,
			ServletRequestAware, ServletResponseAware {
		private HttpServletRequest request;
		private HttpServletResponse response;

		public void setServletRequest(HttpServletRequest request) {
			this.request = request;
		}

		public void setServletResponse(HttpServletResponse response) {
			this.response = response;
		}

		public String execute() {
			HttpSession session = request.getSession();
			return SUCCESS;
		}
	}





参考资料:http://blog.sina.com.cn/s/blog_680e2f5b01015bkq.html
分享到:
评论

相关推荐

    ActionContext介绍(在Struts2中)

    象,如HttpServletRequest、HttpServletResponse,或者需要访问Session和Application等信息,在Struts2框架中,我们可以利用ActionContext和ServletActionContext这两个类。ActionContext是Struts2提供的一个核心上...

    struts2中action如何获取jsp页面参数1.pdf

    本文将详细讨论如何在Struts2的Action中获取JSP页面的参数,以及相关的上下文类ActionContext和ServletActionContext。 1. **ActionContext获取请求参数** 当用户在JSP页面上提交表单时,表单数据会被封装到HTTP...

    WebWork 教程

    ActionContext和ServletActionContext提供了对当前请求上下文的访问,使开发者能够获取请求参数、设置session变量或进行其他与请求相关的操作。而ServletDispatcher的作用,则是将HTTP请求转化为Action调用,实现从...

    structs编程设计

    Struts2是一个强大的MVC(Model-...通过这个实验,你不仅掌握了Struts2的基本流程,还了解了Action接口、ActionSupport类、ActionContext和ServletActionContext等相关概念,以及如何在Struts2中使用Servlet API对象。

    Struts2学习文档

    4. **ActionContext和ServletActionContext**:介绍了这两个类的作用以及如何使用它们来获取上下文信息。 #### 八、Struts2的Taglib 1. **Struts2的Taglib概述**:概述了Struts2 Taglib的基本概念,以及它们在提高...

    struts2经典教程

    - ActionContext和ServletActionContext:这两个类提供了访问请求上下文的方法,对于处理请求时需要访问HTTP请求等信息非常有用。 #### 八、Struts2的Taglib - **Taglib概述**:Struts2提供了一组丰富的标签库,...

    研磨Struts2

    ### 知识点六:ActionContext和ServletActionContext #### 6.1 ActionContext ActionContext是Struts2中管理请求范围数据的对象,它包含了当前请求的所有信息。 #### 6.2 ServletActionContext ...

    ActionContext在struts2.0中的详细应用

    ActionContext的核心在于它提供了一种方式来获取和设置请求、会话以及Servlet API中的其他对象。例如,如果你想在Action中获取请求参数“username”的值,你可以这样做: ```java ActionContext context = ...

    strut2 详解

    struts2.0 详细介绍了struts.xml的配置,以及web.xml的配置和ActionContext,ServletActionContext的用法和区别。ActionContext主要用于设置属性,而ServletActionContext主要用来得到属性

    Java Struts图片上传至指定文件夹并显示图片功能

    在执行上传操作时,需要使用Struts的ActionContext来获取请求和响应对象,并使用ServletActionContext来获取HttpServletRequest和HttpServletResponse对象。然后,使用FileUtils来上传图片,并将图片保存到指定的...

    Struts2在Action中获得Response对象的四种方法

    ServletActionContext是ActionContext的一个包装类,它提供了更直接的方式获取HttpServletRequest和HttpServletResponse: ```java public class ServletContextAction extends ActionSupport { public String ...

    struts2 中action 如何获取jsp 页面参数1.pdf

    总的来说,在Struts2中,通过`ActionContext`和`ServletActionContext`,开发者可以方便地获取并处理JSP页面传递的参数,以及与Servlet相关的各种对象,以实现灵活的业务逻辑控制。正确理解和使用这两个类对于编写...

    Struts2_TypeConvertion

    这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。 获得request对象: A . HttpServletRequest request = ServletActionContext....

Global site tag (gtag.js) - Google Analytics