`
lushuaiyin
  • 浏览: 670946 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2 Action中获取request, response,Session对象的方法

 
阅读更多
非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=ServletActionContext.getRequest().getSession();
		///////通过ActionContext获得
	    ActionContext ac = ActionContext.getContext();       
	    //request
	    HttpServletRequest request2 = (HttpServletRequest)ac.get(ServletActionContext.HTTP_REQUEST);       
	    //response
	    HttpServletResponse response2 = (HttpServletResponse)ac.get(ServletActionContext.HTTP_RESPONSE);       
	    //session以下是错误的,会报异常
java.lang.ClassCastException: 
org.apache.struts2.dispatcher.SessionMap cannot be cast to javax.servlet.http.HttpSession 
//对于session因为从ActionContext  获取的是Map类型,不能强转化成HttpSession类型,这是ActionContext与ServletActionContext的区别
           HttpSession session2=(HttpSession)ac.get(ServletActionContext.SESSION);//错
	    HttpSession session3=(HttpSession)ac.getContext().getSession();//同上
	    HttpSession session4=(HttpSession)ac.get(ActionContext.SESSION);//错
	    
	    //session对象被封装成Map,我们对Map操作就可以
	    Map session5=ac.getSession();
	    Map session6=ServletActionContext.getContext().getSession();

            session5.put("key5", "value5");
      session6.put("key6", "value6");





写个例子测试一下:
package com.visit.frame.test;

import java.util.Map;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.*;
import org.apache.struts2.dispatcher.*;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport{
	private String leaveMessage;
	
	public String execute(){
		this.setLeaveMessage("here me");
		///我们平时用的,这个很好理解
		HttpServletRequest    request = ServletActionContext.getRequest ();
//		HttpServletResponse   response=ServletActionContext.getResponse();
		HttpSession session=ServletActionContext.getRequest().getSession();
		
		
		
		
		///////通过ActionContext获得
	    ActionContext ac = ActionContext.getContext();       
	    //request
	    HttpServletRequest request2 = (HttpServletRequest)ac.get(ServletActionContext.HTTP_REQUEST);       
	    //response
//	    HttpServletResponse response2 = (HttpServletResponse)ac.get(ServletActionContext.HTTP_RESPONSE);       
	    //session
	    Map session2= (Map) ac.get(ServletActionContext.SESSION);
	    Map session3=ac.getContext().getSession();//同上
	    Map session4=(Map) ac.get(ActionContext.SESSION);
	    
	    //session对象被封装成Map,我们对Map操作就可以
	    Map session5=(Map)ac.getSession();
	    Map session6=ServletActionContext.getContext().getSession();
//	    
	    request.setAttribute("request", "request0");
	    session.setAttribute("session", "session0");
	    request2.setAttribute("request2", "request2");
	    
	    session2.put("session2", "session2");
	    
	    session3.put("session3", "session3");
	    session4.put("session4", "session4");
	    
	    session5.put("session5", "session5");
	    session6.put("session6", "session6");
	    

		return SUCCESS;
	}

	public String getLeaveMessage() {
		this.leaveMessage="hhhh";
		return leaveMessage;
	}

	public void setLeaveMessage(String leaveMessage) {
		this.leaveMessage = leaveMessage;
	}

}

请求的页面是:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head><title>Simple ha page</title></head>
<body>
    <h3>hahaha</h3>

    <h3>you success,ha</h3>
    <br>
    request---<%=request.getAttribute("request") %><br>
    request2----<%=request.getAttribute("request2") %><br>
    session--<%=session.getAttribute("session") %><br>
    <br>------
    session2--<%=session.getAttribute("session2") %><br>
    session3--<%=session.getAttribute("session3") %><br>
    session4--<%=session.getAttribute("session4") %><br>
    session5--<%=session.getAttribute("session5") %><br>
    session6--<%=session.getAttribute("session6") %><br>
    
</body>
</html>

页面显示:

hahaha

you success,ha


request---request0
request2----request2
session--session0

------ session2--session2
session3--session3
session4--session4
session5--session5
session6--session6



//////////////////////////////以下转载/////////////////////////////////////////////////////////

在Struts1.*中,要想访问request、response以及session等Servlet对象是很方便的,因为它们一直是作为形参在各个方法之间进行传递的,而在Struts2中我们就很难看到它们的芳踪了,因为我们获得表单中的值都是通过预先设置好了的get方法来得到的,那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到,那么应该怎么做呢?按照Max的教程上的说法,可以分为两种:IoC方式和非IoC方式,如何理解这两种方式的区别呢?IoC是Spring里面的特征之一,字面意思是反转控制,说白了就是依赖注入,比方说类A依赖类B,那么就主动的给A注入一个类B的对象,下面看一下这两种方法的具体实现。1.非Ioc方式这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。获得request对象:

  1. HttpServletRequestrequest=ServletActionContext.getRequest();
  2. ActionContextct=ActionContext.getContext()
  3. HttpServletRequestrequest=
  4. (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);

获得session对象:在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。

  1. Mapsession=ActionContext.getSession();
  2. Mapsession=(Map)ActionContext.getContext().getActionContext.SESSION);

得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。2.IoC方式这种方式相对来说变化就比较少了,具体流程如下所示。获得request对象:第一步:让action实现ServletRequestAware接口第二步:在action中声明一个HttpServletRequest类型的实例变量第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。private HttpServletRequest request;public void setServletRequest(HttpServletRequest request) {this.request = request;}获得Session对象(注意,此时的session是SessionMap类型):第一步:让action实现SessionAware接口第二步:在action中声明一个HttpServletRequest类型的实例变量第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。private Map session;publicvoid setSession(Map session) {this. session = session;}以下是另一篇关于得到Request和Session的文章:

  1. Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到
  2. 1.通过ActionContextclass中的方法getSession得到
  3. 2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作
  4. 下面先看一个采用第一种方式,在action中得到session的例子
  5. packages2.ex.action;
  6. importjava.util.Map;
  7. importcom.opensymphony.xwork2.ActionContext;
  8. importcom.opensymphony.xwork2.ActionSupport;
  9. publicclassSessionTestActionextendsActionSupport{
  10. publicStringexecute(){
  11. ActionContextactionContext=ActionContext.getContext();
  12. Mapsession=actionContext.getSession();
  13. session.put("USER_NAME","Test User");
  14. returnSUCCESS;
  15. }
  16. }
  17. 在这个例子中,通过ActionContext得到session,并往session里放置一个keyUSER_NAME,值为TestUser的内容。
  18. 下面是一个实现org.apache.struts2.interceptor.SessionAware接口来对session操作的例子
  19. packages2.ex.action;
  20. importjava.util.Map;
  21. importorg.apache.struts2.interceptor.SessionAware;
  22. importcom.opensymphony.xwork2.ActionSupport;
  23. publicclassSessionTest1ActionextendsActionSupportimplementsSessionAware{
  24. privateMapsession;
  25. publicvoidsetSession(Mapsession){
  26. this.session=session;
  27. }
  28. publicStringexecute(){
  29. this.session.put("USER_NAME","Test User 1");
  30. returnSUCCESS;
  31. }
  32. }
  33. 在这个例子中实现了接口SessionAware中的setSession方法。
  34. 上面两种方式都可以得到session,能实现的功能都是一样的。
  35. 这里推荐通过第二种方式来使用session,原因是便于做单体测试,用第二种方式,只需要构造一个Map就可以对actionclass进行单体测试了。
  36. 在一个项目中可能会有很多action都需要用到session,如果每个action都来实现org.apache.struts2.interceptor.SessionAware这个接口,可能会显得比较麻烦,所以建议作一个抽象的BaseAction类来实现org.apache.struts2.interceptor.SessionAware接口,以后所有的action只要继承这个BaseAction就可以了。
  37. 下面是一个如何在JSP中使用session的例子。
  38. <%@pagecontentType="text/html; charset=UTF-8"%>
  39. <%@pagepageEncoding="utf-8"%>
  40. <%@taglibprefix="s"uri="/struts-tags"%>
  41. <html>
  42. <head>
  43. <title>SessionTest</title>
  44. </head>
  45. <body>
  46. <h1><s:propertyvalue="#session.USER_NAME"/></h1>
  47. <h1></h1>
  48. </body>
  49. </html>
  50. 一般在项目中往往会往session里放置一个Object,必如说useruser里有个booleanadminStringuserName,如果user里存在isAdmin的方法,在jsp中可以通过<s:iftest="#session.user.admin">来判断用户有没有管理权限,通过<s:propertyvalue="#session.user.userName">或者来取得用户名。












分享到:
评论

相关推荐

    Struts2的Action中获得request response session几种方法

    Struts2的Action中获得request response session几种方法

    从J2SE到J2EE知识点介绍

    (五) jsp内置对象(request,response.session,out) 121 1. request和response 121 2. session 122 (六) Servlet的 xml配置 126 1. xml的文件结构 127 2. 通过web.xml配置文件访问servlet的流程 129 (七) servlet里面...

    POI导入导出EXCEL文件.(struts 1.x and struts2.x).doc

    struts1.x的例子,struts2.x可以参考自己修改 1.action的写法 import java.io.*; import java.sql.*; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import javax.servlet....

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    ssh(structs,spring,hibernate)框架中的上传下载

     此外lazy="true"说明地返回整个Tfile对象时,并不返回fileContent这个字段的数据,只有在显式调用tfile.getFileContent()方法时才真正从数据库中获取fileContent的数据。这是Hibernate3引入的新特性,对于包含重量...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    外文翻译 stus MVC

    • Before passing it to the Action class, Struts will also conduct form state validation by calling the validation() method on UserActionForm. Note: This is not always wise to do. There might be ways ...

    java面试题

    答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 ...

    拦截器和控制器的区别

    1、struts2对servlet封装(request,response) ,资源调配和资源的映射 2、框架设计的思想 istruts 配置,过滤器,反射 istruts.properties 3、starts2的使用思路 1、jar 2、配置文件 3、常用类 ...

    J2EE应用开发详解

    76 5.5.2 JavaBean动作 78 5.6 隐式对象 78 5.6.1 request对象 78 5.6.2 response对象 78 5.6.3 application对象 78 5.6.4 out对象 79 5.6.5 page对象 79 5.6.6 session对象 79 5.6.7 exception对象 80 5.6.8 ...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    struts 标签 logic:iterate使用 logic:iterate

    我就是靠这个文档实现logic:iterate的循环的 struts 标签 logic:iterate使用 logic:iterate &lt;br&gt;第一页 是struts官方的说明, 第二页 是个例子 第三页 是我实现的arrayList放入标签的方法。 这是页面...

    李兴华Java Web开发实战经典(高清版) Part2

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、...

    java web 视频、电子书、源码(李兴华老师出版)

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、...

Global site tag (gtag.js) - Google Analytics