OGNL表达式的使用方法 .
OGNL表达式的使用方法
定义:
OGNL是对象图导航语言(即该表达式访问的是对象及对象的属性)
知识点:
1.基本属性的访问
1.1 访问值栈中action的普通属性
- <s:property value="username"/>
1.2 访问值栈中对象的普通属性
- <s:property value="student.age"/>
1.3 访问值栈中对象(对象包含对象)的普通属性
- <s:property value="cat.friend.name"/>
1.4 访问值栈中对象的普通方法
- <s:property value="cat.friend.say().length()"/>
1.5 访问值栈中action的普通方法
- <s:property value="execute()"/>
1.6 访问静态方法
- <s:property value="@com.wj.struts2.util.OGNLUtil@getString()"/>
1.7 访问静态属性
- <s:property value="@com.wj.struts2.util.OGNLUtil@URL"/>
1.8 访问Math类的属性
- <s:property value="@@max(5,3)"/>
1.9 访问普通类的构造方法
- <s:property value="new com.wj.struts2.action.model.Dog()"/>
2.访问容器
2.1 访问List
2.1.1 访问list
- <s:property value="list"/>
2.1.2 访问list中的某个元素
- <s:property value="list[2]"/>
2.1.3 访问list中某个元素属性的集合
- <s:property value="list.{no}"/>
2.1.4 访问list中某个元素的属性
- <s:property value="list[2].no"/>
2.2 访问Set
2.2.1 访问set
- <s:property value="set"/>
2.2.2 访问set中的某个元素(不可访问,set无顺序)
2.3 访问Map
2.3.1 访问Map
- <s:property value="map"/>
2.3.2 访问Map中的某个元素
- <s:property value="map['key']"/>
2.3.3 访问Map中的所有key
- <s:property value="map.keys"/>
2.3.4 访问Map中的所有value
- <s:property value="map.values"/>
2.3.5 访问容器的大小
- <s:property value="map.size()"/>
3.投影
3.1 通过投影访问list中年龄为25的学生的姓名
- <s:property value="list.{?#this.age==25}[0].{no}[0]"/>
3.2 通过投影访问list中年龄大于25的集合中的首元素的姓名
- <s:property value="list.{^#this.age>20}.{no}"/>
3.3 通过投影访问list中年龄大于25的集合中的尾元素的姓名
- <s:property value="list.{$#this.age>20}.{no}"/>
3.4 通过投影判断list中年龄大于25的集合是否为空
- <s:property value="list.{?#this.age>25}==null"/>
4.栈
用[]来访问栈中的元素,注意:[0]表示从栈中的开始位置进行遍历其中的元素
- <s:property value="[1][0].execute()"/>
示例代码
OGNLAction.java
- /**
- * OGNL表达式
- * @author 健
- */
- public class OGNLAction extends ActionSupport{
- /**
- * 序列化
- */
- private static final long serialVersionUID = 1L;
- /**
- * 猫
- */
- private Cat cat;
- /**
- * List
- */
- private List <Student>list;
- /**
- * Map
- */
- private Map <String,Dog>map;
- /**
- * 密码
- */
- private String password;
- /**
- * Set
- */
- private Set <Dog>set;
- /**
- * 学生
- */
- private Student student;
- /**
- * 用户名
- */
- private String username;
- public OGNLAction(){
- this.list = new ArrayList<Student>();
- Student student1 = new Student("zhangsan",20);
- Student student2 = new Student("lisi",25);
- Student student3 = new Student("wangwu",28);
- Student student4 = new Student("zhaoliu",24);
- Student student5 = new Student("xiaotaoqi",18);
- list.add(student1);
- list.add(student2);
- list.add(student3);
- list.add(student4);
- list.add(student5);
- this.set = new HashSet<Dog>();
- Dog dog1 = new Dog("bandeng");
- Dog dog2 = new Dog("zhuozi");
- Dog dog3 = new Dog("yizi");
- set.add(dog1);
- set.add(dog2);
- set.add(dog3);
- this.map = new HashMap<String, Dog>();
- map.put("0001", dog1);
- map.put("0002", dog2);
- map.put("0003", dog3);
- }
- /**
- * 控制器
- * @return 跳转的页面
- */
- @Override
- public String execute(){
- return "success";
- }
- /**
- * 取得cat
- * @return cat
- */
- public Cat getCat() {
- return cat;
- }
- /**
- * 取得list
- * @return list
- */
- public List<Student> getList() {
- return list;
- }
- /**
- * 取得map
- * @return map
- */
- public Map<String, Dog> getMap() {
- return map;
- }
- /**
- * 取得password
- * @return password
- */
- public String getPassword() {
- return password;
- }
- /**
- * 取得set
- * @return set
- */
- public Set<Dog> getSet() {
- return set;
- }
- /**
- * 取得student
- * @return student
- */
- public Student getStudent() {
- return student;
- }
- /**
- * 取得username
- * @return username
- */
- public String getUsername() {
- return username;
- }
- /**
- * 设置cat
- * @param cat cat
- */
- public void setCat(Cat cat) {
- this.cat = cat;
- }
- /**
- * 设置list
- * @param list list
- */
- public void setList(List<Student> list) {
- this.list = list;
- }
- /**
- * 设置map
- * @param map map
- */
- public void setMap(Map<String, Dog> map) {
- this.map = map;
- }
- /**
- * 设置password
- * @param password password
- */
- public void setPassword(String password) {
- this.password = password;
- }
- /**
- * 设置set
- * @param set set
- */
- public void setSet(Set<Dog> set) {
- this.set = set;
- }
- /**
- * 设置student
- * @param student student
- */
- public void setStudent(Student student) {
- this.student = student;
- }
- /**
- * 设置username
- * @param username username
- */
- public void setUsername(String username) {
- this.username = username;
- }
- }
ChainAction.java
- /**
- * OGNL表达式
- * @author 健
- */
- public class ChainAction extends ActionSupport{
- /**
- * 序列化
- */
- private static final long serialVersionUID = 1L;
- /**
- * 控制器
- * @return 跳转的页面
- */
- @Override
- public String execute(){
- return "success";
- }
- }
OGNLUtil.java
- /**
- * 工具类
- * @author 健
- */
- public class OGNLUtil {
- /**
- * 静态常量
- */
- public static final String URL = "static property";
- /**
- * 静态方法
- * @return 字符串
- */
- public static String getString(){
- return "static method";
- }
- }
Cat.java
- /**
- * 猫
- * @author 健
- */
- public class Cat {
- /**
- * 名字
- */
- private String name;
- /**
- * 朋友
- */
- private Dog friend;
- /**
- * 取得name
- * @return name
- */
- public String getName() {
- return name;
- }
- /**
- * 设置name
- * @param name name
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * 取得friend
- * @return friend
- */
- public Dog getFriend() {
- return friend;
- }
- /**
- * 设置friend
- * @param friend friend
- */
- public void setFriend(Dog friend) {
- this.friend = friend;
- }
- /**
- * 类方法
- * @return 返回字符串
- */
- public String say(){
- return "miaomiao";
- }
- /**
- * 构造
- */
- public Cat(){
- System.out.println("cat constructor");
- }
- /**
- * 重写toString方法
- */
- public String toString(){
- return "cat name is" + this.name;
- }
- }
Dog.java
- /**
- * 狗
- * @author 健
- */
- public class Dog {
- /**
- * 名字
- */
- private String name;
- /**
- * 构造
- */
- public Dog(){
- System.out.println("dog constructor");
- }
- /**
- * 构造
- */
- public Dog(String name){
- this.name = name;
- }
- /**
- * 取得name
- * @return name
- */
- public String getName() {
- return name;
- }
- /**
- * 设置name
- * @param name name
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * 类方法
- * @return 返回字符串
- */
- public String say(){
- return "miaomiao";
- }
- /**
- * 重写toString方法
- */
- public String toString(){
- return "dog name is" + this.name;
- }
- }
Student.java
- /**
- * 学生类
- * @author 健
- */
- public class Student {
- /**
- * 学号
- */
- private String no;
- /**
- * 年龄
- */
- private int age;
- /**
- * 构造方法
- */
- public Student(){
- System.out.println("进入学生类的构造方法");
- }
- /**
- * 构造方法
- */
- public Student(String no,int age){
- this.age = age;
- this.no = no;
- }
- /**
- * 取得no
- * @return no
- */
- public String getNo() {
- return no;
- }
- /**
- * 设置no
- * @param no no
- */
- public void setNo(String no) {
- this.no = no;
- }
- /**
- * 取得age
- * @return age
- */
- public int getAge() {
- return age;
- }
- /**
- * 设置age
- * @param age age
- */
- public void setAge(int age) {
- this.age = age;
- }
- /**
- * 重写toString方法
- */
- public String toString(){
- return "Student : " + this.no + " , " + this.age;
- }
- }
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.devMode" value="true"/>
- <!-- 配置允许静态方法的访问 -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
- <!-- 包含的文件 -->
- <include file="ognl.xml"></include>
- </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" namespace="/ognl" extends="struts-default">
- <action name="ognl" class="com.wj.struts2.action.OGNLAction" >
- <result name="success">/result.jsp</result>
- </action>
- <action name="chain" class="com.wj.struts2.action.ChainAction">
- <result type="chain" >
- <param name="actionName">ognl</param>
- <param name="namespace">/ognl</param>
- </result>
- </action>
- </package>
- </struts>
index.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme() + "://"
- + request.getServerName() + ":" + request.getServerPort()
- + path + "/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>Struts2_OGNL</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css">
- -->
- </head>
- <body>
- <div>
- 访问基本元素
- <li><a href="ognl/ognl?username=wangjian&password=123456" mce_href="ognl/ognl?username=wangjian&password=123456">1.访问值栈中action的普通属性</a></li>
- <li><a href="ognl/ognl?student.age=20&student.no=0001" mce_href="ognl/ognl?student.age=20&student.no=0001">2.访问值栈中对象的普通属性</a></li>
- <li><a href="ognl/ognl?cat.friend.name=oudy" mce_href="ognl/ognl?cat.friend.name=oudy">3.访问值栈中对象(对象包含对象)的普通属性</a></li>
- <li><a href="ognl/ognl?cat.friend.name=oudy" mce_href="ognl/ognl?cat.friend.name=oudy">4.访问值栈中对象的普通方法</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">5.访问值栈中action的普通方法</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">6.访问静态方法</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">7.访问静态属性</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">8.访问Math类的属性</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">9.访问普通类的构造方法</a></li>
- </div>
- <br>
- <br>
- <div>
- 访问容器<br>
- (一)访问List<br>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">1.访问list</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">2.访问list中的某个元素</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">3.访问list中某个元素属性的集合</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">4.访问list中某个元素的属性</a></li><br>
- (二)访问Set<br>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">1.访问set</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">2.访问set中的某个元素(不可访问,set无顺序)</a></li><br>
- (三)访问Map<br>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">1.访问Map</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">2.访问Map中的某个元素</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">3.访问Map中的所有key</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">4.访问Map中的所有value</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">5.访问容器的大小</a></li>
- <br>
- </div>
- <br>
- <br>
- <div>
- 投影<br>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">1.通过投影访问list中年龄为25的学生的姓名</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">2.通过投影访问list中年龄大于25的集合中的首元素的姓名</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">3.通过投影访问list中年龄大于25的集合中的尾元素的姓名</a></li>
- <li><a href="ognl/ognl" mce_href="ognl/ognl">4.通过投影判断list中年龄大于25的集合是否为空</a></li><br>
- </div>
- <br>
- <br>
- <div>
- 栈<br>
- <li><a href="ognl/chain" mce_href="ognl/chain">用[]来访问栈中的元素,注意:[1]表示从栈中的开始位置进行遍历其中的元素</a></li>
- </div>
- </body>
- </html>
result.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme() + "://"
- + request.getServerName() + ":" + request.getServerPort()
- + path + "/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>Struts2_OGNL</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css">
- -->
- </head>
- <body>
- 访问值栈中action的普通属性:<br>
- <li>username:<s:property value="username"/></li>
- <li>password:<s:property value="password"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问值栈中对象的普通属性<br>
- <li>student:<s:property value="student"/></li>
- <li>no:<s:property value="student.no"/></li>
- <li>age:<s:property value="student.age"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问值栈中对象(对象包含对象)的普通属性<br>
- <li>friendName:<s:property value="cat.friend.name"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问值栈中对象的普通方法<br>
- <li>method01:<s:property value="cat.friend.say().length()"/></li>
- <li>method02:<s:property value="cat.say()"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问值栈中action的普通方法<br>
- <li>method:<s:property value="execute()"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问静态方法<br>
- <li>static method:<s:property value="@com.wj.struts2.util.OGNLUtil@getString()"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问静态属性<br>
- <li>static property:<s:property value="@com.wj.struts2.util.OGNLUtil@URL"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问静态属性<br>
- <li>Math method:<s:property value="@@max(5,3)"/></li>
- <br>
- ----------------------------------------
- <br>
- 访问普通类的构造方法<br>
- <li>Constructer method:<s:property value="new com.wj.struts2.action.model.Dog()"/></li>
- <br>
- ----------------------------------------
- <br>
- <br>
- <br>
- 访问容器<br>
- (一)访问List<br>
- <li>1.访问list----<s:property value="list"/></li>
- <li>2.访问list中的某个元素----<s:property value="list[2]"/></li>
- <li>3.访问list中某个元素属性的集合----<s:property value="list.{no}"/></li>
- <li>4.访问list中某个元素的属性----<s:property value="list[2].no"/></li><br>
- (二)访问Set<br>
- <li>1.访问set----<s:property value="set"/></li>
- <li>2.访问set中的某个元素(不可访问,set无顺序)----<s:property value="set[1]"/></li><br>
- (三)访问Map<br>
- <li>1.访问Map----<s:property value="map"/></li>
- <li>2.访问Map中的某个元素----<s:property value="map['0001']"/></li>
- <li>3.访问Map中的所有key----<s:property value="map.keys"/></li>
- <li>4.访问Map中的所有value----<s:property value="map.values"/></li>
- <li>5.访问容器的大小----<s:property value="map.size()"/></li>
- <br>
- ----------------------------------------
- <br>
- <br>
- <br>
- <div>
- 投影<br>
- <li>1.通过投影访问list中年龄为25的学生的姓名----<s:property value="list.{?#this.age==25}[0].{no}[0]"/></li>
- <li>2.通过投影访问list中年龄大于25的集合中的首元素的姓名----<s:property value="list.{^#this.age>20}.{no}"/></li>
- <li>3.通过投影访问list中年龄大于25的集合中的尾元素的姓名----<s:property value="list.{$#this.age>20}.{no}"/></li>
- <li>4.通过投影判断list中年龄大于25的集合是否为空----<s:property value="list.{?#this.age>25}==null"/></li><br>
- </div>
- ----------------------------------------
- <br>
- <br>
- <br>
- <div>
- 栈<br>
- <li>用[]来访问栈中的元素,注意:[0]中0表示从栈中的开始位置进行遍历其中的元素----<s:property value="[1][0].execute()"/></li>
- </div>
- <s:debug></s:debug>
- </body>
- </html>