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. tree btn

    @*        <a href="javascript:void(0)" onclick="saveChecked()" ><img sr ...

  2. 获取前端post方式传过来的JSON格式的数据的代码

    public JSONObject getRequestContent(HttpServletRequest req) { JSONObject data = null; try { InputStr ...

  3. Default Constructor的构造操作

    Default Constructor的构造操作 C++ Annotated Reference Manual书中的Section 12.1说过:default constructor 只有在编译器需 ...

  4. iOS下uiview和uiscrollview设置背景图片的源码

    1.uiscrollview 设置背景图片 // Setup the Scroll ViewUIScrollView*tempScrollView=(UIScrollView*)self.view;t ...

  5. VBS脚本代码(手工编写---在windows 7上调用系统对话框,来选择文件)

    '=========================================================================='' VBScript Source File - ...

  6. OpenCV:二值图像连通区域分析与标记算法实现

    http://blog.csdn.net/cooelf/article/details/26581539?utm_source=tuicool&utm_medium=referral Open ...

  7. zf-分页后台代码

    java : public ResultPage getDeptList(int page, int pageRows) throws Exception { String hql="fro ...

  8. 获取表空间的语句 以及 建表和索引的ddl

    alter session set container=PHD1; SET SERVEROUTPUT ON SET LINESIZE SET FEEDBACK OFF SET PAGESIZE sel ...

  9. sql优化__rownum的使用【转】

    ROWNUM的概念ROWNUM是一个虚假的列.它将被分配为 1,2,3,4,...N,N 是行的数量.一个ROWNUM值不是被永久的分配给一行 (这是最容易被误解的).表中的某一行并没有标号:你不可以 ...

  10. # 泰语字符串字符分割 --- UTF-8编码格式

    1.泰语编码格式 泰语用的编码格式是:ISO 8859-11,这个是Latin编码系列,是从"ISO-8859-1"发展过来的,采用的是8bit一个字,所以泰语中的英文字母或者数字 ...