转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979

页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心(值栈)填充数据,所处理工作与业务无关),Action,Result。

1,经过一系列拦截器

介绍其中的两个拦截器:ModelDriven、Params;

——一个请求过来,首先创建一个值栈对象,经过初始化,然后在Map和对象栈中放入一些数据:

(1)值栈的结构:

(2)在Map和对象栈中分别存入什么数据:

Map中:request=…,session=…,application=…,attr=…,parameters=…;

对象栈中:action对象,…

——初始化完之后,还会经过很多拦截器,其中一个拦截器ModelDriven(封装model,把model放入对象栈的栈顶),一个拦截器Params(参数封装,放入参数);

(1)经过…拦截器

(2)再经过ModelDriven拦截器:

Action中实现ModelDriven<>,并实现它的方法:

Public class RoleActionextends ActionSupport implements ModelDriven<Role>{

private Role model = new Role();

private Role getModel(){   //获取栈顶的model对象

return model;

}

}

ModelDriven的作用:把model对象放入对象栈栈顶(原来栈顶是action,现在栈顶是model了)

(3)经过…拦截器

(4)再经过Params拦截器

   Params拦截器的作用:封装参数。

   如何封装?——做了两件事:第一,先到对象栈中封装;第二,再到Map中封装;

   例子:假如,现在对象栈中有model对象在(含有id、name属性)在栈顶,action对象(含有id、age属性);页面访问地址:xx.action?id=3&name=ab&age=20&xx=00;

   经过Params拦截器时,它如何将参数封装?

——先从栈顶开始找,依次找到id、name、age属性,通过各自的Set方法依次设值id=3,name=ab,age=20(注:虽然对象栈中有两个id属性,但是由于model对象的id属性在栈顶,所以找到此id属性就设值,不会继续往下找),但是对象栈中没有xx属性,于是栈中就没有这个参数了,通过对象栈就无法得到xx参数,但是Map中有parameters,可以把所有参数放入parameters中,无论在对象栈中有没有写属性,在parameters中都能得到;

——经过一系列拦截器之后,此时数据中心就有了数据,那我们就可以从中获取数据(Action、Jsp中均可从中获取并使用);

2,思考:值栈对象作用范围是什么?

——一次请求。因为每发送一个请求过来,都要经过这样一系列过程:拦截器(往值栈中压入数据)——>Action——>Request

3,细节扩充:

(1)由值栈对象,如何操作Map?

——ActionContext.getContext()

.put(k,v);//Map中放入数据

.get(k);//Map中获取数据

或:ActionContext.getContext.getValueStack()

.put(k,v);//Map中放入数据

.get(k);//Map中获取数据

(2)有了值栈对象,如何操作对象栈?

——ActionContext.getContext().getValueStack()

.push(obj);//向对象栈中放入数据

.pop();//从对象栈中获取数据

(3)所以,值栈中有了对象,Action中如何使用栈中的数据:

——通过ActionContext()操作Map,操作对象栈

(4)所以,值栈中有了对象,jsp中如何使用栈中的数据:

——通过OGNL表达式获取

OGNL表达式的格式和语法:

格式:

(1)在Struts.xml中的格式为:${ongl};

(2)在Jsp中的格式为:%{ongl};

(注:只能写在Struts2的自定义标签的属性中)

语法:

user =findValue("user");//从栈中获取user属性

#user = map.get("user"); //从Map中获取user对象

#user.name=map.get("user").getName();//从Map中获取user对象的name属性

(findvalue(expr))的查找顺序:

(1)从对象栈中查找指定名称的属性,从栈顶开始向下找,找到后就返回;

(2)如果从对象栈中没有找到属性,则从Map中查找对应的key值,找到后就返回。

例子:

4,总结

    通过此篇博客,我们需要了解什么?
(1)页面一个请求过来,Struts2中依次经过了哪几个过程?
    —— 一系列拦截器——>Action——>Request;
——ModelDriven和Params拦截器分别的主要作用;
(2)值栈的概念?
——值栈的结构:对象栈、Map;
——对象栈、Map分别存放什么数据;
(3)(1)和(2)是如何结合在一起的?
——请求过来,一开始经过拦截器,初始化并创建对象栈,经过ModelDriven和Params拦截器时,分别往值栈中封装对象和封装参数,分别封装到相应的地方,此时数据中心中有就有了数据。
    以上均是拦截器为我们做的工作,我们只需写Action(通过ActionContext()操作Map,操作对象栈)和Jsp(通过OGNL表达式获取栈中数据)即可。

Struts学习之值栈的理解的更多相关文章

  1. 学习Struts--Chap05:值栈和OGNL

    1.值栈的介绍 1.1 值栈的介绍: 值栈是对应每一个请求对象的数据存储中心,struts2会给每一个请求对象创建一个值栈,我们大多数情况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据 ...

  2. struts2学习(7)值栈简介与OGNL引入

    一.值栈简介: 二.OGNL引入: com.cy.action.HelloAction.java: package com.cy.action; import java.util.Map; impor ...

  3. Struts2 中的值栈的理解

    通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...

  4. struts Value Stack 值栈

    首先声明:本文是从博客园博友的文章转载过来的,感觉说的不错.在此附上地址:http://www.cnblogs.com/jerryxing/archive/2012/04/23/2467299.htm ...

  5. Struts2基础学习(七)—值栈和OGNL

    目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义      ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...

  6. EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...

  7. Struts2学习:值栈(value stack)

    1.index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %& ...

  8. Ognl值栈对象及struts标签

    用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...

  9. Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

随机推荐

  1. Codeforces 707D Persistent Bookcase(时间树)

    [题目链接] http://codeforces.com/problemset/problem/707/D [题目大意] 给出一个矩阵,要求满足如下操作,单个位置x|=1或者x&=0,一行的数 ...

  2. DELL服务器安装Windows server 2003---解决找不到安装在计算机上的硬盘驱动器 安装无法

    安装Windows server 2003系统,本以为改改BIOS配置“改为从光驱启动优先”很容易搞定的.没想到系统安装过程中碰到“找不到安装在计算机上的硬盘驱动器安装无法继续,要退出请按F3”问题, ...

  3. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

  4. AndroidContentProvider ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之一,可见它在Android中 的作用非同小 ...

  5. Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)

    Pat1043代码 题目描写叙述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the f ...

  6. SQL学习之汇总数据之聚集函数

    一. 1.我们经常需要汇总数据而不用把他们实际检索出来,为此SQL提供了专门的函数,以便于分析数据和报表生成,这些函数的功能有: (1)确定表中行数(或者满足单个条件或多个条件或包含某个特定值的行数) ...

  7. 关于K-Means算法

    在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示. ...

  8. 开源libusb驱动的libwdi驱动安装API库和zadig.exe安装UI应用程序的编译和调试

    一.目的 二.编译环境 系统:Win7 ~ Win10 编译工具:Visual Studio 2008 或 Visual Studio 2010 或Visual Studio 2015 libwdi编 ...

  9. 算法——A*——HDOJ:1813

    Escape from Tetris Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. 解决全站ie6下PNG图片不透明问题只要几行代码

    解决全站ie6下PNG图片不透明问题只要复制下面这几行代码粘贴在你的文档最底部,需要用到的包DD_belatedPNG_0.0.8a.js自己网上下载吧 代码走起 /*在文档底部加入以下代码*/ &l ...