struts2 ValueStack

OGNL表达式语言介绍

OGNL是Object Graphic Navigation Language(对象图形导航语言)的缩写。Struts2框架使用OGNL作为默认的表达式语言。

OGNL相对于其他表达式语言的优势:

1、  支持对象方法的调用,如xxx.doSomeSpecial();

2、  支持类静态的方法调用和值访问,表达式的格式:

@[类全名(包括路径)]@[方法名 | 值名],例如: @[email protected](‘foo%s’,’bar’)或@[email protected]_NAME

3、  支持赋值操作和表达式串联

4、  访问OGNL上下文(OGNL context)和ActionContext

5、  操作集合对象

Ognl有一个上下文(Context)的概念,说白了上下文就是一个Map结构,它实现了java.utils.Map接口

理解struts2中的ValueStack

ValueStack实际上是一个接口,在Struts2中是利用OGNL时,实际上使用的是实现类该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础

ValueStack(值栈):贯穿整个Action生命周期(每个Action类的实例都拥有一个ValueStack对象),相当于一个数据库的中转站,在其中保存当前Action对象和其他相关对象。

Struts框架把ValueStack对象保存在名为“struts.valueStack”的请求属性中。

在ValueStack对象内部有两个逻辑部分:

ObjectStack:struts把动作和相关对象压入ObjectStack中---List

ContextMap:struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中

Struts会把下面这些映射压入ContextMap中:

Parameters:

Request:

Session:

Application:

Attr:该map将按顺序检索下面属性:request,session,application

package cn.itcast.ognl;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport {

    public String test(){
        System.out.println("ValueStack ********** test");

        HttpServletRequest req=ServletActionContext.getRequest();
        req.setAttribute("username", "request_username");

        Map<String,Object> sessionMap=ServletActionContext.getContext().getSession();
        sessionMap.put("username", "session_username");

        ServletContext application=ServletActionContext.getServletContext();
        application.setAttribute("username","application_username");

        /*
         * 获取ValueStack对象
         * valueStack对象存储在request的属性中,属性名为“struts.valueStack”
         */
        /* 方法一: */
         HttpServletRequest request=ServletActionContext.getRequest();

        ValueStack stack= (ValueStack) request.getAttribute("struts.valueStack");
        System.out.println(stack);

        /*方法二:*/
        stack=ServletActionContext.getContext().getValueStack();
        System.out.println(stack);

        /*
         * 值栈中两个属性用来存数据;
         *  public abstract Map<String, Object> getContext();
         *  public abstract CompoundRoot getRoot();
         *  public class CompoundRoot extends CopyOnWriteArrayList<Object> //CompoundRoot对象是list集合
         *
         *  context存储键值对信息:request、session、request中的信息
         *  root中存储其他信息
         */

        /*Map<String,Object> o=stack.getContext();
        Set<String> sets=o.keySet();
        for(String s:sets){
            System.out.println("key = "+s);
            System.out.println("value = "+o.get(s));

        }*/
        /*
         * context中存储的好多信息。包括一般信息( ActionContext,actionInvocation,errors, action,struts.actionMapping)和Map集合(request,ServletContext,session,parameters)
         */
        CompoundRoot  root=stack.getRoot();
        for(Object obj:root){
            System.out.println(obj);
        }
        /*
         * [email protected]
         * [email protected]
         */

        /* ActionContext,ServletContext,ognlContext是一个工具类,可以通过它访问其他数据 */

        return "ValueStack";
    }

}

时间: 2024-11-03 01:38:22

struts2 ValueStack的相关文章

struts2 ValueStack(值栈)解析

Struts2一个重要点就是值栈. ValueStack,是用来存储一些在各个action,或者说是通过s标签.el表达式等给前台Jsp等页面展示的东西. ValueStack是一个接口,其内部接口非常简单: 1 /* 2 * Copyright 2002-2007,2009 The Apache Software Foundation. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5

Struts(十):OGNL表达式

Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值: I.值栈中的属性值: 1.对象栈:读取对象栈中的某一个对象的属性值: 2.Map栈 :request,session,application的一个属性值或一个请求参数的值. II.读取对象栈(ObjectStack)中的对象属性: 1.若想读取Object Stack里的某个对象的属性,可以通过以下集中形式之一: object.propertyname object['propertyname'] object["

【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)

1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptionn,以及一般执行流程: 请求来进入 Filter 控制器 Filter 控制器创建 ValueStack 对象并初始化 Filter 控制器根据 struts.xml 调用 defaultStack 拦截器栈 Filter 控制器根据 struts.xml 调用 Action 处理 Filter

Struts2之ValueStack笔记

1.web基础知识——redirect和dispatch的区别 “redirect”方式中,服务器做的工作是处理浏览器请求然后告诉浏览器你访问的资源在另一位置(url),然后浏览器再次发起请求访问指定的资源: “dispatch”方式中,服务器会把浏览器的请求看做一种资源(request),这份资源会在服务器中流通,不同处理程序都能对其加工处理: respone在这两种不同方式中也有这种区别: 在struts2中,我认为理解redirect和dispatch的区别很重要. 2.没有读struts

Struts2中的ValueStack理解

1.目标 重新认识下ValueStack: 2.图解 3.解释下用法 struts2中在页面取值的话:是这样的,root中可以直接取值不用加# 但是在ActionContext中取值则需要加#访问才能取到值: 4.struts2中debug标签所对应的root和ActionContext;

[转]Struts2数据传输的背后机制:ValueStack(值栈)

1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! 2. ValueStack基础:OGNL 要了解ValueStack,必须先理解OGNL(Object Graphic Navigatino Language)! OGNL是Struts2中使用的一种表达式语言,它可以: ①用于JSP的标签库中,以便能够方便的访问各种对象的属性: ②用于界面将参数传递到Action(并进行类型转换)中: ③用于struts2的配置文件中! 所以,非常有

Struts2学习之文件上传/下载&amp;ValueStack(三)

简介 今天是学习Struts2第三天,也算struts2准备前奏告一段落,提升部分只能在后期深入了解,多看源码,多参阅资料.今天所学的知识点文件上传.下载/ValueStack&OGNL/Struts2标签 文件上传/下载 文件上传简介 a). 企业常用文件上传技术 : jspSmartUpload(主要应用 JSP model1 时代) . fileupload (Apache commons项目中一个组件). Servlet3.0 集成文件上传 Part类 b). Struts2 对文件上传

struts2 与 OGNL 表达式,jsp中 利用ognl 在valuestack中取值

在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素.看下面的代码: public class UserAction { private String username; private Integer age; private boolean valid; //查看用户的详细信息 public String de

struts2值栈ValueStack中都有哪些东西?

com.opensymphony.xwork2.dispatcher.HttpServletRequest application com.opensymphony.xwork2.dispatcher.HttpServletResponse com.opensymphony.xwork2.ActionContext.name com.opensymphony.xwork2.ActionContext.application attr com.opensymphony.xwork2.ActionC