4、OGNL详解

关于hbm.xml映射文件

1、<id>元素映射OID
<generator>子元素用来设定标示符生成器。hibernate提供了多种内置的实现:

2、<property>元素映射值类型属性

- name属性:指定持久化类的属性的名字
- type属性:指定Hibernate或Java映射类型;Hibernate映射类型是Java类型与SQL类型的桥梁
- coloumn属性:指定与类的属性映射的表的字段名。

Java类型、Hibernate映射类型以及SQL类型之间的对应关系

3、通过Hibernate API操纵数据库

4、SessionFactory接口

一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。

5、Session接口:是Hibernate应用使用最广泛的接口;Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象;Session有以下特点:1)不是线程安全的,因此在设计软件架构时,应避免多个线程共享同一个Session实例。2)Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建和销毁Session对象。需要注意的是,此处所说的Session不是HttpSession

Session接口提供了操作数据库的各种方法:
- save()方法:把Java对象保存数据库中
- update()方法:更新数据库中的Java对象
- delete()方法:把Java对象从数据库中删除。
- get()方法:从数据库中加载Java对象。

6、用session来执行事务的流程:

Session session = factory.openSession();
Transaction ts;
try{
//开始一个事务
tx = session.beginTransaction();
//执行事务
......
//提交事务
tx.commit();
}
catch(Exception e){
    //如果出现异常,就撤销事务
   if(null != tx) tx.rollback();
    throw e;
}
finally{
    //不管事务执行成功与否,最后都关闭Session
    session.close();
}


7、OGNL(Object Graph Navigation Language),对象图导航语言

要想在web项目中使用OGNL,需要引入两个包:ognl-3.0.jar和javassist-3.7.ga.jar

OgnlContext类(上下文对象),实现了Map(public class ognl.OgnlContext implements java.util.Map),存在唯一的叫做根的对象(root),可以通过程序设定上下文当中的哪个对象作为根对象。

public class Person
{
	private String name;

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
	
}


 

public class Dog
{
	private String name;

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
}


 

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class OgnlTest
{
	public static void main(String[] args) throws Exception
	{
		Person person = new Person();
		person.setName("zhangsan");
		
		Dog dog = new Dog();
		dog.setName("wangcai");
		
		OgnlContext context = new OgnlContext();
		
		context.put("person", person);
		context.put("dog",dog);
		
		context.setRoot(person);
		
		Object object = Ognl.parseExpression("name");
		
		System.out.println(object);
		
		Object object2 = Ognl.getValue(object, context,context.getRoot());
		
		System.out.println(object2);
		System.out.println("------------------");
		
		Object object3 = Ognl.parseExpression("#person.name");
		
		System.out.println(object3);
		
		Object object4 = Ognl.getValue(object3, context,context.getRoot());
		
		System.out.println(object4);
		
		System.out.println("-------------");
		
		Object object5 = Ognl.parseExpression("#dog.name");
		
		System.out.println(object5);
		
		Object object6 = Ognl.getValue(object5, context,context.getRoot());
		
		System.out.println(object6);
		
		
	}
}


如果在Person中增加一个属性:

public class Person
{
	private String name;
	
	private Dog dog;
	

	public Dog getDog()
	{
		return dog;
	}

	public void setDog(Dog dog)
	{
		this.dog = dog;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
	
}


 

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class OgnlTest
{
	public static void main(String[] args) throws Exception
	{
		Person person = new Person();
		person.setName("zhangsan");
		
		Dog dog2 = new Dog();
		dog2.setName("hello");
		person.setDog(dog2);
		
		Dog dog = new Dog();
		dog.setName("wangcai");
		
		OgnlContext context = new OgnlContext();
		
		context.put("person", person);
		context.put("dog",dog);
		
		context.setRoot(person);
		
		Object object = Ognl.parseExpression("name");
		
		System.out.println(object);
		
		Object object2 = Ognl.getValue(object, context,context.getRoot());
		
		System.out.println(object2);
		System.out.println("------------------");
		
		Object object7 = Ognl.parseExpression("dog.name");
		
		System.out.println(object7);
		
		Object object8 = Ognl.getValue(object7, context,context.getRoot());
		
		System.out.println(object8);
		System.out.println("------------------");
		
		Object object3 = Ognl.parseExpression("#person.name");
		
		System.out.println(object3);
		
		Object object4 = Ognl.getValue(object3, context,context.getRoot());
		
		System.out.println(object4);
		
		System.out.println("-------------");
		
		Object object5 = Ognl.parseExpression("#dog.name");
		
		System.out.println(object5);
		
		Object object6 = Ognl.getValue(object5, context,context.getRoot());
		
		System.out.println(object6);
		
		
	}
}


 

8、在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get方法,如果寻找的不是根对象中的属性,那么则需要以#号开头,告诉OGNL,去寻找你所指定的特定对象中的属性。

 9、当使用OGNL调用静态方法的时候,需要按照如下语法编写表达式:
@package.classname@methodname(para)

对于OGNL来说java.lang.Math是其的默认类,如果调用java.lang.Math的静态方法时,无需指定类的名字,如@@min(4,10);

对于OGNL来说,数组与集合是一样的,都是通过下标索引来去访问的。构造集合的时候使用{。。。}形式。

 使用OGNL处理来处理映射(Map)的语法格式:
#{‘key1’:‘value1’,‘key2’:‘value2’,’key3’:‘value3’};//这个#跟

对于OGNL来说,数组和集合都是一样的,都是通过下标索引来去访问的。构造集合的时候使用{......}形式。

10、过滤(filtering):返回一个子集合,语法:collection.{? expression}

#persons.{? #this.name.length() > 4}

OGNL针对集合提供了一些伪属性(如size,isEmpty),让我们可以通过属性的方式来调用方法(本质原因在于集合当中的很多方法并不符合JavaBean的命名规则),但我们依然还可以通过调用方法来实现与伪属性相同的目的。

过滤(filtering),获取到集合中的第一个元素,collection.{^ expression}

过滤(filtering),获取到集合中的最后一个元素,collection.{$ expression}

11、在使用过滤操作时,我们通常都会使用#this,该表达式用于代表当前正在迭代的集合中的对象(联想增强的for循环)

12、投影(projection):collection.{expression}

投影与过滤的差别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作。

综合举例:

import java.util.ArrayList;
import java.util.List;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class OgnlTest
{
	public static void main(String[] args) throws Exception
	{
		Person person = new Person();
		person.setName("zhangsan");
		
		Dog dog2 = new Dog();
		dog2.setName("hello");
		person.setDog(dog2);
		
		Dog dog = new Dog();
		dog.setName("wangcai");
		
		OgnlContext context = new OgnlContext();
		
		context.put("person", person);
		context.put("dog",dog);
		
		context.setRoot(person);
		
		Object object = Ognl.parseExpression("name");
		
		System.out.println(object);
		
		Object object2 = Ognl.getValue(object, context,context.getRoot());
		
		System.out.println(object2);
		System.out.println("------------------");
		
		Object object7 = Ognl.parseExpression("dog.name");
		
		System.out.println(object7);
		
		Object object8 = Ognl.getValue(object7, context,context.getRoot());
		
		System.out.println(object8);
		System.out.println("------------------");
		
		Object object3 = Ognl.parseExpression("#person.name");
		
		System.out.println(object3);
		
		Object object4 = Ognl.getValue(object3, context,context.getRoot());
		
		System.out.println(object4);
		
		System.out.println("-------------");
		
		Object object5 = Ognl.parseExpression("#dog.name");
		
		System.out.println(object5);
		
		Object object6 = Ognl.getValue(object5, context,context.getRoot());
		
		System.out.println(object6);
		
		System.out.println("-------------");
		
		Object object9 = Ognl.parseExpression("name.toUpperCase()");
		
		System.out.println(object9);
		
		Object object10 = Ognl.getValue(object9, context,context.getRoot());
		
		System.out.println(object10);
		
		Object object11 = Ognl.parseExpression("name.toUpperCase().length()");
		
		System.out.println(object11);
		
		Object object12 = Ognl.getValue(object11, context,context.getRoot());
		
		System.out.println(object12);
		
		System.out.println("-------------");
		
		Object object13 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)");
		
		System.out.println(object13);
		
		Object object14 = Ognl.getValue(object13, context,context.getRoot());
		
		System.out.println(object14);
		
		System.out.println("-------------");
		
		Object object15 = Ognl.parseExpression("@@min(4,10)");
		
		System.out.println(object15);
		
		Object object16 = Ognl.getValue(object15, context,context.getRoot());
		
		System.out.println(object16);
		
		Object object17 = Ognl.parseExpression("@@E");
		
		Object object18 = Ognl.parseExpression("@@PI");
		//通过new方式生成对象
		Object object19 = Ognl.parseExpression("new java.util.LinkedList()");
		
		System.out.println(object19);
		
		Object object20 = Ognl.getValue(object19, context,context.getRoot());
		
		System.out.println(object20);
		//通过花括号的方式生成对象
		Object object21 = Ognl.getValue("{'aa','bb','cc','dd'}", context,context.getRoot());
		
		System.out.println(object21);
		//OGNL集合和数组都可以通过下标访问
		Object object22 = Ognl.getValue("{'aa','bb','cc','dd'}[3]", context,context.getRoot());
		
		System.out.println(object22);
		
		dog.setFriends(new String[]{"aa","bb","cc"});
		
		Object object23 = Ognl.getValue("#dog.friends[1]", context,context.getRoot());
		
		System.out.println(object23);
		
		System.out.println("-----------");
		
		List<String> list = new ArrayList<String>();
		
		list.add("hello");
		list.add("world");
		list.add("hello world");
		
		context.put("list", list);
		
		System.out.println(Ognl.getValue("#list[0]", context,context.getRoot()));
		//OGNL访问map
		System.out.println(Ognl.getValue("#{'key1':'value1','key2':'value2','key3':'value3'}", context,context.getRoot()));
		//访问map的一个具体的value,传一个key值
		System.out.println(Ognl.getValue("#{'key1':'value1','key2':'value2','key3':'value3'}['key3']", context,context.getRoot()));
		
		List<Person> persons = new ArrayList<Person>();
		
		Person p1 = new Person();
		Person p2 = new Person();
		Person p3 = new Person();
		
		p1.setName("zhangsan");
		p2.setName("lisi");
		p3.setName("wangwu");
		
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		
		context.put("persons", persons);
		
		//过滤(filtering),collection.{? expression}
		//#this代表当前的对象,类似增强的for循环
		System.out.println(Ognl.getValue("#persons.{? #this.name.length() > 4}", context,context.getRoot()));
		//过滤(filtering),获取到集合中的第一个元素,collection.{^ expression},虽然是第一个元素,但结果依然是一个集合
		System.out.println(Ognl.getValue("#persons.{^ #this.name.length() > 4}", context,context.getRoot()));
		//过滤(filtering),获取到集合中的最后一个元素,collection.{$ expression},
		System.out.println(Ognl.getValue("#persons.{$ #this.name.length() > 4}", context,context.getRoot()));
		//获取最后一个元素的name属性值
		System.out.println(Ognl.getValue("#persons.{$ #this.name.length() > 4}[0].name", context,context.getRoot()));
		
		//投影(projection),collection.{expression}
		System.out.println(Ognl.getValue("#persons.{name}",	context,context.getRoot()));
		
		System.out.println(Ognl.getValue("#persons.{#this.name.length() <= 5 ? 'hello world' : #this.name}",	context,context.getRoot()));
		
	}
}


 

13、struts2中OGNL的使用

在Struts2中有一个称之为值栈的概念(ValueStack)

struts2值栈提供了[N]语法和TOP关键字

在struts2中,根对象就是ValueStack。在Struts2的任何流程当中,ValueStack中的最顶层对象一定是Action对象。

所以如果页面中有<s:property value="username" />这个username一定是Action中的username。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值