Struts 2提供了多种方式来访问上述的三种对象,归结起来,可以划分为两大类:与Servlet API解耦的访问方式和与Servlet API耦合的访问方式。

与Servlet API解耦的访问方式(IoC方式)

为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象, 在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取 数据。

要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类,ActionContext 是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、 session、application和locale等。ActionContext类定义了如下方法,用于获取 HttpServletRequest、HttpSession和ServletContext对应的Map对象。

Ø public Object get(Object key)

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

Ø public Map getSession()

获取封装了HttpSession的Map对象。

Ø public Map getApplication()

获取封装了ServletContext的Map对象。

我们看 通过ActionContext来获取request、session和application对象的LoginAction1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package action;
 
import java.util.Map;
 
import dbPackage.User;
 
import com.opensymphony.xwork2.Action;
 
import com.opensymphony.xwork2.ActionContext;
 
public class LoginAction1 implements Action
 
{ private User user;
 
public User getUser()
 
{ return user;
 
}
 
public void setUser(User user)
 
{ this.user = user;
 
}
 
@SuppressWarnings("unchecked")
 
@Override
 
public String execute() throws Exception
 
{
 
if("zhangsan".equals(user.getUsername())&& "1234".equals(user.getPassword()))
 
{ ActionContext context = ActionContext.getContext();
 
Map request = (Map)context.get("request");
 
Map session = context.getSession();
 
Map application = context.getApplication();
 
//在请求中放置欢迎信息。
 
request.put("greeting", "欢迎您来到程序员之家");
 
//在session中保存user对象
 
session.put("user", user);
 
//统计用户访问量,在application中保存用户访问量数据
 
Integer count = (Integer)application.get("counter");
 
if(null == count) count=1;
 
else count++;
 
application.put("counter", count);
 
return SUCCESS;
 
}else {
 
return ERROR;
 
} }}

在成功页面中,可以使用JSP内置的表达式语言来访问request、session和application范围的数据,代码如例3-12所示。

例3-12 success.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html;charset=GBK" %>
 
<html>
 
<head><title>欢迎页面</title></head>
 
<body>
 
<h3>${sessionScope.user.username},${requestScope.greeting}。<br>
 
本站的访问量是:${applicationScope.counter}</h3>
 
</body>
 
</html>

与Servlet API耦合的访问方式(非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 = request.getSession();

如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。

Struts2中Session的使用

在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到

1.通过ActionContext class中的方法getSession得到

.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 implements SessionAware {
    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>
</body>
</html>

一般在项目中往往会往session里放置一个Object,必如说user,user里有个boolean admin和String userName,如果user里存在isAdmin的方法,在jsp中可以通过<s:if test="#session.user.admin">来判断用户有没有管理权限,通过<s:property value="#session.user.userName">或者来取得用户名。好东西!!!

Struts2操作request、session和application对象的更多相关文章

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

    我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和applicatio ...

  2. struts如何在Action类中操作request,session

    在servlet中,通过request.getparameter与setparameter来实现后端与前端jsp页面的数据交互,那么在struts中,也有几种方式来操作request,session实 ...

  3. struts中操作request,session

    在Action类中操作request,session 方法一.利用ActionContext.getContext().get("request"); //返回的是Map集合 Ma ...

  4. struts2读取request,session,application中的值

    request.----> <s:property value="#request.mySessionPropKey"/> or <s:property v ...

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

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. Application对象详解

    定义// import javax.servlet.ServletContext;// ServletContext类:用于表示应用程序的上下文// 取得application对象ServletCon ...

  7. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  8. Struts2初学 Struts2在Action获取内置对象request,session,application(即ServletContext)

    truts2在Action中如何访问request,session,application(即ServletContext)对象???? 方式一:与Servlet API解耦的方式      可以使用 ...

  9. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. SpringAnnotation之配置AnnotationXML文件

    配置Annotation的环境:只需修改applicationContext.xml文件即可 1 2 3 4 5 6 7 8 9 10 11 <?xml version="1.0&qu ...

  2. New Concept English three(10)

    The great ship, Titanic, sailed for New York from Southampton on April 10th, 1912. She was carrying ...

  3. Deepgreen DB简介(转)

    原文链接   Deepgreen DB 全称 Vitesse Deepgreen DB,它是一个可扩展的大规模并行(通常称为MPP)数据仓库解决方案,起源于开源数据仓库项目Greenplum DB(通 ...

  4. Eclipse下配置Maven

    1.修改maven根目录下的conf/setting.xml文件,主要修改localRepository属性,用于管理maven下载的jar文件存放的位置. 2.修改eclipse的maven配置,w ...

  5. 【PL/SQL编程】条件语句

    1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...

  6. React之前端路由

    通过之前的博客介绍,对于react,我们已经可以写单个组件.复合组件/单个页面了,接下来就是实现页面的跳转了,这个时候,我们就需要前端路由了. 一.react-router-dom 安装这个依赖,th ...

  7. linux下awk内置函数的使用(split/substr/length)

    一.split 初始化和类型强制  awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中.你可以自己定义域分隔符或者使用现在FS(域分隔符)的值.格式:    split (strin ...

  8. iOS【野路子】精准获取webView内容高度,自适应高度

    关于WebView内容高度的获取,相信很多人都踩过坑,无法获取到准确高度,导致页面布局出现差错,搜到的资料很多但都无法解决问题,以下是个人经验总结: 项目需求实现H5文章&原生评论效果,文章是 ...

  9. MarkDown初学

    什么是MarkDown? 第一次用这个MarkDown,感觉很好,界面友好,使用简洁而又使用,最主要的是此园支持这个语法,欣慰欣慰!先这么多,看看效果如何 推荐个不错的学习网站 Markdown 语法 ...

  10. Mini Stirling engine

    So I spent 5 or 6 hours last night trying to hook up a mini Stirling engine with the gearbox of a Ta ...