OGNL
来源:互联网 发布:c书籍推荐知乎 编辑:程序博客网 时间:2024/06/05 09:45
Struts 2支持以下几种表达式语言:
- OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
- JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
- Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
- Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
- 支持对象方法调用,如xxx.doSomeSpecial();
- 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
- 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
- 访问OGNL上下文(OGNL context)和ActionContext;
- 操作集合对象
OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。大家经常遇到的问题是#、%和$这三个符号的使用。
- 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
- 用于过滤和投影(projecting)集合,如books.{?#this.price<100}。
- 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
个人觉得OGNL真的很简单,即使有的表达方式忘了也没关系,一查就搞定了,尚学堂的教学中有个例子不错,基本上常用的都包括了。
下面是OGNL表达式的使用例子。
<?xml version="1.0" encoding="GB18030" ?><%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030" /><title>OGNL表达式语言学习</title></head><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></body></html>
下面是对应的java,都是最简单的class
OgnlAction.java
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 username; private String password; private User user; 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 String m() { return "hello"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } public Map<String, Dog> getDogMap() { return dogMap; } public void setDogMap(Map<String, Dog> dogMap) { this.dogMap = dogMap; } public Set<Dog> getDogs() { return dogs; } public void setDogs(Set<Dog> dogs) { this.dogs = dogs; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; }}
Dog.java
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;}}
Cat.java
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";}}
User.java
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;}}
S.java
package com.bjsxt.struts2.ognl;public class S {public static String STR = "STATIC STRING";public static String s() {return "static method";}}
0 0
- ognl
- ognl
- OGNL
- OGNL
- OGNL
- OGNL
- OGNL
- ognl
- OGNL
- ognl
- ognl
- ognl
- ognl
- ognl
- ognl
- ognl
- ognl
- ognl
- 对称矩阵 压缩存储
- 自动获取短信验证码并填写到编辑框中
- php操作sphinx
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- Mysql varchar VS Oracle varchar2
- OGNL
- C++ 数据结构 广义表
- 栈和队列 相关 面试题
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- android缓存清理
- Linux 常见环境变量、文件类型、权限管理
- JavaWeb学习之注册登录功能实现过程中出现的问题及解决
- JDK1.8新特性--之默认接口
- Linux 中find命令与文件权限