一、首先了解下OGNL的概念:
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
此外,还得先需弄懂OGNL的一些知识:
1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:。
3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
4.值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。
OGNL中重要的3个符号:#、%、$:
#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号
#符号的用途一般有三种。
— 访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
— 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。
— 用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。
2.%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
3.$符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
— 在Struts 2框架的配置文件中引用OGNL表达式,例如:
- <validators>
- <field name="intb">
- <field-validator type="int">
- <param name="min">10param>
- <param name="max">100param>
- <message>BAction-test校验:数字必须为${min}为${max}之间!message>
- field-validator>
- field>
- validators>
************************************************************
二、代码
ognl 取action类中的值到jsp页面中
struts.xml中:
/pages/testognl.jsp
/pages/login-error.jsp
jsp页面中:
类中:
实体猫:
package com.etc.entity;
public class Cat {
public static String name="tom";
public static String catmeth() {
System.out.println("catmeth");
return "catmeth";
}
}
实体狗:
package com.etc.entity;
public class Dog {
private String name="mangge";
public String dogeat() {
System.out.println("dogeat");
return "dogeat";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
实体person:
package com.etc.entity;
public class Person {
private String name;
private String pass;
private int age;
private Dog dog = new Dog();
public Person(String name,int age) {
super();
this.name = name;
this.age = age;
}
public String eat() {
System.out.println("eat");
return "eat";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
web类:
package com.etc.web;
import java.util.ArrayList;
import java.util.List;
import com.etc.entity.Cat;
import com.etc.entity.Dog;
import com.etc.entity.Person;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String name;
private String pass;
private Person person;
private List
persons;
@Override
public String execute() throws Exception {
System.out.println(this.getText("login.name"));
System.out.println("execute");
System.out.println(name+":"+pass);
return "success";
}
public String testognl(){
System.out.println("login");
System.out.println(name+":"+pass);
persons = new ArrayList();
person = new Person("zhansan",20);
Person p1 = new Person("lisi",15);
Person p2 = new Person("wangwu",22);
persons.add(person);
persons.add(p1);
persons.add(p2);
return "testognl";
}
public String meth(){
System.out.println("meth");
return "meth";
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public List getPersons() {
return persons;
}
public void setPersons(List persons) {
this.persons = persons;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}