• 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. Nagios详解(基础、安装、配置文件解析及监控实例)

    一.Nagios基础 1.简介Nagios是一款开源网络监视工具.可监控网络服务(SMTP.POP3.HTTP.NNTP.ICMP.SNMP.FTP.SSH.PING---).监控主机资源.根据需求设 ...

  2. 笔记:Hibernate 拦截器和事件

    Hibernate 在执行持久化的过程中,应用程序通常无法参与其中,通过事件框架,Hibernate 允许应用程序能响应特定的内部事件,从而允许实现某些通用的功能,或者对 Hibernate 进行扩展 ...

  3. Docker 网络管理及容器跨主机通信

    1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...

  4. echarts对每个data[i]的图片添加点击事件

    1.综述:以饼图为例,只需要对echarts对象option添加以下几行代码即可 //添加点击事件(单击),还有其他鼠标事件和键盘事件等等 myChart1.on("click", ...

  5. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

  6. 数据库中插入数据时发生ora-00984错误

    操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...

  7. 201621123050 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. L ...

  8. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  9. 项目Beta冲刺Day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  10. nyoj 第几是谁

    第几是谁? 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl"12个字符,将其按字典序排列,如果给出任意一种排列, ...