[Struts2]访问request,session和application对象(转)

与Servlet API解耦的访问方式

Structs2对HttpServletRequest,HttpSession,和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest,Httpsession,ServletContext对应的Map对象来保存和读取数据。

要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类。

ActionContext是action执行的上下文,在ActionContext中保存了action执行所需要的一组对象,包括parameters,request,session,application,locale等。

ActionContext类没有提供类似getRequest()这样的方法来获取封装了HttpServletRequest的Map对象。要请求Map对象,需要用get()方法传递参数"request"

[html] view plaincopy

  1. public Object get(Object key)
  2. public Map getSession()
  3. public Map getApplication()

Action:

[java] view plaincopy

  1. ActionContext context = ActionContext.getContext();
  2. Map request=(Map)context.get("request");
  3. Map session = context.getSession();
  4. Map application = context.getApplication();
  5. request.put("greeting" "hello request");
  6. session.put("user",user);
  7. Integer count = (Integer)application.get("counter");
  8. application.put("counter",count);

JSP:

[html] view plaincopy

  1. <h3>${sessionScope.user.username},${requestScope.greeting}。</h3><br />
  2. ${applicationScope.counter}

利用请求对象来传递数据还有一种方式,可以直接利用ActionContext类的put()方法将数据保存到ActionContext中

[java] view plaincopy

  1. Actioncontext.getContext().put("greeting","hello ");

然后在结果页面中,从请求对象中取出greeting属性

[java] view plaincopy

  1. $(requestScope.greeting)或者<%=request.getAttribute("greeting")%>

ActionContext中保存的数据能够从请求对象中得到,其中的奥妙就在于Struct2中的org.apache.struts2.dispatcher.StrutsRequestWrapper类,这个类是HttpServletRequest的包装类,它重写了getAttribute()方法,在这个方法中,先请求对象中查找属性,如果没有,就从ActionContext中查找。这就是为什么ActionContext中保存的数据能够从请求对象中得到的原因。

除了ActionContext来获取request,session和application对象这种方式外,Action类还可以实现某些特定接口,让Structs2在运行时向Action实例注入request,session,application对象。与之对应的三个接口和他们的方法:

[java] view plaincopy

  1. org.apache.struts2.interceptor.RequestAware
  2. org.apache.struts2.interceptor.SessionAware
  3. org.apache.struts2.interceptor.ApplicationAware

[java] view plaincopy

  1. public class LoginAction implements Action,RequestAware,SessionAware,ApplicationAware{
  2. private Map request;
  3. private Map session;
  4. private Map application;
  5. // ......
  6. @override
  7. public void setRequest(Map request){
  8. this.request=request;
  9. }
  10. @override
  11. public void setSession(Map session){
  12. this.session=session;
  13. }
  14. @override
  15. public void setApplication(Map application){
  16. this.application=application;
  17. }
  18. }

与Servlet API耦合的访问方式

要直接获取HttpServletRequest和ServletContext对象,可以使用org.apache.struts2.ServletActionContext类,在这个类中,定义了两个静态方法

[java] view plaincopy

  1. public static HttpserlvetRequest getRequest()
  2. public static HttpservletResponse getResponse()
  3. pubolic static ServletContext getServletContext()

HttpSession对象可以通过HttpServletRequest对象来取到

还可以调用ActionContext对象的get()方法,传递ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT键值来得到HttpServletRequest和ServletContext对象,如下:

[java] view plaincopy

  1. ActionContext.getcontext().get(ServletActionContext.HTTP_REQUEST);
  2. ActionContext.getcontext().get(ServletActionContext.HTTP_RESPONSE);
  3. ActionContext.getcontext().get(ServletActionContext.SERVLET_CONTEXT);

[java] view plaincopy

  1. HttpServletResquest request  = ServletActionContext.getRequest();
  2. HttpSession session = request.getSession();
  3. ServletContext context = ServletActionContext.getServletContext();
  4. //application中保存数据
  5. Integer count = (Integer)context.getAttribute("counter");

除了利用ServletActionContext来获取HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts2向Action实例注入HttpServletRequest和ServletContext对象

ServeletRequestAware接口和ServletContextAware接口不在同一个包,前者在org.apache.structs2.interceptor包中,后者在org.apache.struts2.util包中。

[java] view plaincopy

    1. public class LoginAction implements Action,ServletRequestAware,ServletContextAware{
    2. private HttpServletRequest request;
    3. private ServletContext context;
    4. //......
    5. @override
    6. public void setServletRequest(...){
    7. //...
    8. }
    9. @override
    10. public void setServletContext(...){
    11. //...
    12. }
    13. }
时间: 2024-10-21 07:14:03

[Struts2]访问request,session和application对象(转)的相关文章

Struts2中获取Web元素request、session、application对象的四种方式

我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和application他们都是web开发最常用和最实用的对象,有了它们可以大大方便开发人员进行开发和操作.但是在struts2中,基本都是action,这些个方法都是没有requet.session.application,所以如何获取这几个常用对象,也成了大家都比较关注的问题,下面我就来演示下,如何在struts2中

session与application对象

一.session与application 1.session的关系图 显示session的ID 代码如下: 1.先创建一个t1.jsp页面,创建一个session,设置键和值 2.然后另外创建一个t2.jsp页面,获取t1.jsp中session的值 还可以重新赋值给session 总结: 客户端的session 其实是标记了你的请求来自哪个浏览器 问题1:永远都一样吗? 答:重启了浏览器,你的session id就改变了, 结果会导致,再无法取回原来在服务端保存的数据. 问题2:假设客户端的

Struts2之Action获取request、session、application对象

需要分别实现对应的接口:RequestAware, SessionAware, ApplicationAware 首先,当浏览器拿着地址去访问服务器时,服务器解析出地址的后缀并传给web.xml配置好的前端控制器,这个时候struts2的前端控制器拿到这个字符串后,就会开始判断它是否跟配置文件里的某个Action对象匹配上. 匹配上之后,前端控制器就会放行,执行相应Action.由于Action代替原有的Servlet做控制,但问题是它本身并不是Servlet类,并没有request这些属于Se

Web开发中的域问题:PageContext,Request,Session,ServletContext(Application)

Web开发中的四个域对象(范围由小到大): page(jsp有效)  request(一次请求) session(一次会话) application(当前web应用) page域指的是pageContext. request域指的是HttpServletRequest session 域指的是HTTPSession application 域指的是ServletContext 之所以他们是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法.而且他们

struts2 访问或添加request/session/application属性

第一种方法: ActionContext ctx = ActionContext.getContext(); ctx.put("r1", list);//向request中添加属性 ctx.getSession().put("s1",list);//向session中添加属性 ctx.getApplication().put("a1", list);//向application中添加属性 HttpSession session =null; se

[原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Struts2访问web元素

一.为什么Action要访问web元素? 在使用struts2框架进行开发的时候, 页面与Action类进行交互, 由于Action中无法取得前端request.session.application.HttpServletRequest.HttpSession.ServletApplication,但是当有用户登录的时候, 需要在程序中为该用户创建session以标识该用户的登录状态及其他信息, 如何才能使得Action能够访问web元素,并把相应数据放到session.application

Application对象

11.1  Application对象 Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销.因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问.因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序

Struts2之访问和添加request、session、application属性

Struts2中访问和添加request.session.application属性 public String execute() {// 如果仅仅往这三个范围放入属性,建议使用这种方法 ActionContext actionContext = ActionContext.getContext(); // 往ServletContext里放application actionContext.getApplication().put("application", "appl