Struts2学习——1400OGNL2访问方法与属性

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>

若有不足之处,请不吝赐教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章