• 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

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

 package com.dx.struts2.valuestack;

 import java.io.UnsupportedEncodingException;
import java.util.Map; import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack; public class Product implements RequestAware,SessionAware{
private Integer productId;
private String productName;
private String productDesc;
private Double productPrice; public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public Double getProductPrice() {
return productPrice;
}
public void setProductPrice(Double productPrice) {
this.productPrice = productPrice;
} public String save(){
System.out.println("save"); // 1、获取值栈对象
ValueStack valueStack= ActionContext.getContext().getValueStack(); // 2、生成一个Product2对象
Product2 product2=new Product2();
product2.setProductDesc("product2 desc");
product2.setProductName("product2 name"); // 3、将Product2对象存放到值栈中
valueStack.push(product2); sessionMap.put("product", this);
requestMap.put("product2", product2); return "success";
} private Map<String,Object> requestMap; @Override
public void setRequest(Map<String, Object> request) {
this.requestMap=request; } private Map<String,Object> sessionMap; @Override
public void setSession(Map<String, Object> session) {
this.sessionMap= session;
}
}

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. 3:4 OGNL 表达式二

    总结: 一:ActionContext的结构: 1:set标签创建的对象也是作为非值栈对象. 2:(非值栈的存储都是以键值对的方式存的.) [问非值栈的 User对象] [用例] 关于request: ...

  2. 【Struts2五】ValueStack以及ognl表达式二(经常使用标签)

    Ognl经常使用标签:   1.s:debug       假设把该标签放入到s:iterator中能够看到当前正在迭代的元素的状态    2.s:property       1.输出       ...

  3. Struts 2 OGNL

    1.什么是OGNL? 2.Struts 2 OGNL 表达式      ======================  华丽丽的分割线  ======================  1.什么是OG ...

  4. 使用OGNL表达式

    OGNL表达式(#号的用法) 用法1:访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 1.如果访问其他Context中的对象,由于他们不是根对象, ...

  5. (七)Action之ActionContext(OGNL表达式的使用)

    一.ActionContext的重要性 struts中的数据都存放在ActionContext里,所以这部分是Action中的核心. ActionContext又称广义值栈,既然有广义值栈就有侠义值栈 ...

  6. Struts2的标签库(二)——OGNL表达式

    Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框 ...

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

    我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...

  8. 六 Struts 拦截器、OGNL表达式

    一.OGNL表达式1.概念:是表达式语言,专门用来访问对象取值用的.2.对比EL表达式使用场景: A.EL主要用在web的jsp页面取值 B.OGNL适用以下环境 1.java程序中 2.在页面使用( ...

  9. 初窥struts2(二)OGNL表达式

    Struts2总结 Struts2完整的处理流程: 1  客户端发送请求,交给struts2控制器(StrutsPrepareAndExecuteFilter). 2  Filter控制器进行请求过滤 ...

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

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

随机推荐

  1. python函数式编程之生成器

    在前面的学习过程中,我们知道,迭代器有两个好处: 一是不依赖索引的统一的迭代方法 二是惰性计算,节省内存 但是迭代器也有自己的显著的缺点,那就是 不如按照索引取值方便 一次性,只能向后取值,不能向前取 ...

  2. java基础学习系列一

    判断语句 1,if条件判断语句 if(){} if(){} else{} if(){}else if(){} else() if判断一共这3张情况.if后面的值是boolen类型 2,switch条件 ...

  3. Know your weapons Ⅱ

    本次内容主要讲述使用UWP相关技术可以实现的软件上的一些功能,这里以Netease-Cloud Music(下称Cloud Music)为例讲述,这款音乐软件我个人一直在用,毕竟人们生活离不开音乐,说 ...

  4. zabbix自定义key监控mysql主从同步超简单!

    原理:利用在slave上运行show slave status获取Slave_IO_Running和Slave_SQL_Running的值 1.在zabbix客户端配置文件中加入: 首先要对mysql ...

  5. Swift4--函数,自学笔记

    函数 函数名 描述函数功能,调用函数时使用. 定义和调用函数 func greetAgain(person: String) -> String { return "Hello aga ...

  6. STL --> 高效使用STL

    高效使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍:
熟悉以下条款,高效的使用STL:   一.当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任 ...

  7. windows上SSH服务连接远程主机失败

    putty连接出现错误提示"Network error:connection refused",xshell连接出现错误提示"connection failed:(por ...

  8. 深入解析C语言数组和指针

    概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...

  9. Beta冲刺置顶随笔

    项目名称:城市安全风险管控系统 小组成员: 张梨贤.林静.周静平.黄腾飞 Beta冲刺随笔 Beta预备 Beta冲刺Day1 Beta冲刺Day2 Beta冲刺Day3 Beta冲刺Day4 Bet ...

  10. C语言--总结报告

    1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 当初填报志愿我是有很明确的专业方向的,就是IT类的 ...