访问request、session和application对象
在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest、HttpSession和ServletContext。Struts 2框架让我们可以直接访问和设置action及模型对象的数据,这降低了对HttpServletRequest对象的使用需求,但在某些应用中,我们可能会需要在action中去访问HttpServletRequest对象以及其他两种对象,例如,用户登录成功后,我们应该将用户信息保存到Session中。
Struts 2提供了多种方式来访问上述的三种对象,归结起来,可以划分为两大类:与Servlet API解耦的访问方式和与Servlet API耦合的访问方式。
1 与Servlet API解耦的访问方式
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。
要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类(参看4.2节)。
ActionContext是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、session、application和locale等。ActionContext类定义了如下方法,用于获取HttpServletRequest、HttpSession和ServletContext对应的Map对象。
public Object get(Object key) |
public Map getSession() |
public Map getApplication() |
获取封装了ServletContext的Map对象。
我们看例3-11。
例3-11 通过ActionContext来获取request、session和application对象的LoginAction1
package org.sunxin.struts2.ch03.action.way1; import java.util.Map; import org.sunxin.struts2.ch03.model.User; import com.opensymphony.xwork2.Action; public class LoginAction1 implements Action public void setUser(User user) @SuppressWarnings("unchecked") |
在成功页面中,可以使用JSP内置的表达式语言来访问request、session和application范围的数据,代码如例3-12所示。
例3-12 success.jsp
<%@ page contentType="text/html;charset=GBK" %> |
如果页面能够正常显示我们保存在request、session和application对象中的数据(当然是能够正常显示的,要不然笔者也不会给出这个例子了。☺),就说明在Action中,对ActionContext返回的Map对象的操作,等价于对Servlet API中的HttpServletRequest、HttpSession和ServletContext对象的操作。
利用请求对象来传递数据还有一种方式,你可以直接使用ActionContex类的put()方法将数据保存到ActionContext中,如下:
ActionContext.getContext().put("greeting", "欢迎您来到http://www. sunxin.org");
然后在结果页面中,从请求对象中取出greeting属性,如下:
${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%> |
ActionContext中保存的数据能够从请求对象中得到,这让人太不可思议了。其中的奥妙就在于Struts 2中的org.apache.struts2.dispatcher.StrutsRequestWrapper类,这个类是HttpServletRequest的包装类,它重写了getAttribute()方法(在页面中获取request对象的属性就要调用这个方法),在这个方法中,它首先在请求对象中查找属性,如果没有找到(如果你在ActionContext中保存数据,当然就找不到了),则到ActionContext中去查找。这就是为什么在ActionContext中保存的数据能够从请求对象中得到的原因。
当然具体的实现还有很多细节,感兴趣的读者可以跟踪一下Struts 2的源代码。
除了利用ActionContext来获取request、session和application对象这种方式外,Action类还可以实现某些特定的接口,让Struts 2框架在运行时向Action实例注入request、session和application对象。与之对应的三个接口和它们的方法如下所示:
org.apache.struts2.interceptor.RequestAware |
public void setRequest(Map request) |
void setSession(Map session) |
框架利用该接口,向Action实例注入application Map对象。该接口只有一个方法,如下:
void setApplication(Map application) |
我们看例3-13。
例3-13 通过接口注入来获取request、session和application对象的LoginAction2
package org.sunxin.struts2.ch03.action.way1; import java.util.Map; import org.apache.struts2.interceptor.ApplicationAware; import com.opensymphony.xwork2.Action; public class LoginAction2 implements Action, @SuppressWarnings("unchecked") @Override @Override @Override |
LoginAction2类实现了RequestAware、SessionAware和ApplicationAware接口,框架在运行时会调用这三个接口中的方法,向LoginAction2注入request、session和application对象。
2 与Servlet API耦合的访问方式
直接访问Servlet API将使你的Action与Servlet环境耦合在一起,我们知道对于HttpServletRequest、HttpServletResponse和ServletContext这些对象,它们都是由Servlet容器来构造的,与这些对象绑定在一起,测试时就需要有Servlet容器,不便于Action的单元测试。但有时候,我们又确实需要直接访问这些对象,那么当然是以完成任务需求为主。
要直接获取HttpServletRequest和ServletContext对象,可以使用org.apache.struts2. ServletActionContext类,该类是ActionContext的子类,在这个类中定义下面两个静态方法:
public static HttpServletRequest getRequest() |
public static ServletContext getServletContext() |
得到ServletContext对象。
此外,ServletActionContext类还给出了获取HttpServletResponse对象的方法,如下:
public static HttpServletResponse getResponse() |
ServletActionContext类并没有给出直接得到HttpSession对象的方法,HttpSession对象可以通过HttpServletRequest对象来得到。
除了上述的方法调用得到HttpServletRequest和ServletContext对象外,还可以调用ActionContext对象的get()方法,传递ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT键值来得到HttpServletRequest和ServletContext对象,如下所示:
ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); |
ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT); |
得到与ServletActionContext.SERVLET_CONTEXT键值绑定的ServletContext对象。
同样的,也可以向ActionContext的get()方法传递ServletActionContext.HTTP_ RESPONSE键值来得到HttpServletResponse对象,如下:
ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE); |
建议读者采用第一种方式来获取HttpServletRequest和ServletContext对象,这样简单而又清晰。
我们看例3-14。
例3-14 通过ServletActionContext来获取HttpServletRequest和ServletContext对象的LoginAction3
package org.sunxin.struts2.ch03.action.way2; import javax.servlet.ServletContext; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; public class LoginAction3 implements Action @Override |
除了利用ServletActionContext来获取HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts 2框架向Action实例注入HttpServletRequest和ServletContext对象。
org.apache.struts2.interceptor.ServletRequestAware接口只有一个方法,如下所示:
void setServletRequest(HttpServletRequest request) |
void setServletContext(ServletContext context) |
ServletRequestAware接口和ServletContextAware接口不属于同一个包,前者在org.apache.struts2.interceptor包中,后者在org.apache.struts2.util包中,这很让人迷惑。
我们看例3-15。
例3-15 通过接口注入来获取HttpServletRequest和ServletContext对象的LoginAction4
package org.sunxin.struts2.ch03.action.way2; import javax.servlet.ServletContext; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.Action; public class LoginAction4 implements Action, ServletRequestAware, ServletContextAware … @Override //在session中保存user对象 //统计用户访问量,在application中保存用户访问量数据 return SUCCESS; @Override @Override |
相关推荐
熟练使用这些内置对象是开发JSP应用程序的基本要求,尤其是对于request、session和application对象更是必须要掌握的。 会使用对象所具有的方法,能熟练使用每一种对象的几种常用方法。希望对大家有用。。。
在Struts2中,访问request、session和application对象是进行数据共享和传递的重要手段。这篇学习笔记主要探讨了如何在Struts2框架下有效地利用这三种域对象。 首先,request对象代表一次HTTP请求,它存储的数据仅...
在Java Web开发中,"四个范围"是指PageContext、Request、Session和Application这四个不同的作用域,它们分别代表了Web应用程序中数据存储的不同层级和生命周期。理解并熟练掌握这四个范围,对于编写高效且可维护的...
request、session和application是Servlet编程中三种重要的域对象,它们各自管理着特定范围的数据存储。本文将深入解析这三者的概念、特点以及它们之间的关系。 1. HttpServletRequest request对象: request对象...
在Web开发中,`pageContext`, `request`, `session`, 和 `application` 是四个非常重要的内置对象,它们分别代表了不同作用域内的数据存储空间。理解这些对象的生命周期及其使用范围对于有效地管理Web应用的状态至关...
这个对象包含了request、session和application等重要信息。例如,你可以使用`ActionContext.getContext().get("key")`来获取请求或会话中的值,而`ActionContext.getContext().getValueStack()`则可以获取ValueStack...
快速认清pageContext,request,session,application/ServletContext的区别。 区别1:生命周期 区别2:共享范围 区别3:适合存储什么样的数据
JSP内置对象session和application的应用 JSP(Java Server Pages)是一种服务器端脚本语言,用于生成动态网页。JSP内置对象是JSP提供的一些预定义对象,通过这些对象,可以访问和操作服务器端的资源。其中,session...
在 Struts2 中,处理用户请求时经常需要使用到 Servlet 的内置对象,比如 Request、Session 和 Application,这些对象可以帮助开发者存储和获取数据。然而,在实际应用中,为了避免代码与 Servlet API 过度耦合,...
### ASP.NET内置对象Session、Application等的用法与区别 #### 一、概述 ASP.NET是一种广泛使用的Web开发框架,提供了多种内置对象来帮助开发者管理应用程序的状态信息。这些内置对象包括Session、Application、...
三大作用域 request作用域 session作用域 application作用域【servlet的上下文】
在 ASP.NET 中,为了存储用户的状态信息或临时数据,开发人员经常使用多种内置的对象,例如 Application、Session、Cookie、ViewState 和 Cache 等。这些对象各有特点,适用于不同的场景。接下来,我们将详细介绍...
在用户单击“退出”按钮后,页面关闭,同时application和session中保存的信息都将丢失。 三、实验方法 1、用户登录信息使用request对象getParameter()方法得到用户登陆的一些信息; 2、公聊信息可以使用...
在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application 在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application
通过`ActionContext`的`getContext()`方法可以得到当前的`ActionContext`实例,然后通过这个实例进一步获取到request、response和session。 #### 示例代码: ```java import ...
Session对象用于存储特定用户会话的数据,Request对象用于获取客户端发送的请求信息,Response对象则负责向客户端发送响应,Server对象提供了对服务器功能的访问,而Cookie对象则用来管理HTTP Cookie,用于在客户端...
在ASP.NET编程中,了解和熟练使用六大对象——Response,Request,Server,Application,Session,Cookie至关重要。这些对象是ASP.NET框架中用于处理客户端请求和服务器响应的核心组件,它们提供了丰富的功能来帮助...
在ASP.NET中,Application、Session和Cookie对象是三种非常重要的概念,它们主要用于在用户交互过程中管理和共享数据。 首先,Application对象在ASP.NET中扮演全局变量的角色,它允许开发者在整个应用程序生命周期...
在Struts2框架中,理解并正确使用request、response、session和application范围对于有效地管理数据和状态至关重要。这些范围帮助我们在Web应用程序中实现逻辑和数据流的分离,提高代码的可维护性和可扩展性。通过...
它定义了整个应用程序范围内的事件处理程序,包括Application和Session事件。这个文件允许开发者对整个应用程序的生命周期进行控制,如在Application_Start事件中进行初始化设置,或者在Session_Start和Session_End...