OGNL: Object Graph Navigation Language

index.jsp:

<body>
访问属性
<a href="<%=contextPath %>/ognl.action?username=u&password=p">ognl</a>
</body>

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<!--<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> -->
<include file="/com/bjsxt/struts2/ognl/ognl.xml"/>
</struts>

ognl.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="ognl" extends="struts-default"> <action name="ognl" class="com.bjsxt.struts2.ognl.OgnlAction">
<result>/ognl.jsp</result>
</action>
<action name="test" class="com.bjsxt.struts2.ognl.TestAction">
<result type="chain">ognl</result>
</action> </package>
</struts>

ognl.action:

package com.bjsxt.struts2.ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;

public class OgnlAction extends ActionSupport {
  private static final long serialVersionUID = 1L;
  private Cat cat;
  private String password;
  private User user;
  private String username;

  private List<User> users = new ArrayList<User>();
  private Set<Dog> dogs = new HashSet<Dog>();
  private Map<String, Dog> dogMap = new HashMap<String, Dog>();
  public OgnlAction() {
    users.add(new User(1));
    users.add(new User(2));
    users.add(new User(3));
    dogs.add(new Dog("dog1"));
    dogs.add(new Dog("dog2"));
    dogs.add(new Dog("dog3"));
    dogMap.put("dog100", new Dog("dog100"));
    dogMap.put("dog101", new Dog("dog101"));
    dogMap.put("dog102", new Dog("dog102"));
  }

  public String execute() {
    return SUCCESS;
  }
  public String getUsername() {
    return username;
  }
  public String getPassword() {
    return password;
  }
  public User getUser() {
    return user;
  }
  public Cat getCat() {
    return cat;
  }
  public Set<Dog> getDogs() {
    return dogs;
  }
  public List<User> getUsers() {
    return users;
  }
  public Map<String, Dog> getDogMap() {
    return dogMap;
  }

  public void setUsername(String username) {
    this.username = username;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public void setUser(User user) {
    this.user = user;
  }
  public void setCat(Cat cat) {
    this.cat = cat;
  }
  public void setDogs(Set<Dog> dogs) {
    this.dogs = dogs;
  }
  public void setUsers(List<User> users) {
    this.users = users;
  }
  public void setDogMap(Map<String, Dog> dogMap) {
    this.dogMap = dogMap;
  }

  public String m() {
    return "hello";
  }
}

                 

ognl.jsp访问:

<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>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li> <!-- 取不到,因为set无序 -->
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>

<hr />
<li>[]:<s:property value="[0].username"/></li> <!-- 访问值栈里第一个元素:action -->
</ol>

<s:debug></s:debug>
</body>

对于user.age需要传值进去才给构造函数赋值,或者在action里给user进行实例化, domain model里要有一个参数为空的构造方法:

private User user=new User();

静态方法和静态属性的类:

package com.bjsxt.struts2.ognl;

public class S {
public static String STR = "STATIC STRING"; public static String s() {
return "static method";
}
}

  

URL访问的时候:

http://localhost:8080/Struts2_1900_OGNL/ognl.action?username=u&password=p&user.age=9&cat.friend.name=oudy

结果:

1.访问值栈中的action的普通属性: username = u
2.访问值栈中对象的普通属性(get set方法): | | | wrong:
3.访问值栈中对象的普通属性(get set方法):
4.访问值栈中对象的普通方法:1
5.访问值栈中对象的普通方法:
6.访问值栈中action的普通方法:hello --------------------------------------------------------------------------------
7.访问静态方法:static method
8.访问静态属性:STATIC STRING
9.访问Math类的静态方法:3 --------------------------------------------------------------------------------
10.访问普通类的构造方法:user8 --------------------------------------------------------------------------------
11.访问List:[user1, user2, user3]
12.访问List中某个元素:user2
13.访问List中元素某个属性的集合:[1, 2, 3]
14.访问List中元素某个属性的集合中的特定值:1 | 1
15.访问Set:[dog: dog1, dog: dog2, dog: dog3]
16.访问Set中某个元素:
17.访问Map:{dog102=dog: dog102, dog101=dog: dog101, dog100=dog: dog100}
18.访问Map中某个元素:dog: dog101 | dog: dog101 | dog: dog101
19.访问Map中所有的key:[dog102, dog101, dog100]
20.访问Map中所有的value:[dog: dog102, dog: dog101, dog: dog100]
21.访问容器的大小:3 | 3 --------------------------------------------------------------------------------
22.投影(过滤):user1
23.投影:[2]
24.投影:[3]
25.投影:false --------------------------------------------------------------------------------
26.[]:u

  

 

  

Struts2语法--Ognl的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  3. Struts2之OGNL

    一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...

  4. Struts2对Ognl的支持

                                                      Struts2对Ognl的支持 一. 写作背景 由于工作性质的变化,最近一直在研究struts2,从 ...

  5. struts2之OGNL和struts2标签库和ValueStack对象

    OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.  struts2框架默认就支持Ognl表达式语言(所以 ...

  6. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  7. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  8. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  9. Struts2与OGNL的联系

    1.Struts与OGNL的结合原理 (1)值栈: OGNL表达式要想运行就要准备一个OGNLContext对象,Struts2内部含有一个OGNLContext对象,名字叫做值栈. 值栈也由两部分组 ...

随机推荐

  1. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

  2. Jquery实现表格的分页

    功能描述 该分页功能不是一次将所有记录都加载出来,然后在点击按钮翻页的时候,通过设置每一条记录的display属性展示或隐藏实现分页的效果.由于后台的获取数据的接口已实现分页的功能,所以在点击翻页按钮 ...

  3. Ant 删除目录 vs 清空目录

    Apache Ant 可以用下面的命令来删除目录 <delete dir="${lucene.dir}"/> 但是这会删除整个目录,而我现在只想清空目录内的所有文件和子 ...

  4. CentOS中由一般用户切换为root用户

    --->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...

  5. Linux系统故障处理案例(一)【转】

    2016-08-05 14:41 运行环境:CentOS6.7 故障原因: 昨天在线执行命令yum -y update 在命令执行途中,强制中断并直接运行poweroff命令关机.再次开机出现如图所示 ...

  6. intent.putExtra()方法参数详解

    [开篇骂几句:fuck]1.扯淡intent.putExtra()怎么使用?2.胡说intent.putExtra(); [扯淡:其实你在问它怎么用的时候,你要明白,你知道不知道这是个什么东东,有必要 ...

  7. 最大边和最小边之差最小的生成树 UVA 1394

    题目大意:给你n个点的图,求苗条度(最大边减最小编)尽量小的生成树 思路:sort以后暴力枚举区间即可 //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #inclu ...

  8. C/C++时间函数的使用

    来源:http://blog.csdn.net/apull/article/details/5379819 一.获取日历时间time_t是定义在time.h中的一个类型,表示一个日历时间,也就是从19 ...

  9. Django 用户认证及OneToOneField

    Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...

  10. iOS 10推送通知开发

    原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...