OGNL2访问方法与属性
在上一小节中,我们访问了值栈中action的属性,值栈中对象的属性。在本小节中将访问值栈中action的属性与方法,值栈中对象的属性与方法,还有静态属性与方法。
1.访问普通属性值及方法
为了更好的做实验,重新定义了两个class,Cat和Dog,代码如下所示。
Cat
package com.bjsxt.struts2.ognl;
public class Cat {
private Dog friend;
private String name;
public String eat(){
return "cat eating...";
}
public Dog getFriend() {
return friend;
}
public void setFriend(Dog friend) {
this.friend = friend;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
易得,Cat中有一个成员变量,类型为Dog,name=friend;有成员变量 name,有方法eat()。
Dog
package com.bjsxt.struts2.ognl;
public class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Dog中只有一个成员变量name。
同时,也对OgnlAction进行了一些添加
package com.bjsxt.struts2.ognl;
import com.opensymphony.xwork2.ActionSupport;
public class OgnlAction extends ActionSupport {
private Cat cat;
private String password;
private User user;
private String username;
public String r_str(){
return "action_str";
}
public String execute() {
return SUCCESS;
}
public Cat getCat() {
return cat;
}
public String getPassword() {
return password;
}
public User getUser() {
return user;
}
public String getUsername() {
return username;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setPassword(String password) {
this.password = password;
}
public void setUser(User user) {
this.user = user;
}
public void setUsername(String username) {
this.username = username;
}
}
可以看到添加了一个成员变量Cat cat,还有一个方法r_str();
接下来,在ognl.jsp中修改,取出值栈中的Action或者是对象的成员变量、方法。
ognl.jsp(增加的部分代码)
<li>访问值栈中的对象的普通属性: <s:property value="cat.friend.name"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="password.length()"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="cat.eat()"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="r_str()"/></li>
得到的结果,如下图
其实ognl说到底,就是代码中,value=之后的那部分,主要是一些规则,用以取出变量值以及方法。
2. 访问静态属性及方法
为了做这个实验,定义了一个新的class
Static_Example
package com.bjsxt.struts2.ognl;
public class Static_Example {
public static String static_value="STATIC_VALUE";
public static String r_static_str(){
return "static method()";
}
}
里面有一个静态变量,一个静态方法。
在ognl.jsp中添加相应的ognl语句
<li>访问静态方法: <s:property value="@com.bjsxt.struts2.ognl.Static_Example@r_static_str()"/></li>
<li>访问静态属性: <s:property value="@com.bjsxt.struts2.ognl.Static_Example@static_value"/></li>
<li>访问Math类型静态属性: <s:property value="@@max(2,3)"/></li>
得到结果,如下图所示:
从结果中,可以看出,要取出静态方法或是静态属性,ognl规则为
@完整类名@方法名或属性名
获取静态math类型静态属性
@@Math表达式
【附】ognl.jsp(全)
<?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>访问值栈中的对象的普通属性: <s:property value="cat.friend.name"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="password.length()"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="cat.eat()"/></li>
<li>访问值栈中的对象的普通方法: <s:property value="r_str()"/></li>
<hr/>
<li>访问静态方法: <s:property value="@com.bjsxt.struts2.ognl.Static_Example@r_static_str()"/></li>
<li>访问静态属性: <s:property value="@com.bjsxt.struts2.ognl.Static_Example@static_value"/></li>
<li>访问Math类型静态属性: <s:property value="@@max(2,3)"/></li>
<hr/>
</ol>
<s:debug></s:debug>
</body>
</html>
若有不足之处,请不吝赐教