ONGL:用来访问栈里对象属性的语言,通常由Struts标签来解析,

注意:要在接续OGNL的页面加入<%@ taglib prefix="s" uri="/struts-tags"%>,否则,栈内信息不回被访问到,也就是<s:debug></s:debug>访问栈内标签不起作用(暂时先这么叫吧)

值栈:

栈的特点:后入先出

1.首先要通过ActionContext来获取值栈对象ValueStack。

  1. ActionContext ac =ActionContext.getContext();
  2. //获取值栈对象
  3. ValueStack vs = ac.getValueStack();

  

值栈分为对象站和Map栈

对象栈:存放Action的实例及相关对象

Map栈:存放封装web资源的map对象,实际是ActionContext的引用

application
session
request
parameters
attr通用属性
按照request session application的循序查找属性值

方法:

push(Object)把对象压入对象栈的顶部

pop()弹出返回对象栈的顶部对象

peek()得到对象栈的顶部对象,并不弹出

OGNL访问方式:

1.使用Struts标签

1.1访问对象栈:按先后顺序访问(后入先出)

value=“[起始索引].属性名”   指定匹配的起始索引位置(索引从0开始)

1.2访问Map栈

如果作用域=attr
按照request session application的循序查找建值

1.3访问类的静态方法和静态属性

首先要在Struts的配置文件里打开访问静态方法的代码,如下:

方法:

value=“@全类名@方法名(参数列表)”
value=“@全类名@静态属性名”

1.4访问对象的集合属性

输出集合内容:value=“[起始索引].集合属性名”
访问集合单元数组和List:value=-"[起始索引].集合属性名[索引]"
Map:value=-"[起始索引].集合属性名[‘key’]"

获取集合长度
数组:value=“[起始索引].集合属性名.length”


List 和Map:value=“[起始索引].集合属性名.size”   或   value=“[起始索引].集合属性名.size()”


判断内容是否为空:value=“[起始索引].集合属性名.isEmpty()”

2.使用EL

访问map栈:${作用域。key}

访问对象站:
按先后顺序匹配属性名,只输出第一个,后面的忽略
${属性名}
不能指定查找的起始位置

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>index</title>
  8. </head>
  9. <body>
  10. <%
  11.  
  12. application.setAttribute("app","application");
  13. application.setAttribute("ses","application顶顶顶顶");
  14.  
  15. session.setAttribute("ses", "回话的测试内容");
  16. session.setAttribute("app", "回话的测试内容fffff");
  17.  
  18. request.setAttribute("req", "request");
  19.  
  20. %>
  21. <a href="test.do?userID=666666&date=123">下一个页面</a>
  22.  
  23. </body>
  24. </html>

  

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- 覆盖默认的过滤的扩展名 -->
  8. <constant name="struts.action.extension" value="do,action,,"></constant>
  9.  
  10. <!-- 启用动态调用
  11. <constant name=""></constant>-->
  12.  
  13. <!-- 允许调用静态方法和静态属性 -->
  14. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
  15.  
  16. <!-- 定义包 -->
  17. <package name="text" extends="struts-default" >
  18. <action name="test" class="com.hanqi.action.TestAction" >
  19.  
  20. <result>test.jsp</result>
  21.  
  22. </action>
  23.  
  24. </package>
  25.  
  26. </struts>

  

  1. package com.hanqi.action;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. import java.util.Random;
  7.  
  8. import com.opensymphony.xwork2.ActionContext;
  9. import com.opensymphony.xwork2.util.ValueStack;
  10.  
  11. public class TestAction {
  12.  
  13. private String userID;
  14.  
  15. private String date;
  16.  
  17. public String getUserID() {
  18. return userID;
  19. }
  20.  
  21. public void setUserID(String userID) {
  22. this.userID = userID;
  23. }
  24.  
  25. public String getDate() {
  26. return date;
  27. }
  28.  
  29. public void setDate(String date) {
  30. this.date = date;
  31. }
  32.  
  33. public String testtag()
  34. {
  35. return"success";
  36. }
  37.  
  38. //访问值栈
  39. public String execute()
  40. {
  41. ActionContext ac =ActionContext.getContext();
  42. //获取值栈对象
  43. ValueStack vs = ac.getValueStack();
  44.  
  45. //随机数对象
  46. vs.push(new Random());
  47.  
  48. //向对象栈压入对象
  49. vs.push(new Date());
  50.  
  51. //对象本身是集合
  52. List<String> ls = new ArrayList<>();
  53. ls.add("ABC");
  54. ls.add("DEF");
  55. vs.push(ls);
  56.  
  57. //对象的属性是集合
  58. TestList tl = new TestList();
  59. tl.setMyList(ls);
  60. vs.push(tl);
  61.  
  62. return "success";
  63. }
  64.  
  65. }

  

 

  

  1. <%@page import="java.util.Date"%>
  2. <%@page import="com.opensymphony.xwork2.util.ValueStack"%>
  3. <%@page import="com.opensymphony.xwork2.ActionContext"%>
  4. <%@ page language="java" contentType="text/html; charset=UTF-8"
  5. pageEncoding="UTF-8"%>
  6. <!-- 加载OGNL的自定义标签库 -->
  7. <%@ taglib prefix="s" uri="/struts-tags"%>
  8.  
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  10. <html>
  11. <head>
  12. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  13. <title>Insert title here</title>
  14. </head>
  15. <body>
  16.  
  17. <%
  18. ActionContext ac =ActionContext.getContext();
  19. ValueStack va = ac.getValueStack();
  20. //弹出并返回顶部的对象
  21. //Date dt =(Date)va.pop();
  22.  
  23. //得到顶部对象
  24. //Date dt = (Date)va.peek();
  25.  
  26. //out.print(dt);
  27.  
  28. %>
  29. <br>
  30.  
  31. 使用 OGNL访问
  32. <br><br>
  33. EL方式:
  34. ${date}
  35. <br><br>
  36. ${userID }
  37.  
  38. <br>
  39. 访问map栈:<br>
  40. ${sessionScope.ses }
  41.  
  42. <br><br>
  43. 标签方式:
  44. <s:property value="[1]['date']"/><br>
  45. <s:property value="userID"/><br>
  46. <s:property value="[1].date"/>
  47. <br>
  48. <s:property value="[0].userID"/>
  49. <br>
  50. 默认输出顶部对象(value不写,)
  51. <s:property/>
  52. <br>
  53. 访问map栈***************
  54. <br>
  55. <s:property value="#session.ses"/><br>
  56. <s:property value="#parameters.userID"/><br>
  57.  
  58. <br>
  59. app=<s:property value="#application.app"/><br>
  60. <s:property value="#request.req"/><br>
  61. <br><br>
  62. ses=<s:property value="#attr.ses"/><br>
  63.  
  64. <br>
  65. 调用实例方法:<br>
  66. 产生随机数=<s:property value="[0].nextInt(100)"/>
  67.  
  68. <br><br>
  69. 调用静态属性和对象方法:<br>
  70. 随机数:<s:property value="@java.lang.Math@random()"/>
  71. <br>
  72. PI=<s:property value="@java.lang.Math@PI"/>
  73.  
  74. <br><br>
  75. 访问list
  76. <br>
  77. list的长度=<s:property value="[0].size()"/> <!--size后面的()不可去掉 -->
  78. <br>
  79. <s:property value="[0].get(0)"/>
  80.  
  81. <br><br>
  82. 访问对象的集合属性:
  83. <br>
  84. 长度=<s:property value="[0].myList.size"/><br> <!--size后面的()可以去掉 -->
  85. 内容=<s:property value="[0].myList"/>
  86. <br>内容0=<s:property value="[0].myList[0]"/>
  87.  
  88. <br><br>
  89. 是否空=<s:property value="[0].myList.isEmpty"/>
  90.  
  91. <!-- 打印值栈信息 -->
  92. <s:debug></s:debug>
  93.  
  94. </body>
  95. </html>

  

  1. package com.hanqi.action;
  2.  
  3. import java.util.List;
  4.  
  5. public class TestList {
  6.  
  7. private List<String> myList;
  8.  
  9. public List<String> getMyList() {
  10. return myList;
  11. }
  12.  
  13. public void setMyList(List<String> myList) {
  14. this.myList = myList;
  15. }
  16.  
  17. }

  

Struts2--ONGL--值栈的更多相关文章

  1. struts2(二)值栈 threadlocal ogal ui

    值栈(重要)和ognl表达式 1.  只要是一个mvc框架,必须解决数据的存和取的问题 2.  Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3.  把数据存在值栈中,在页面上利用 ...

  2. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  3. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  4. Struts2 的 值栈和ActionContext

    1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...

  5. Struts2的值栈和对象栈

    ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContex ...

  6. Struts2向值栈中压入属性的方式

    Struts2在初始化Action的时候会先向值栈中压入一个action对象,里面包含了各个属性,这些属性是怎么被压进去的?或者说是根据什么来压入的?直到2016年5月5日才理解,原来是在初始化act ...

  7. Struts2 之值栈

    值栈(ValueStack) http://www.cnblogs.com/bgzyy/p/8639893.html 这是我的有关 struts2 的第一篇文章,对于里面我们说到的一个 struts2 ...

  8. 【struts2】值栈(后篇)

    在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...

  9. 【struts2】值栈(前篇)

    1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...

  10. struts2框架值栈的概述之问题一:什么是值栈?

    1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...

随机推荐

  1. REST,RESTful

    REST(Representational State Transfer)描述了一个架构样式的网络系统. RESTful架构,就是目前最流行的一种互联网软件架构.结构清晰.符合标准.易于理解.扩展方便 ...

  2. android开源系列之——xUtils 开源库

    http://blog.csdn.net/lijunhuayc/article/details/40585607

  3. 关于mock server

    这篇技术博客是在知乎上看到的 知乎js大神张云龙写的 这里贴过来记录下,如果侵权 请告知将及时删除. --------------------------- 为了更好的分工合作,让前端能在不依赖后端环 ...

  4. angular文件引入带来的绑定问题

    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script ...

  5. tesseract-ocr 提高验证码识别率手段之---识别码库训练方法

    本文是对tesseract-ocr 使用的进一步技术升级说明,使用默认的识别库识别率比较低怎么办? 不用着急,tesseract-ocr本身的工具中提供了使用你提供的素材进行人工修正以提高识别率的方法 ...

  6. [CSDN转载]致C语言初学者—指针注意项

    在论坛里经常见到一些新人对指针提出一些问题,作为一个经历过许多错误后的新手,我想把自己的经历说出来,避免让后来人继续这样的错误.    在讲解指针之前,需要理解一下内存空间.内存是随机存取器,计算机上 ...

  7. ubuntu 14.04 下svn + apache2 配置

    1.svn的配置 sudo apt-get install subversion // 安装svn mkdir /home/svn // 创建仓库 svnadmin create /home/svn/ ...

  8. sql常见的面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  9. 控制反转容器& 依赖注入模式 ---读感。

    几个web框架 : sprint Avalon PicoContainerclass MovieLister MovieFinder finder = ServiceLocator.movieFind ...

  10. 普通用户使用dbms_xplan包需要有的权限

    普通用户使用dbms_xplan包查看执行计划需要对v$sql.v$sql_plan.v$session及v$sql_plan_statistics_all这四个视图同时具有select权限. 如果普 ...