具体请看范例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ol>
<!-- OGNL: object graph navigation language ,对象图导航语言-->
<!-- <s:property value="username"/>:这整个是s标签,只有标签中的username才是OGNL表达式 -->
<li>访问值栈action中的普通属性:username = <s:property value="username"/></li>
<!-- <s:property value="user。age"/>:只有标签中的 user.age 才是OGNL表达式 ,这里要注意,只有传值的时候才会构建user对象,不传值页面取值为null,-->
<!-- 当java类中有很多构造方法时,一定要确保有一个空的构造方法,不然就会报错,切记,domain中一定要有一个空构造 -->
<li>访问值栈中对象的普通属性(setter,getter方法):<s:property value="user.age"/></li>
<li>访问值栈中对象的普通属性:<s:property value="password.length()"/></li>
<!-- cat.miaomiao()方法返回一个字符串,那这个值就是一个字符串 -->
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()"/></li>
<!-- 在action中定义一个 public String hello(){return "hello word!"} 普通方法-->
<li>访问值栈中action的普通方法:<s:property value="hello()"/></li>
<!-- ############################################################################################ -->
<!-- 假如 NAME 是一个静态属性 -->
<li>访问静态属性:<s:property value="@com.haizhu.User@NAME"/></li>
<!-- 假如 CRY() 是一个静态方法,返回一个String类型的结果 -->
<li>访问静态方法:<s:property value="@com.haizhu.User@CRY()"/></li>
<!-- ############################################################################################ -->
<!-- 调用user(String str)构造方法,覆写toString()方法, -->
<li>访问普通类的构造方法:<s:property value="new com.haizhu.User('haizhu')"/></li>
<!-- ############################################################################################ -->
<li>访问list:<s:property value="users"/></li>
<li>访问list中某个元素:<s:property value="users[0]"/></li>
<li>访问list中某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问list中某个属性的集合中的特定值(一般使用第二种方法):<s:property value="users.{age}[0]"/>|<s:property value="users[0].age"/></li>
<!-- 方法set和方法list不一样,set没有顺序,所以不能使用下标 -->
<li>访问set:<s:property value="users"/></li>
<li>访问map:<s:property value="userMap"/></li>
<!-- 可以使用单引号,也可以使用双引号,使用双引号的时候要使用转义符 -->
<li>访问map中某个元素:<s:property value="userMap.key1"/>|<s:property value="userMap['key1']"/>|<s:property value="userMap[\"key1\"]"/></li>
<li>访问map中所有的key:<s:property value="userMap.keys"/></li>
<li>访问map中所有的value:<s:property value="userMap.values"/></li>
<li>访问容器的大小:<s:property value="userMap.size()"/></li>
<!-- ############################################################################################ -->
<!-- users集合中age等于1的 age集合,也就是1的集合,有几个符合的对象,集合就有几个1 -->
<li>投影(过滤):<s:property value="users.{?#this.age==1}.{age}"/></li>
<!-- users集合中age大于1的user中的第一个user的age集合,也就是第一个符合的user的age,不过封装成了集合 -->
<li>投影(过滤):<s:property value="users.{^#this.age>1}.{age}"/></li>
<!-- 最后一个符合的user的age集合 -->
<li>投影(过滤):<s:property value="users.{$#this.age>1}.{age}"/></li>
<!-- 判断符合条件的这个集合是否为空 -->
<li>投影(过滤):<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<!-- ############################################################################################ -->
<!-- 这是访问action值栈中,从上往下的值 , -->
<!-- [0],代表action的位置, -->
<li>中括号[]:<s:property value="[0]"/></li>
<li>中括号[]:<s:property value="[0].username"/></li>
</ol>
</body>
</html>
怎么样,有没有理解 OGNL 和 EL 表达式的区别?