码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2(六)

时间:2018-01-03 22:33:26      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:tor   key   表达   ons   不容易   person   直接   配置文件   throws   

以下内容是基于导入struts2-2.3.32.jar包来讲的

1.OGNL

  OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言  

  OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。

作用:

1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
 @[类全名(包括包路径)]@[方法名 |  值名],例如:
    @java.lang.String@format(‘foo %s‘, ‘bar‘)
    或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8,
     calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。

ognl表达式取值,如果是根元素取值不用带#符号, 非根元素取值要带#号!

知识点:

1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
 
2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。
 
3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
 
4.值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚。
1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==‘pla1‘}.{age}[0]。

—    用来构造Map,例如示例中的#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—    在Struts 2框架的配置文件中引用OGNL表达式。

2.基本使用

技术分享图片

A.往根元素设置并获取值:

 1 package com.rong.web.test;
 2 
 3 import com.rong.web.entity.User;
 4 
 5 import ognl.Ognl;
 6 import ognl.OgnlContext;
 7 
 8 public class OGNLTest {
 9 
10     public static void main(String[] args) throws Exception{
11         //Ognl上下文OgnlContext实现了  java.util.Map 的接口,具有Map的功能
12         OgnlContext ognlContext = new OgnlContext();
13         ognlContext.put("username", "huge");
14         System.out.println(ognlContext.get("username"));
15         
16         User user=new User();
17         user.setId(57);
18         user.setName("rjl");
19         user.setAge(18);
20         //设置上下文根对象
21         ognlContext.setRoot(user);
22         //表达式
23         Object expression1 = Ognl.parseExpression("name");
24         Object expression2 = Ognl.parseExpression("id");
25         Object expression3 = Ognl.parseExpression("age");
26         Object value1 = Ognl.getValue(expression1, ognlContext, ognlContext.getRoot());
27         Object value2 = Ognl.getValue(expression2, ognlContext, ognlContext.getRoot());
28         Object value3 = Ognl.getValue(expression3, ognlContext, ognlContext.getRoot());
29 
30         System.out.println(value1.toString()+value2.toString()+value3.toString());
31     }
32 }

 B.往非根元素设置并获取值:

 

Struts2(六)

标签:tor   key   表达   ons   不容易   person   直接   配置文件   throws   

原文地址:https://www.cnblogs.com/57rongjielong/p/8185455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!