Struts2 如何使用OGNL表达式



Struts2 如何使用OGNL表达式。1.OGNL是Object Graph Navitagtion Language,对象导航语言) 是一种功能强大的EL(Expression Language,表达式语言)。通过OGNL,可以使用简单一直的表达式语法,存储对象的任意属性,调用对象的方法,遍历整个对象的结果图和实现字段类型转换等功能。
2.OGNL表达式有如下几个特点:   A: 将视图元素好模型对象绑定在一起   B:  将表格元素同Swing TableModel 对应起来。   C:  将Web页面元素同后台服务业务对象对应起来
3.OGNL表达式的基础单元是导航连(Navigation chain),通常简称为链。最简单的链有如下部分组成:属性名,方法调用, 数组索引。
4.例如:有一本书 book,它有多个作者(author),每个作者都有个年龄(age).如果使用OGNl表达式获取这本书的第一个作者的年龄,并将年龄转换为字符串类型。则这个OGNL表达式为: book.author[0].age.toString(). 在这个OGNL表达式中,author[0]即为数组索引,age 为属性名,toString() 为方法。
5.OGNL提供的常量类型:

Java代码 复制代码 收藏代码
  1. 1.字符串常量
  2.   指以 单引号 ” 或 双引号 “” 括起来的字符串。 例如:‘HuiZhi’  和 “HuiZhi”。
  3. 在OGNL中可以使用单引号 来界定字符串常量,这点和Java不相同。但是如果一个字符串只有一个字符组成,则必须使用 双引号。
  4.   例如 :可以使用 “H”,却不能使用‘H’。
  5. 2.字符常量
  6.    指以单引号括起来的字符,例如‘H’
  7.   “H”与 ‘H’ 前者是字符串常量,后者是字符常量。
  8. 3.数值常量
  9.   指 int long float double BigDecimal BigInteger 类型常量
  10.   这些常量的指定形式如下:
  11.   例如: 123 指定了int 类型常量
  12.   例如: 123l 或者 1234L 指定long类型的常量
  13.   例如: 123.4f  指定float 类型常量
  14.   例如:123.4 或者 123.4D 或者123.4d 指定double类型的常量
  15.   例如:123B 或者 123b 指定 BigDecimal类型常量
  16.   例如: 123H 或者 123h  指定BigInteger 类型的常量
  17.    (数值后面的字母不区分大小写,例如 123l 和 123L 都正确)
  18.   布尔常量  true 和  false
  19.   null 常量
1.字符串常量
  指以 单引号 '' 或 双引号 “” 括起来的字符串。 例如:‘HuiZhi’  和 “HuiZhi”。
在OGNL中可以使用单引号 来界定字符串常量,这点和Java不相同。但是如果一个字符串只有一个字符组成,则必须使用 双引号。
  例如 :可以使用 “H”,却不能使用‘H’。

2.字符常量
   指以单引号括起来的字符,例如‘H’
  “H”与 ‘H’ 前者是字符串常量,后者是字符常量。

3.数值常量
  指 int long float double BigDecimal BigInteger 类型常量
  这些常量的指定形式如下:
  例如: 123 指定了int 类型常量
  例如: 123l 或者 1234L 指定long类型的常量 
  例如: 123.4f  指定float 类型常量
  例如:123.4 或者 123.4D 或者123.4d 指定double类型的常量
  例如:123B 或者 123b 指定 BigDecimal类型常量
  例如: 123H 或者 123h  指定BigInteger 类型的常量
   (数值后面的字母不区分大小写,例如 123l 和 123L 都正确)
  布尔常量  true 和  false
  null 常量

6.OGNL 操作符

Java代码 复制代码 收藏代码
  1. 1.逗号(,)操作符
  2.   逗号操作符用来分隔两个或多个独立的表达式,而整个表达式的值取值于最后一个表达式。例如 表达式 1+1,2+2
  3.   由于整个表达式的取值于最后一个表达式,所以该表达式的值为2+2 即为 4.
  4. 2.花括号“{}” 操作符
  5.   花括号操作符用来创建列表,例如表达式:
  6.   {“xiaoqi”,”xiaoxue”,”candy”}.
  7. 3.in 和 not in 操作符
  8.   in 和 not in 操作符用来判断一个值是否存在于一个指定的集合中。
  9.   例如:
  10.     userName in{“xiaoqi”,“candy”,“xiaoxue”} 和
  11.     userName not in {“xiaoqi”,“xiaoxue”,“candy”}
  12. 4.除了上面的操作符,OGNL还支持所有的java操作符(> < = >=)
1.逗号(,)操作符
  逗号操作符用来分隔两个或多个独立的表达式,而整个表达式的值取值于最后一个表达式。例如 表达式 1+1,2+2 
  由于整个表达式的取值于最后一个表达式,所以该表达式的值为2+2 即为 4.

2.花括号“{}” 操作符
  花括号操作符用来创建列表,例如表达式:
  {“xiaoqi”,"xiaoxue","candy"}.

3.in 和 not in 操作符
  in 和 not in 操作符用来判断一个值是否存在于一个指定的集合中。
  例如:
    userName in{“xiaoqi”,“candy”,“xiaoxue”} 和 
    userName not in {“xiaoqi”,“xiaoxue”,“candy”}

4.除了上面的操作符,OGNL还支持所有的java操作符(> < = >=)

===========7.OGNL提供调用任何方法的能力。======== 例如调用javabean的属性的getXXX() 方法,调用静态方法 或者 静态字段,调用构造方法。
—1.访问JavaBean的属性。也就是调用JavaBean的属性的getXXX()方法—

Java代码 复制代码 收藏代码
  1. 如果 OGNL上下文的根对象是一个Book类的实例对象book,则可以使用如下的OGNL表达式获取图书作者的姓名:
  2. book.getAuthor().getName()
  如果 OGNL上下文的根对象是一个Book类的实例对象book,则可以使用如下的OGNL表达式获取图书作者的姓名:
  book.getAuthor().getName()

———2.调用静态方法和静态字段——–

Java代码 复制代码 收藏代码
  1. OGNL支持调用类中的静态方法和静态字段。调用的语法格式如下:
  2. @class@method
  3. @class@field
  4. 例如:要将一个字符串123 转换成int类型数字的123,可以使用如下的代码,
  5.    @java.lang.Integer@parseInt(“123″)
  6. 其中 java.lang.Integer是类名,parseInt()是方法名。
  7. 其中类名必须完整,例如java.lang.Integer.不能只写Integer。而如果省略类    名,则默认类为 java.lang.Math.例如 调用 java.lang.Math类的max()方法。可以
  8. 使用如下格式。@@max(123,345).
  9. 调用静态字段。例如 调用 java.lang.Math类中的PI字段,代码如下
  10. @java.lang.Math@PI 或者 @@PI
  OGNL支持调用类中的静态方法和静态字段。调用的语法格式如下:
  @class@method
  @class@field
  例如:要将一个字符串123 转换成int类型数字的123,可以使用如下的代码,
     @java.lang.Integer@parseInt("123")
  其中 java.lang.Integer是类名,parseInt()是方法名。
  其中类名必须完整,例如java.lang.Integer.不能只写Integer。而如果省略类    名,则默认类为 java.lang.Math.例如 调用 java.lang.Math类的max()方法。可以
直接使用如下格式。@@max(123,345).
  调用静态字段。例如 调用 java.lang.Math类中的PI字段,代码如下
  @java.lang.Math@PI 或者 @@PI

——–3.调用构造方法——–

Java代码 复制代码 收藏代码
  1. OGNL还支付调用构造方法,使用new 关键字创建对象
  2. 例如  创建一个Date对象,代码如下:
  3. new java.util.Date().
  4. 这的类名也必须完整给出。
  OGNL还支付调用构造方法,使用new 关键字创建对象
  例如  创建一个Date对象,代码如下:
  new java.util.Date().
  这的类名也必须完整给出。

===========8.索引的访问=========== OGNL支持数组和列表索引,javabean的索引属性和OGNL对象索引属性。
——— 1 访问 数组和列表索引————-

Java代码 复制代码 收藏代码
  1.     new String[]{“a”,”b”,”c”}
  2.     则访问数组中第二个元素的OGNL表达式:
  3.     new String[]{“a”,”b”,”c”}[1].
  4.   在OGNL中,使用列表索引与是哟in个数组索引一样,例如如下表格:  {“aa”,”bb”,”ccc”}
  5. 则访问该列表的的二个元素的OGNL表达式为:
  6. {“aa”,”bb”,”ccc”}[1].
    new String[]{"a","b","c"}
    则访问数组中第二个元素的OGNL表达式:
    new String[]{"a","b","c"}[1].
  在OGNL中,使用列表索引与是哟in个数组索引一样,例如如下表格:  {"aa","bb","ccc"} 
则访问该列表的的二个元素的OGNL表达式为:
 {"aa","bb","ccc"}[1].

——— 2.javaBean的索引属性———-

Java代码 复制代码 收藏代码
  1. JavaBean的索引属性就是获取和这是数组时使用的属性。使用索引属性需要提供俩对setXX()和getXX()方法。其中,一对用于数组,另一对用户数组中的元素。
  2. 使用索引属性的语法格式如下:
  3. public PropetyType[] getPropertyName()
  4. public void setPropertyName(PropertyType[] values)
  5. public Property getPropertyName(int index)
  6. public void setPropertyName(int index,PropertyType value)
  7. 例如 创建一个索引属性 str 内容如下:
  8. private String[] str;
  9. public String[] getStr(){return str;}
  10. public void setStr(String[] str){this.str=str;}
  11. public String getStr(int i){return str[i];}
  12. public void setStr(int i,String newStr){str[i]=newStr;}
  13. 则 如下OGNL表达式:
  14. str[1] 可用用来调用getStr(1),获取数组的第二个元素值。
  15. 而如果是设置,则该表达式可以调用setStr(1,value)方法,设置数组的第儿歌元素值。
   JavaBean的索引属性就是获取和这是数组时使用的属性。使用索引属性需要提供俩对setXX()和getXX()方法。其中,一对用于数组,另一对用户数组中的元素。
  使用索引属性的语法格式如下:
  public PropetyType[] getPropertyName()
  public void setPropertyName(PropertyType[] values)
  public Property getPropertyName(int index)
  public void setPropertyName(int index,PropertyType value)

  例如 创建一个索引属性 str 内容如下:
  private String[] str;
  public String[] getStr(){return str;}
  public void setStr(String[] str){this.str=str;}
  public String getStr(int i){return str[i];}
  public void setStr(int i,String newStr){str[i]=newStr;}
  则 如下OGNL表达式:
  str[1] 可用用来调用getStr(1),获取数组的第二个元素值。
  而如果是设置,则该表达式可以调用setStr(1,value)方法,设置数组的第儿歌元素值。

———3.OGNL对象索引属性———–

Java代码 复制代码 收藏代码
  1. OGNL扩展了索引属性的概念,可是使用任意的对象来作为索引。这与javaBean不同。JavaBean的索引属性只能使用整形作为索引。
  2. 例如:session对象有如下设置和获取属性attribute的方法:
  3. public void setAttribute(String name,Object value)
  4. public Object getAttribute(String name)
  5. 可以使用如下表达式在sessino中设置一个attribute属性userName:
  6. session.attribute["userName"]
  OGNL扩展了索引属性的概念,可是使用任意的对象来作为索引。这与javaBean不同。JavaBean的索引属性只能使用整形作为索引。
  例如:session对象有如下设置和获取属性attribute的方法:
  public void setAttribute(String name,Object value)
  public Object getAttribute(String name)
  可以使用如下表达式在sessino中设置一个attribute属性userName:
  session.attribute["userName"]

======9.使用OGNL操作集合================ 创建列表,创建数组,创建Map
—————1.创建列表————–

Java代码 复制代码 收藏代码
  1. 就是使用花括号{}将元素括起来,多个元素之间使用 逗号 (,)都好隔开,例如 下面的OGNL表达式
  2. {“aaa”,“bbb”,“ccc”}
  3. 列表元素的访问方式,例如访问第一个元素
  4. {“aa”,“bb”,“cc”}[0]
就是使用花括号{}将元素括起来,多个元素之间使用 逗号 (,)都好隔开,例如 下面的OGNL表达式
{“aaa”,“bbb”,“ccc”}
列表元素的访问方式,例如访问第一个元素
{“aa”,“bb”,“cc”}[0]

———-2.创建数组———

Java代码 复制代码 收藏代码
  1. 需要使用new 关键字,例如下面代码
  2. new String[]{“a”,”b”,”v”}
  3. OGNL也支持如下方式new String[3],创建一个含有 3个元素的数组,但是没有指明数组的元素,则数组中的元素默认都是空字符串。
  4. 数组元素的访问方式,例如访问第一个元素
  5. new String[]{“a”,”c”,”v”}[0]
需要使用new 关键字,例如下面代码
new String[]{"a","b","v"}
OGNL也支持如下方式new String[3],创建一个含有 3个元素的数组,但是没有指明数组的元素,则数组中的元素默认都是空字符串。
数组元素的访问方式,例如访问第一个元素
new String[]{"a","c","v"}[0]

——–3.创建Map————

Java代码 复制代码 收藏代码
  1. 需要使用#{}操作符和 key—value键值对。语法格式如下
  2. #{”key1″:”valu1″,”key2″:”value2″,”key3″:”value2″,”key4″:”value4″…}
  3. 例如:
  4. #{”admin”:”xiaoqi”,”manager”:”xiaoxue”,”operator”:”candy”}
  5. Map元素的访问方式,录入访问的key为admin的元素
  6. #{”admin”:”xiaoqi”,”manager”:”xiaoxue”,”operator”:”candy”}["admin"]
  7. 或者
  8. #{”admin”:”xiaoqi”,”manager”:”xiaoxue”,”operator”:”candy”}.admin
需要使用#{}操作符和 key—value键值对。语法格式如下
#{"key1":"valu1","key2":"value2","key3":"value2","key4":"value4"...}
例如:
#{"admin":"xiaoqi","manager":"xiaoxue","operator":"candy"}

Map元素的访问方式,录入访问的key为admin的元素
#{"admin":"xiaoqi","manager":"xiaoxue","operator":"candy"}["admin"]
或者
#{"admin":"xiaoqi","manager":"xiaoxue","operator":"candy"}.admin

=========10.使用集合的伪属性========

集合类型 方法调研那个示例代码 伪属性 OGNL表达似乎 List list.iterator(),list.size() iterator,size list.iterator, lise.size Set set.isEmpty(),set.iterator() iterator,isEmpty set.iterator,set.isEmpty Map map.keySet(),map.values() keys,values map.keys,map.values Iterator iterator.next(),iterator.hasNext() next,hasNext iterator.next,iterator.hasNext Enumeration enum.nextElement(),enum.hasMoreElements() next或nextElement,hasNext或hasMoreElements enum.next或next.nextElement,enum.hasNext 或enum.hasMoreElements

==========投影===============

Java代码 复制代码 收藏代码
  1. 在OGNL中,投影是指在一个集合中对每个元素调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合。
  2. 例如有如下列表:{1,2,3,4,5}
  3. 现在通过投影,将上面列表中的每个元素都从整形换成字符类型,从而组成了一个新的列表。
  4. 如下代码:
  5. {1,2,3,4,5}.{#this.toString()}
  6. 则得到新的列表如下:
  7. {”1″,”2″,”3″,”4″,”5″}
在OGNL中,投影是指在一个集合中对每个元素调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合。
例如有如下列表:{1,2,3,4,5}
现在通过投影,将上面列表中的每个元素都从整形换成字符类型,从而组成了一个新的列表。
如下代码:
{1,2,3,4,5}.{#this.toString()}
则得到新的列表如下:
{"1","2","3","4","5"}


==============选择================

Java代码 复制代码 收藏代码
  1. 在LGNL中,选择是指使用表达式从集合中选择某些元素,并将这些元素保存到新的集合中。
  2. 例如有如下列表:
  3. {1,2,3,4,5}
  4. 现在通过选择,将上面的列表中大于2的元素选择出来,保存到新的列表中,如下代码:
  5. {1,2,3,4,5},{?#this>2}
  6. 则新的列表如下:
  7. {3,4,5}
在LGNL中,选择是指使用表达式从集合中选择某些元素,并将这些元素保存到新的集合中。
例如有如下列表:
{1,2,3,4,5}
现在通过选择,将上面的列表中大于2的元素选择出来,保存到新的列表中,如下代码:
{1,2,3,4,5},{?#this>2}
则新的列表如下:
{3,4,5}

============Struts2 ValueStack============= ——-值栈 ValueStack——–

Java代码 复制代码 收藏代码
  1. Struts2在OGNL之上提供了的最大附加特性就是支持 值栈 ValueStack.在OGNL上下文中只能存在一个根对象,而Struts2的值栈允许存储多个虚拟根对象。Struts2将OGNL上下设置为Strus2的ActionContext,并将值栈最为OGNL的根对象。
  2. 例如: 值栈中有两个对象,Book对象book和Song对象song,对这两个对象的说明如下:
  3. book有两个属性,图书名name和图书价格 price。
  4. song有两个属性,歌曲名称name和歌曲内容lyrics
  5. book先入栈,song后入栈。
  6. 这时在OGNL上下文中,如果访问book的price属性
  7. 表达式如下:price
  8. 如果访问song的lyrics属性,表达式为 lyrics
  9. 如果访问book的name属性 表达式为:name
  10. 如果反问song的name,则表达式必须指明对象,如下:
  11. song.name (因为此时OGML上下文中存储了两个name,所以 后面的需要明确指定。)
Struts2在OGNL之上提供了的最大附加特性就是支持 值栈 ValueStack.在OGNL上下文中只能存在一个根对象,而Struts2的值栈允许存储多个虚拟根对象。Struts2将OGNL上下设置为Strus2的ActionContext,并将值栈最为OGNL的根对象。
例如: 值栈中有两个对象,Book对象book和Song对象song,对这两个对象的说明如下:
book有两个属性,图书名name和图书价格 price。
song有两个属性,歌曲名称name和歌曲内容lyrics
book先入栈,song后入栈。

这时在OGNL上下文中,如果访问book的price属性 
表达式如下:price
如果访问song的lyrics属性,表达式为 lyrics
如果访问book的name属性 表达式为:name
如果反问song的name,则表达式必须指明对象,如下:
song.name (因为此时OGML上下文中存储了两个name,所以 后面的需要明确指定。)

——-[N]语法——–

Java代码 复制代码 收藏代码
  1. [N].propertyName语法,可以用来指定从值栈中的位置N开始,向下查找对象的指定属性(propertyName).其中N是从0开始的整数。
  2. 例如: 值栈中有 3个对象,User1,User2,User3 他们都有name属性。如果使用[N].peopertyName语法。则
  3. 访问第一个对象user1的name属性,可以使用如下表达式[0].name
  4. 访问第二个对象user2的name属性,可以使用如下表达式[1].name
  5. 访问第三个对象user3的name属性,可以使用如下表达式[2].name
[N].propertyName语法,可以用来指定从值栈中的位置N开始,向下查找对象的指定属性(propertyName).其中N是从0开始的整数。
例如: 值栈中有 3个对象,User1,User2,User3 他们都有name属性。如果使用[N].peopertyName语法。则
访问第一个对象user1的name属性,可以使用如下表达式[0].name
访问第二个对象user2的name属性,可以使用如下表达式[1].name
访问第三个对象user3的name属性,可以使用如下表达式[2].name

——-top——–

Java代码 复制代码 收藏代码
  1. top:关键字用于获取栈顶对象
  2. 例如。要获取值栈中的user2对象,可以使用如下表达式:
  3. [1].top
  4. 访问user2的name属性可以使用如下表达式
  5. [1].top.name
top:关键字用于获取栈顶对象
例如。要获取值栈中的user2对象,可以使用如下表达式:
[1].top
访问user2的name属性可以使用如下表达式
[1].top.name

==============命名对象================

Java代码 复制代码 收藏代码
  1. Struts2还提供了一些命名对象,这些对象没有存在值栈中,而是保存的ActionContext中。而访问这些对象要使用#标记,而这些命名对象都是Map类型
  2. Struts2提供的命名对象如下:
  3. 1.parameters:用来访问请求参数。例如#parameters["name"] 或者 #parameters.name.相当于request.getParameter(“name”).
  4. 2.request: 用来访问request属性,例如#request['login']或#request.login。相当于request.getAttribute(“login”).
  5. 3.session:用来访问session的属性,例如 #session['login']或 #session.login,相当于 session.getAttribute(‘login’).
  6. 4.application: 用来访问application的属性,例如:#application['login']或#application.login,相当于application.attribute(“login”);
  7. 5.attr:用来访问PageContext.如果PageContext不可用,则一次搜索request,session,application。例如:#attr['login'] 或 #attr.login
Struts2还提供了一些命名对象,这些对象没有存在值栈中,而是保存的ActionContext中。而访问这些对象要使用#标记,而这些命名对象都是Map类型
Struts2提供的命名对象如下:

1.parameters:用来访问请求参数。例如#parameters["name"] 或者 #parameters.name.相当于request.getParameter("name").

2.request: 用来访问request属性,例如#request['login']或#request.login。相当于request.getAttribute("login").

3.session:用来访问session的属性,例如 #session['login']或 #session.login,相当于 session.getAttribute('login').

4.application: 用来访问application的属性,例如:#application['login']或#application.login,相当于application.attribute("login");

5.attr:用来访问PageContext.如果PageContext不可用,则一次搜索request,session,application。例如:#attr['login'] 或 #attr.login

——–使用命名对象实例———— 1.action

Java代码 复制代码 收藏代码
  1. package com.sh.action;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5. import org.apache.struts2.ServletActionContext;
  6. import com.opensymphony.xwork2.ActionSupport;
  7. public class MyOgnlAction extends ActionSupport {
  8.     @Override
  9.     public String execute() throws Exception {
  10.         HttpServletRequest request=ServletActionContext.getRequest();
  11.         request.setAttribute(“sameName”, “myRequest”);
  12.         HttpSession session=request.getSession();
  13.         session.setAttribute(“sameName”, “mySession”);
  14.         ServletContext appliaction=ServletActionContext.getServletContext();
  15.         appliaction.setAttribute(“sameName”, “myApplication”);
  16.         return SUCCESS;
  17.     }
  18. }
package com.sh.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class MyOgnlAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		HttpServletRequest request=ServletActionContext.getRequest();
		request.setAttribute("sameName", "myRequest");

		HttpSession session=request.getSession();
		session.setAttribute("sameName", "mySession");

		ServletContext appliaction=ServletActionContext.getServletContext();
		appliaction.setAttribute("sameName", "myApplication");

		return SUCCESS;
	}
}

2.ognl.jsp

Html代码 复制代码 收藏代码
  1. <body>
  2.    <center>
  3.    ===============使用Struts2的命名空间====================<br/>
  4. 访问request请求属性:<s:property value=”#request.sameName”/><br/>
  5. 访问session属性:<s:property value=”#session.sameName”/><br/>
  6. 访问application属性:<s:property value=”#application.sameName”/><br/>
  7. 访问PageContext属性:<s:property value=”#attr.sameName”/><br/>
  8.    </center>
  9. </body>
 <body>
    <center>
    ===============使用Struts2的命名空间====================<br/>
	 访问request请求属性:<s:property value="#request.sameName"/><br/>
	 访问session属性:<s:property value="#session.sameName"/><br/>
	 访问application属性:<s:property value="#application.sameName"/><br/>
	访问PageContext属性:<s:property value="#attr.sameName"/><br/>
    </center>
  </body>

3.struts.xml

Xml代码 复制代码 收藏代码
  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>
  2. <!DOCTYPE struts PUBLIC
  3.     “-//Apache Software Foundation//DTD Struts Configuration 2.3//EN”
  4.     “http://struts.apache.org/dtds/struts-2.3.dtd”>
  5. <struts>
  6.      <!– 定义国际化资源文件的基本名称 –>
  7.     <constant name=”struts.custom.i18n.resources” value=”com.sh.action.package”/>
  8.     <constant name=”struts.i18n.encoding” value=”utf-8″/>
  9.     <package name=”/user” extends=”struts-default”>
  10.         <action name=”myOgnlAction” class=”com.sh.action.MyOgnlAction”>
  11.             <result name=”success”>/ognl.jsp</result>
  12.         </action>
  13.     </package>
  14. </struts>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts> 
     <!-- 定义国际化资源文件的基本名称 -->
	<constant name="struts.custom.i18n.resources" value="com.sh.action.package"/>
    <constant name="struts.i18n.encoding" value="utf-8"/>
    <package name="/user" extends="struts-default">
    	<action name="myOgnlAction">
			<result name="success">/ognl.jsp</result>    	
    	</action>
    </package>
</struts>

4.访问 —http://localhost:8080/Struts2_Ognl/myOgnlAction.action –可以看到 attr获取的值为myRequest 说明 如果PageContext不存在就会一次搜索request session  application
==================使用OGNL=================

Java代码 复制代码 收藏代码
  1. OGNL(Object Graph Navigation Language)对象导航语言,是一种方便的操作对象属性的开源表达式语言,目的就是避免在Jsp页面中出现过多的<% %>,实现页面与后台代码分离。在应用中经常遇到的问题是 “#” “$” “%” 这个三个符号
  2. 1.“#”
  3.    访问OGNL上下文和Action上下文,用于过滤和投影集合,
  4.    例如:books.{?#this.price<100}
  5. 2.”$”符号
  6.    在国际化资源文件中使用OGNL表达式,
  7.    例如年龄在${min}和 ${max}之间。
  8.    在Struts2配置文件中使用OGNL表达式。
  9. 3.”%”符号
  10.    当标签的属性为字符串类型时,计算OGNL表达式的值。
OGNL(Object Graph Navigation Language)对象导航语言,是一种方便的操作对象属性的开源表达式语言,目的就是避免在Jsp页面中出现过多的<% %>,实现页面与后台代码分离。在应用中经常遇到的问题是 “#” “$” "%" 这个三个符号

1.“#”
   访问OGNL上下文和Action上下文,用于过滤和投影集合,
   例如:books.{?#this.price<100}

2."$"符号
   在国际化资源文件中使用OGNL表达式,
   例如年龄在${min}和 ${max}之间。
   在Struts2配置文件中使用OGNL表达式。

3."%"符号
   当标签的属性为字符串类型时,计算OGNL表达式的值。

1.OGNLAction java

Java代码 复制代码 收藏代码
  1. package com.sh.action;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.http.HttpServletRequest;
  7. import org.apache.struts2.interceptor.ServletRequestAware;
  8. import org.apache.struts2.interceptor.SessionAware;
  9. import org.apache.struts2.util.ServletContextAware;
  10. import com.opensymphony.xwork2.ActionSupport;
  11. import com.sh.pojo.News;
  12. public class OGNLAction extends ActionSupport
  13. implements ServletRequestAware,SessionAware,ServletContextAware {
  14.     private HttpServletRequest request;
  15.     private Map session;
  16.     private ServletContext application;
  17.     private List<News> newsList;
  18.     public void setServletRequest(HttpServletRequest arg0) {
  19.         this.request=arg0;
  20.     }
  21.     public void setSession(Map<String, Object> arg0) {
  22.         // TODO Auto-generated method stub
  23.         session=arg0;
  24.     }
  25.     public void setServletContext(ServletContext arg0) {
  26.         // TODO Auto-generated method stub
  27.         application=arg0;
  28.     }
  29.     public List<News> getNewsList() {
  30.         return newsList;
  31.     }
  32.     @SuppressWarnings(“unchecked”)
  33.     public String execute() throws Exception {
  34.         request.setAttribute(“userName”, “userName from request”);
  35.         session.put(“userName”, “userName from session”);
  36.         application.setAttribute(“userName”, “userName from application”);
  37.         newsList=new LinkedList<News>();
  38.         News new1=new News();
  39.         new1.setNid(1);
  40.         new1.setNtitle(“the first news title”);
  41.         new1.setNcontent(“the first news content”);
  42.         new1.setNtime(“2012-08-08″);
  43.         newsList.add(new1);
  44.         News new2=new News();
  45.         new1.setNid(2);
  46.         new1.setNtitle(“the second news title”);
  47.         new1.setNcontent(“the second news content”);
  48.         new1.setNtime(“2012-08-18″);
  49.         newsList.add(new2);
  50.         News new3=new News();
  51.         new1.setNid(3);
  52.         new1.setNtitle(“the three news title”);
  53.         new1.setNcontent(“the three news content”);
  54.         new1.setNtime(“2012-08-28″);
  55.         newsList.add(new3);
  56.         return super.execute();
  57.     }
  58. }
package com.sh.action;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;
import com.sh.pojo.News;

public class OGNLAction extends ActionSupport 
implements ServletRequestAware,SessionAware,ServletContextAware {
	private HttpServletRequest request;
	private Map session;
	private ServletContext application;

	private List<News> newsList;
	public void setServletRequest(HttpServletRequest arg0) {
		this.request=arg0;
	}

	public void setSession(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		session=arg0;
	}

	public void setServletContext(ServletContext arg0) {
		// TODO Auto-generated method stub
		application=arg0;
	}

	public List<News> getNewsList() {
		return newsList;
	}

	@SuppressWarnings("unchecked")
	public String execute() throws Exception {
		request.setAttribute("userName", "userName from request");
		session.put("userName", "userName from session");
		application.setAttribute("userName", "userName from application");
		newsList=new LinkedList<News>();
		News new1=new News();
		new1.setNid(1);
		new1.setNtitle("the first news title");
		new1.setNcontent("the first news content");
		new1.setNtime("2012-08-08");
		newsList.add(new1);

		News new2=new News();
		new1.setNid(2);
		new1.setNtitle("the second news title");
		new1.setNcontent("the second news content");
		new1.setNtime("2012-08-18");
		newsList.add(new2);

		News new3=new News();
		new1.setNid(3);
		new1.setNtitle("the three news title");
		new1.setNcontent("the three news content");
		new1.setNtime("2012-08-28");
		newsList.add(new3);

		return super.execute();
	}		
}

2.struts.xml

Xml代码 复制代码 收藏代码
  1. <action name=”ognlAction” class=”com.sh.action.OGNLAction”>
  2.     <result>/index.jsp</result>
  3. </action>
	
    	<action name="ognlAction">
    		<result>/index.jsp</result>
    	</action>

3.index.jsp

Html代码 复制代码 收藏代码
  1. <body>
  2.     <center>
  3.         <h3>访问OGNL上下文和Action上下文</h3>
  4.         request.userName :<s:property value=”#request.userName”/>
  5.         session.userName :<s:property value=”#session.userName”/>
  6.         application.userName :<s:property value=”#application.userName”/>
  7.         <hr/>
  8.         <h3>用于过滤和投影集合</h3>
  9.         [list]
  10.          <s:iterator value=”newsList”>
  11.             <s:property value=”nid”/>. <s:property value=”ntitle”/><br/>
  12.          </s:iterator>
  13.          [/list]
  14.          ID是“1”的新闻标题:<s:property value=”newsList.{?#this.nid==1}.{ntitle}[0]“/>
  15.          <hr/>
  16.          <h3>构造Map</h3>
  17.          <s:set name=”books” value=”#{‘book1′:’23′,’book2′:’55′,’book3′:’66′}”/>
  18.          book1的价格是:<s:property value=”#books['book1']“/>
  19.          <hr/>
  20.          <h3>%用途</h3>
  21.          <s:url value=”#books['book1']“/>:
  22.          <s:url value=”%{#books['book1']}”/>
  23.         <hr/>
  24.         <h3>$使用</h3>
  25.         request.userName:${requestScope.userName}
  26.         session.userName:${sessionScope.userName}
  27.         application.userName:${applicationScope.userName}
  28.         <hr/>
  29.     </center>
  30.   </body>
<body>

    <center>
    	<h3>访问OGNL上下文和Action上下文</h3>
    	request.userName :<s:property value="#request.userName"/>

    	session.userName :<s:property value="#session.userName"/>

    	application.userName :<s:property value="#application.userName"/>

    	<hr/>
    	<h3>用于过滤和投影集合</h3>
    	[list]
    	 <s:iterator value="newsList">
    	 	<s:property value="nid"/>. <s:property value="ntitle"/><br/>
    	 </s:iterator>
    	 [/list]
    	 ID是“1”的新闻标题:<s:property value="newsList.{?#this.nid==1}.{ntitle}[0]"/>
    	 <hr/>
    	 <h3>构造Map</h3>
    	 <s:set name="books" value="#{'book1':'23','book2':'55','book3':'66'}"/>
    	 book1的价格是:<s:property value="#books['book1']"/>
    	 <hr/>
    	 <h3>%用途</h3>
    	 <s:url value="#books['book1']"/>:
    	 <s:url value="%{#books['book1']}"/>

    	<hr/>
    	<h3>$使用</h3>
    	request.userName:${requestScope.userName}

    	session.userName:${sessionScope.userName}

    	application.userName:${applicationScope.userName}

    	<hr/>

    </center>
  </body>

4.访问 —http://localhost:8080/Struts2_Ognl/ognlAction.action