从一个客户端的请求开始:

先经过Web.xml 到达struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation"value="false" />自动编译<constant name="struts.devMode" value="true" />访问静态属性和方法要设置的<constant name="struts.ognl.allowStaticMethodAccess"value="true"></constant>模块包含,包含ognl.xml<include file="/com/bjsxt/struts2/ognl/ognl.xml" /></struts>

被包含的ognl.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><package name="ognl" extends="struts-default"><action name="ognl" class="com.bjsxt.struts2.ognl.OgnlAction"><result>/ognl.jsp</result></action><action name="test" class="com.bjsxt.struts2.ognl.TestAction"><result type="chain">ognl</result></action></package>
</struts>

OgnlAction 类:

package com.bjsxt.struts2.ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
public class OgnlAction extends ActionSupport {private Cat cat;private Map<String, Dog> dogMap = new HashMap<String, Dog>();private Set<Dog> dogs = new HashSet<Dog>();private String password;private User user;private String username;private List<User> users = new ArrayList<User>();public OgnlAction() {users.add(new User(1));users.add(new User(2));users.add(new User(3));dogs.add(new Dog("dog1"));dogs.add(new Dog("dog2"));dogs.add(new Dog("dog3"));dogMap.put("dog100", new Dog("dog100"));dogMap.put("dog101", new Dog("dog101"));dogMap.put("dog102", new Dog("dog102"));}public String execute() {return SUCCESS;}public Cat getCat() {return cat;}public Map<String, Dog> getDogMap() {return dogMap;}public Set<Dog> getDogs() {return dogs;}public String getPassword() {return password;}public User getUser() {return user;}public String getUsername() {return username;}public List<User> getUsers() {return users;}public String m() {return "hello";}public void setCat(Cat cat) {this.cat = cat;}public void setDogMap(Map<String, Dog> dogMap) {this.dogMap = dogMap;}public void setDogs(Set<Dog> dogs) {this.dogs = dogs;}public void setPassword(String password) {this.password = password;}public void setUser(User user) {this.user = user;}public void setUsername(String username) {this.username = username;}public void setUsers(List<User> users) {this.users = users;}
}

Cat类:

package com.bjsxt.struts2.ognl;
public class Cat {private Dog friend;public Dog getFriend() {return friend;}public void setFriend(Dog friend) {this.friend = friend;}public String miaomiao() {return "miaomiao";}
}

Dog类:

package com.bjsxt.struts2.ognl;
public class Dog {private String name ;public Dog() {}public Dog(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "dog: " + name;}
}

S类:

package com.bjsxt.struts2.ognl;
public class S {public static String STR = "STATIC STRING";public static String s() {return "static method";}
}

User类:

package com.bjsxt.struts2.ognl;
public class User {private int age = 8;public User() {}public User(int age) {super();this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "user" + age;}
}

最重要的ognl.jsp(包含访问值栈中各种元素的方法):

<body><ol><li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li><li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li><li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li><li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li><li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li><li>访问值栈中action的普通方法:<s:property value="m()" /></li><hr /><li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li><li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li><li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li><hr /><li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li><hr /><li>访问List:<s:property value="users"/></li><li>访问List中某个元素:<s:property value="users[1]"/></li><li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li><li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li><li>访问Set:<s:property value="dogs"/></li><li>访问Set中某个元素:<s:property value="dogs[1]"/></li><li>访问Map:<s:property value="dogMap"/></li><li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li><li>访问Map中所有的key:<s:property value="dogMap.keys"/></li><li>访问Map中所有的value:<s:property value="dogMap.values"/></li><li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li><hr /><li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li><li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li><li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li><li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li><hr /><li>[]:<s:property value="[0].username"/></li></ol><s:debug></s:debug>
struts2提供了一个非常好的调试方法.就是在页面上添加一个debug标签..它会自动帮我们将一些信息显示在页面上;这个值栈又分为两种.Value Stack Contents 和 Stack Context .
(1).Value Stack Contents 里面的信息我们可以用 <s:property value="sss"> 这样来直接访问.
(2) Stack Context  里面的信息我们可以 <s:property value="#sss">这样来访问
</body>

转载于:https://blog.51cto.com/lfklovemcl/1223842

ognl 表达式常用表达式语言相关推荐

  1. cron表达式(CRON表达式详解)

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month D ...

  2. Lambda表达式常用代码示例

    Lambda表达式常用代码示例 2017-10-24 目录 1 Lambda表达式是什么 2 Lambda表达式语法 3 函数式接口是什么   3.1 常用函数式接口 4 Lambdas和Stream ...

  3. Spring切入点表达式常用写法

    Spring切入点表达式常用写法 自从使用AspectJ风格切面配置,使得Spring的切面配置大大简化,但是AspectJ是另外一个开源项目,其规则表达式的语法也稍稍有些怪异. 下面给出一些常见示例 ...

  4. mel表达式_常用表达式Mel的用法-李英江-

    http://www.cgsir.com 2008 年 8 月 目录: 一.介绍 ........................................................... ...

  5. C语言运算符与表达式课件,C语言课件(运算符和表达式).ppt

    C语言课件(运算符和表达式).ppt 运算符与表达式第二讲 运算符和表达式,引例 概念及分类 优先级和结合性 算术运算 关系运算 逻辑运算 位运算 赋值运算符 逗号运算符 条件运算符,引例,引例 问题 ...

  6. c语言表达式用法,C语言 运算符、表达式和条件结构 用法总结

    运算符.表达式和条件结构 内容概要:各种运算符的使用 运算符的优先级 表达式的计算 条件分支结构判断的常用结构 表达式: 表达式是运算符和操作数的组合,如下所示: s = ( n + 9 ) * ( ...

  7. c语言运算符与表达式ppt,C语言基本运算符与表达式.ppt

    <C语言基本运算符与表达式.ppt>由会员分享,可在线阅读,更多相关<C语言基本运算符与表达式.ppt(39页珍藏版)>请在人人文库网上搜索. 1.a,1,基本运算符和表达式, ...

  8. [JAVAEE] Thymeleaf 基本语法:常用表达式

    Thymeleaf 基本语法 常用表达式 变量表达式 ${ } 使用方法:th:xx = "${ }" 获取对象属性值给 th:xx . 后台代码: Student s=new S ...

  9. c语言表达式用法,C语言开发之运算符、表达式用法

    C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一.C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性.在 ...

最新文章

  1. Linux 的内存管理工具和调优参数
  2. 【extjs6学习笔记】1.1 初始:创建项目
  3. 字节Java面试必问:mysql索引类型属于
  4. Shell遍历hadoop目录的批量操作
  5. [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
  6. 如何在ABAP Development Tool里只显示能在SAP云平台上使用的ABAP资源
  7. 使用UAA OAuth2授权服务器–客户端和资源
  8. php面试题之一——PHP核心技术(高级部分)
  9. 【Java】字符串substring方法在jkd6,7,8中的差异
  10. Windows Server Update Service 3.0 配置向导
  11. 计算机真有趣作文,真有趣作文10篇
  12. android黑名单挂断电话(endCall)反射方法获取
  13. 省级-上市公司数字经济数据(2013-2020年)
  14. pci-e服务器显卡性能,RTX 2080 Ti PCI-E性能测试:3.0 x16终于成为必需
  15. cuda 和 pytorch版本不一致torch.cuda.is_available()返回false——解决办法
  16. python实现趋势外推法
  17. 原腾讯QQ空间负责人,T13专家,黄希彤被爆近期被裁员,裁员原因令人唏嘘。。...
  18. android 定制手机刷机,怎么定制安卓刷机包
  19. AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘D:\\ModelTest\\yolov5-5
  20. android11用石墨文档,轻协作 | 石墨文档 for Android 版轻体验

热门文章

  1. 如何搭建mysql的学习环境_Mysql学习笔记【一、环境安装配置】
  2. 【 仿真 】基于多维相似性分析的移动定位方法仿真
  3. 【 FPGA 】半带 FIR 滤波器(Half-band FIR Filter)
  4. 函数空间中的最佳逼近
  5. JDK 5.0 注解的使用
  6. SSH没有password安全日志
  7. JavaScript基础初始时期分支(018)
  8. 获得H.264视频分辨率的方法
  9. DataTable分页控件设计(适用于Gridview和Repeater)
  10. php vbcrlf,我是这样打造自已的“菜刀”的,让一句话飞一会