博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2框架学习之四:OGNL表达式
阅读量:5771 次
发布时间:2019-06-18

本文共 5774 字,大约阅读时间需要 19 分钟。

前言

OGNL表达式的全称是Object Graph Navigation Language,就是对象导航图语言。使用OGNL表达式可以使用简单的语法设置以及读取Java对象的值,还包括调用对象的方法,实现类型转换等功能。而且,OGNL表达式的强大还不止于此。我们知道在JSP中已经内置了表达式语言,那么使用OGNL表达式的优势是什么呢?主要是语法变得更简单以及功能的更强大。这两点会在后面的内容加以体现。

对象的操作

使用OGNL表达式实现对象的操作,包括以下几个方面:

1、访问JavaBean属性

2、调用对象的方法
3、调用静态方法和静态字段
4、调用构造方法

1、访问JavaBean属性

这是Struts2中最常使用的功能了,首先创建如下的JavaBean:

package com.rhwayfun.struts2.model;public class User {    private Address address;    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Address getAddress() {        return address;    }    public void setAddress(Address address) {        this.address = address;    }}

那么实现访问JavaBean属性有以下两个表达式:nameaddre.street。第一个表达式的Java实现代码是user.getName(),第二个表达式的Java实现代码是user.getAddress().getStreet()

2、访问对象的普通方法

访问JavaBean属性的时候,实际上就是调用了对象的getter方法,所以需要调用对象的普通方法的时候就可以使用类似Java代码的方式直接访问对象的方法。比如,需要把User对象的name属性转为大写的形式,那么OGNL表达式可以写为name.toUpperCase()

3、调用静态方法和静态字段

访问静态字段和方法的时候,需要使用如下的语法格式:

//访问静态方法@class@method(args)//访问静态字段@class@filed/*    需要注意的是,class需要给出完整的类名,如果省略不写的话,默认访问的是java.lang.Math类。*/

4、访问构造方法

访问构造方法的时候,可以使用new关键字创建一个对象,但是在使用的时候必须指出类的完整包名。

集合的操作

集合的操作是web开发中经常使用到的,下面对使用OGNL表达式创建集合做一个小结:

1、创建列表

比如需要创建一个列表,语法就是使用花括号,列表元素之间使用逗号隔开,比如:

{
"liubei","guanyu","zhaoyun"}

其实现的Java代码就是创建一个ArrayList对象,把这三个元素添加到List中。访问列表元素的时候,使用索引就可以成功访问,比如需要访问第一个元素,那么表达式可以写成{"liubei","guanyu","zhaoyun"}[0]

2、创建数组

在OGNL中创建数组的语法与Java中是一致的,比如创建三个元素的整型数组:new int[]{1,2,3}。那么访问数组元素的时候同样是使用索引,比如访问第一个元素:new int[]{1,2,3}[0]。

3、创建Map

创建Map的语法与Java中不太一样,使用的语法如下:

#{
"key1":"value1","key2":"value2",....}

在使用上述语法创建的Map与在Java中创建HashMap是一样的,然后把其中的元素放入其中。当然可以使用@class@{"key1":"value1",...}的语法创建指定类型的Map。访问Map元素是通过key访问的,比如访问Map的第一个元素,使用表达式map["first"]或者map.first

OGNL表达式实战

首先我们需要创建一个Action类,代码如下:

package com.rhwayfun.struts2.action;import java.util.ArrayList;import java.util.List;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.rhwayfun.struts2.model.User;public class OgnlAction extends ActionSupport{
private static final long serialVersionUID = 1L; private List
users; private static String str = "ognl"; public String execute(){ //获取web元素,以便访问Servlet API ActionContext context = ActionContext.getContext(); //获取request对象 @SuppressWarnings("unchecked") Map
request = (Map
) context.get("request"); //获取session对象 Map
session = context.getSession(); //获取Application对象 Map
application = context.getApplication(); //分别在三个域对象中设置一个值 request.put("msg", "我是request元素"); session.put("msg", "我是session元素"); application.put("msg", "我是application元素"); //创建两个User对象 users = new ArrayList
(); User u1 = new User(); u1.setName("zhaoyun"); u1.setAge(23); User u2 = new User(); u2.setName("zhangfei"); u2.setAge(26); //添加到集合中 users.add(u1); users.add(u2); return SUCCESS; } public List
getUsers() { return users; } public void setUsers(List
users) { this.users = users; }}

然后在struts.xml文件配置该action,如下:

/ognl.jsp

接着编写ognl.jsp页面,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>          OGNL表达式    

1、访问web元素中的值

request:

session:

application:


2、访问list

3、通过OGNL表达式直接创建列表并访问

创建一个列表:{'赵云','刘备','张飞'}

访问列表的元素个数:
访问列表的第二个元素:

4、创建一个数组并访问

 

5、构造map并访问

遍历该map(第一种方式):
 
遍历该map(第二种方式):
=
 
访问第一个元素(不使用%):
访问第一个元素(使用%):
获取该map所有的key:
获取该map所有的value:

6、访问静态方法和字段

访问Math类的floor方法(由于Math类是Struts2中默认的类

, 所以在调用此类方法的时候,其中的class可以不写出)
访问静态方法::
等价于
访问静态属性:

7、访问构造方法

访问User类的有参构造方法:

8、if/else判断语句

关羽在集合中
赵云在集合中
关羽不在集合中
请求消息不在集合中

9、迭代标签完整版

创建一个list列表:abcde

索引:
 值:
 当前迭代数量:

10、获取属性范围内的值

<% request.setAttribute("req", "request对象"); request.getSession().setAttribute("ses", "session对象"); request.getSession().getServletContext().setAttribute("app", "application对象"); %> request:

session:
application:

通过以上的ognl.jsp页面对平时开发中经常使用的语法进行了归类和测试,具体的内容已经在代码给出注释了,这里不再赘述。

Struts 2中的值栈

值栈就是用来存放对象的,类似于正常的栈,符合先进后出的特性。在值栈中可以存放、查询和删除对象。值栈是Struts 2框架的核心。值栈实际上是一个接口(该接口是com.opensymphony.xwork2.util.ValueStack),我们平时在开发是使用的<s:debug>标签实际上使用的是该接口的实现类,也就是com.opensymphony.xwork2.ognl.OgnlValueStack类。

转载地址:http://okpux.baihongyu.com/

你可能感兴趣的文章
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
CString、Char* ,char [20]、wchar_t、unsigned short转化
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
excel进行矩阵计算
查看>>
基于Android平台的动态生成控件和动态改变控件位置的方法
查看>>
BOM
查看>>
iOS: Block的循环引用
查看>>
MySQL类型转换
查看>>
变量声明提升1
查看>>
sed 对目录进行操作
查看>>
移动端开发单位——rem,动态使用
查看>>