Struts2中OGNL表达式的用法

Struts2中OGNL表达式的用法

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,能通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。

一、为什么要使用OGNL
视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现。比如,要获取user对象的age属性,利用OGNL表达式可以写成:

<s:property value=“user.age”/>
而如果要换做Java脚本代码,则需要写成:

<%@ page import=“com.chongqing.model.User” %>
<%
User user = (User)request.getAttribute(“user”);
String age = user.getAge();
out.print(age);
%>
可以看出,利用OGNL表达式会更加清晰和简洁。

二、值栈(ValueStack)
OGNL有一个上下文(Context)的概念,说白了上下文就是一个MAP结构,它实现了Java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext ,它结构示意图如下:

                           |--request 

                           |--application 

OGNL context ------ | ValueStack(值栈,它是根对象)

                           |--session 

                           |--attr 

                           |--parameters

当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action 。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。

访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session等

另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。

可以通过<s:debug></s:debug>标签在浏览器上看到Context的内容,其实OGNL表达式就是用来访问Context中的内容。

三、OGNL表达式
OGNL表达式的语法多且杂,要全部总结出来有点困难,这里我偷一点懒,通过一个例子来说明,以后查阅也会方便一些。

OgnlAction类:

package com.chongqing.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 password;

private User user;
private String username;

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 Cat getCat() {
	return cat;
}

public Map<String, Dog> getDogMap() {
	return dogMap;
}

public Set<Dog> getDogs() {
	return dogs;
}

public String getPassword() {
	return password;
}

public User getUser() {
	return user;
}

public String getUsername() {
	return username;
}

public List<User> getUsers() {
	return users;
}

public String m() {
	return "hello";
}

public void setCat(Cat cat) {
	this.cat = cat;
}

public void setDogMap(Map<String, Dog> dogMap) {
	this.dogMap = dogMap;
}

public void setDogs(Set<Dog> dogs) {
	this.dogs = dogs;
}

public void setPassword(String password) {
	this.password = password;
}

public void setUser(User user) {
	this.user = user;
}

public void setUsername(String username) {
	this.username = username;
}

public void setUsers(List<User> users) {
	this.users = users;
}

}
User类:

package com.chongqing.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;
}

@Override
public String toString() {
	return "user" + age;
}

}
Cat类:

package com.chongqing.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";
}

}
Dog类:

package com.chongqing.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;
}

@Override
public String toString() {
	return "dog: " + name;
}

}
S类:

package com.chongqing.ognl;

public class S {
public static String STR = “STATIC STRING”;

public static String s() {
	return "static method";
}

}
ognl.jsp:

<?xml version="1.0" encoding="GB18030" ?>

<%@ page language=“java” contentType=“text/html; charset=GB18030”
pageEncoding=“GB18030”%>
<%@ taglib uri="/struts-tags" prefix=“s” %>

OGNL表达式语言学习
  1. <%-- 访问普通方法和属性: 1、通过域模型的方式只有传入参数,才会构造对象,或者直接在action中new也可以 --%>
  2. 访问值栈中的action的普通属性: username =
  3. 访问值栈中对象的普通属性(get set方法): | |
访问的URL为:

http://localhost:8080/Struts2_OGNL/ognl.action?username=u&password=p&user.age=11&cat.friend.name=oudy
结果为:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值