///我们平时用的,这个很好理解 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对象:
- HttpServletRequest request = ServletActionContext.getRequest ();
- ActionContext ct= ActionContext.getContext()
- HttpServletRequest request=
- (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);
获得session对象:在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。
- Map session=ActionContext.getSession();
- Map session=(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的文章:
- 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到
- 1.通过ActionContext class中的方法getSession得到
- 2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作
- 下面先看一个采用第一种方式,在action中得到session的例子
- package s2.ex.action;
- import java.util.Map;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- public class SessionTestAction extends ActionSupport {
- public String execute() {
- ActionContext actionContext = ActionContext.getContext();
- Map session = actionContext.getSession();
- session.put("USER_NAME", "Test User");
- return SUCCESS;
- }
- }
- 在这个例子中,通过ActionContext得到session,并往session里放置一个key为USER_NAME,值为Test User的内容。
- 下面是一个实现org.apache.struts2.interceptor.SessionAware接口来对session操作的例子
- package s2.ex.action;
- import java.util.Map;
- import org.apache.struts2.interceptor.SessionAware;
- import com.opensymphony.xwork2.ActionSupport;
- public class SessionTest1Action extends ActionSupport implementsSessionAware {
- private Map session;
- public void setSession(Map session) {
- this.session = session;
- }
- public String execute() {
- this.session.put("USER_NAME", "Test User 1");
- return SUCCESS;
- }
- }
- 在这个例子中实现了接口SessionAware中的setSession方法。
- 上面两种方式都可以得到session,能实现的功能都是一样的。
- 这里推荐通过第二种方式来使用session,原因是便于做单体测试,用第二种方式,只需要构造一个Map就可以对action class进行单体测试了。
- 在一个项目中可能会有很多action都需要用到session,如果每个action都来实现org.apache.struts2.interceptor.SessionAware这个接口,可能会显得比较麻烦,所以建议作一个抽象的BaseAction类来实现org.apache.struts2.interceptor.SessionAware接口,以后所有的action只要继承这个BaseAction就可以了。
- 下面是一个如何在JSP中使用session的例子。
- <%@ page contentType="text/html; charset=UTF-8" %>
- <%@page pageEncoding="utf-8" %>
- <%@taglib prefix="s" uri="/struts-tags" %>
- <html>
- <head>
- <title>Session Test</title>
- </head>
- <body>
- <h1><s:property value="#session.USER_NAME"/></h1>
- <h1></h1>
- </body>
- </html>
- 一般在项目中往往会往session里放置一个Object,必如说user,user里有个boolean admin和String userName,如果user里存在isAdmin的方法,在jsp中可以通过<s:if test="#session.user.admin">来判断用户有没有管理权限,通过<s:propertyvalue="#session.user.userName">或者来取得用户名。