• Map栈 :request,session,application的一个属性值或一个请求参数的值。

若想访问ContextMap里的某个对象的属性,可以使用以下几种之一:

#object.propertyName

#object['propertyName']

#object["propertyName"]

示例:

返回session中的code属性:#session.code;

返回request中的customer对的name属性值:#request.customer.name

返回域对象(按request,session,application的顺序)的lasterActionDate属性:#attr.lastAccesssDate

  • 例子:基于《Struts(九):值栈(OGNL)》中的例子对Product对象进行修改:

Product.java实现RequestAware、SessionAware接口,并在save方法中把this存放到sessionMap,把product2存放到requestMap中:

 1 package com.dx.struts2.valuestack;
 2
 3 import java.io.UnsupportedEncodingException;
 4 import java.util.Map;
 5
 6 import org.apache.struts2.interceptor.RequestAware;
 7 import org.apache.struts2.interceptor.SessionAware;
 8
 9 import com.opensymphony.xwork2.ActionContext;
10 import com.opensymphony.xwork2.util.ValueStack;
11
12 public class Product implements RequestAware,SessionAware{
13     private Integer productId;
14     private String productName;
15     private String productDesc;
16     private Double productPrice;
17
18     public Integer getProductId() {
19         return productId;
20     }
21     public void setProductId(Integer productId) {
22         this.productId = productId;
23     }
24     public String getProductName() {
25         return productName;
26     }
27     public void setProductName(String productName) {
28         this.productName = productName;
29     }
30     public String getProductDesc() {
31         return productDesc;
32     }
33     public void setProductDesc(String productDesc) {
34         this.productDesc = productDesc;
35     }
36     public Double getProductPrice() {
37         return productPrice;
38     }
39     public void setProductPrice(Double productPrice) {
40         this.productPrice = productPrice;
41     }
42
43     public String save(){
44         System.out.println("save");
45
46         // 1、获取值栈对象
47         ValueStack valueStack= ActionContext.getContext().getValueStack();
48
49         // 2、生成一个Product2对象
50         Product2 product2=new Product2();
51         product2.setProductDesc("product2 desc");
52         product2.setProductName("product2 name");
53
54         // 3、将Product2对象存放到值栈中
55         valueStack.push(product2);
56
57         sessionMap.put("product", this);
58         requestMap.put("product2", product2);
59
60         return "success";
61     }
62
63     private Map<String,Object> requestMap;
64
65     @Override
66     public void setRequest(Map<String, Object> request) {
67         this.requestMap=request;
68
69     }
70
71     private Map<String,Object> sessionMap;
72
73     @Override
74     public void setSession(Map<String, Object> session) {
75         this.sessionMap= session;
76     }
77 }

View Code

details.jsp获取方式有两种:

productName:<br/>
${sessionScope.product.productName}<br/>
or<br/>
<s:property value="#session.product.productName"/><br/>
<br/>
productName:<br/>
${requestScope.product.productName}<br/>
or<br/>
<s:property value="#request.product.productName"/><br/>

  • 调用字段和方法

1、可以利用OGNL调用
  任何一个java类里的静态字段和方法;
  被压入到ValueStack栈的对象上的公共字段和方法。
2、默认情况下,Strut2不允许调用任何java类的方法,需要重新设置struts.ognl.allowStaticMethodAccess标记变量为true.
3、调用静态字段或者方法需要使用如下所以的语法:
@fullyQualifiedClassName@fieldName
例如:

<s:property value="@java.lang.Math@PI"/>

@fullyQualifiedClassName@methodName(argumentList)

例如:

<s:property value="@java.lang.Math@cos(0)"/>

注意:此时默认是不允许输出结果的在strut2-core.jar中default.proerpties中包含struts.ognl.allowStaticMethodAccess
修需在struts.xml中

<struts>
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
...
</struts>

4、调用一个实例字段或者方法的语句,其中object是Object Stack栈里的某个对象的引用:

object.fieldName:[0].datePattern
object.methodName(argumentList):[0].repeat(3,"hello");

<s:property value="[0].setProductName('set product name')"/>
<s:property value="[0].productName" />

5、还可以访问数组对象的属性。

<%String[] colors=new String[]{"red","blue"};
request.setAttribute("colors",colors);
%>
length:<s:property value="#attr.colors.length"/>
colors[1]:<s:property value="#attr.colors[1]"/>

6、访问List类型的属性

7、访问Map类型的属性

<%Map<String,String> letters=new HasMap<String,String>();
letters.put("aa","Aa");
request.setAttribute("letters",letters);
%>
<s:property value="#attr.letters.size"/>
AA:
<s:property value="#attr.letters["aa"]"/>

Struts(十一):OGNL表达式(二)相关推荐

  1. struts2的OGNL表达式(二)

    下面说说OGNL表达式的访问情况: OGNL表达式能访问:访问属性,访问方法,访问字体对象,访问静态属性和方法,访问构造方法,访问数组,访问集合 – 投影.选择(? ^ $) 1,OGNL输出常量值 ...

  2. JSTL/EL表达式/Struts2标签/OGNL表达式

    文章目录 JSTL + EL表达式 Struts 标签 + OGNL表达式 JSTL + EL表达式 JSTL 只能用在 JSP 文件中,不可以在 XML 和 HTML 文件中使用,不可以用在 JS ...

  3. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

    来自:http://blog.csdn.net/love_you_99/article/details/8184797 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极 ...

  4. Struts(十):OGNL表达式(一)

    Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值: I.值栈中的属性值: 1.对象栈:读取对象栈中的某一个对象的属性值: 2.Map栈 :request,session, ...

  5. Struts标签和OGNL表达式

    Struts标签和OGNL表达式 1.OGNL通过索引访问ValueStack中的对象. [0].name [1].name 上面使用的索引的方式并不是直接取得指定元素,而是从指定索引开始向下搜索. ...

  6. Struts 2的OGNL表达式

    来源:http://www.24xuexi.com/w/2011-04-26/88911.html Struts 2的OGNL表达式 标准的OGNL会设定一个根对象(root对象).假设使用标准OGN ...

  7. struts OGNL表达式

    OGNLContext对象有两部分构成 一部分是ROOT:可以放置任何对象作为ROOT 另外一部分Context:必须是Map形式(键值对) OGNL表达式操作 package cn.future.a ...

  8. struts2教程(9)--OGNL表达式使用

    OGNL表示式使用和值栈 一.介绍 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的 ...

  9. struts2的OGNL表达式理解(一)

    一,什么是OGNL表达式     OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言(Expression Languag ...

  10. Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传

    一.OGNL概述:OGNL是一种表达式 (1)在struts2中操作值栈数据. (2)一般把ognl在struts2中操作,和struts2标签一起使用操作值栈. (3)ognl不是strut2的一部 ...

最新文章

  1. Redis 笔记(06)— set 类型(向集合添加元素、获取集合元素个数、判断集合中是否包含某个元素、删除给定元素、返回集合中所有元素、计算集合的交集、并集、差集)
  2. 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar
  3. 推荐3个快速开发平台 前后端都有 项目经验又有着落了
  4. 深入浅出设计模式原则之单一原则(SRP)
  5. TypeScript中怎么用接口(interface)描述类(静态部分与实例部分)
  6. 用 vue2 和 webpack 快速建构 NW.js 项目(1)
  7. STM32之RTC原理
  8. wordpress 迁移网站更改域名解决图片无法显示
  9. 解除天翼young和沃派客户端数量限制的方法
  10. eclipse上svn创建分支、合并、切换
  11. PRINCE2认证的优势是什么?
  12. mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
  13. WIFI系列协议--802.11ac--增强非常高吞吐量简称VHT--1Gbit
  14. 鸿蒙轻量级数据存储Preferences
  15. 技术分享 | 大量 Opening tables 案例分析
  16. Geogebra-球坐标系
  17. 7-2 单词首字母大写 (15 分)
  18. Java 阿里云实人认证
  19. 电机FOC中的坐标变换(CLARK+PARK+公式推导+仿真+C语言实现)
  20. FileInputStream和BufferedInputStream的比较

热门文章

  1. mysql添加mcafee 审计插件
  2. Oracle行转列、列转行的Sql语句总结
  3. sdut2355Binary Search Heap Construction
  4. Spring好处—总结
  5. 如何增加虚拟机ubuntu的硬盘
  6. Windows XP增强dos命令
  7. 今天心情好,发首我喜欢的歌---天黑黑
  8. 深度学习——卷积块回顾
  9. python使用函数输出指定范围内fibonacci数的个数_第6章函数-4 使用函数输出指定范围内Fibonacci数的个数...
  10. 使用php函数判断数字,PHP 几个常用数字判断函数的简单示例