1、访问值栈中的action的普通属性:

请求:

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

对应的action代码,getter和setter方法一定要加上:

     private String username;

     private String password;

         public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}

页面进行访问:

 username = <s:property value="username" /> | password = <s:property value="password" />

2、访问值栈中对象的普通属性(get set方法)

如果请求没有将 user的值传过去,那么在值栈就会看到 user=null,只有为user赋值了,struts2才会构造一个User对象然后赋给user。

只有传才会构造。

想初始化 domain model,可以 new,也可以传参数值,但这时候需要提供参数为空的构造方法。

请求:

action 中的代码:

         private User user;

     public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}

属性访问:

<s:property value="user.age" />

3、案例三

现在定义了 Dog 类:

 package com.bjsxt.struts2.ognl;

 public class Dog {

     private String name;

     public Dog(){}

     public Dog(String name){
this.name = name;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public String toString(){
return "dog:" + this.name;
} }

Cat 类,类中有个friend 是 Dog 类

 package com.bjsxt.struts2.ognl;

 public class Cat {

     private Dog friend;

     public Dog getFriend() {
return friend;
} public void setFriend(Dog friend) {
this.friend = friend;
} public String miaomiao(){
return "miaomiao";
}
}

在 Action 中定义了 Cat 对象

     private Cat cat;

     public Cat getCat() {
return cat;
} public void setCat(Cat cat) {
this.cat = cat;
}

请求:

显示:

4、案例四:OGNL表达式调用值栈中对象的方法

action中是有定义password属性的。

类似案例:

Cat类中是由miaomiao()方法的。

5、调用action的普通方法

action 先定义一个普通方法:

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

页面调用:

<s:property value="m()"/>

========================================================================

访问静态方法:

先在struts.xml设置允许访问静态方法

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

定义的示例类:

 package com.bjsxt.struts2.ognl;

 public class S {

     public static String STR = "STATIC STRING";

     public static String s(){
return "this is a static method().";
} }

访问代码:

 访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
访问静态变量:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
访问Math类的静态方法:<s:property value="@@max(2,3)"/>

6、访问普通类的构造方法

访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)" />

结果:

7、访问集合元素

数组访问方式跟访问List一样

8、投影

User 代码:

 package com.bjsxt.struts2.ognl;

 public class User {

     private Integer age = 10;

     public User(){}

     public User(int age){
this.age = age;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String toString(){
return "user" + age;
} }

名称为 users 的List

 private List<User> users = new ArrayList<User>();
users.add(new User(1));
users.add(new User(2));
users.add(new User(3));
users.add(new User(4));

页面代码:

 <li>投影(过滤):<s:property value="users.{?#this.age==1}.{age}"/></li><!-- ?#后面接过滤条件 这句话是取所有age大于1的所有值 -->
<li>投影:<s:property value="users.{^#this.age>1}.{age}" /></li><!-- ^#开头 这句话是取age大于1的第一个值 -->
<li>投影:<s:property value="users.{$#this.age>1}.{age}" /></li><!-- $#结尾 这句话是取age大于1的最后那个值-->
<li>投影:<s:property value="users.{^#this.age>1}.{age} == null" /></li>

结果:

9、[]

[] 访问的是值栈

[索引] 访问对应位置的对象

[索引].对象名 访问索引对象包含的Property

<s:property value="[0].locale"/>

小问题:一个请求从一个Action容器内跳转到另一个Action,那么在值栈中就会有两个Action。例子如下:

struts.xml

TestAction

 package com.bjsxt.struts2.ognl;

 import com.opensymphony.xwork2.ActionSupport;

 public class TestAction extends ActionSupport {

     private static final long serialVersionUID = 7420682335394931465L;

     public String execute(){
return SUCCESS;
}
}

OgnlAction

     public OgnlAction(){
users.add(new User(1));
users.add(new User(2));
users.add(new User(3));
users.add(new User(4)); dogs.add(new Dog("dog1"));
dogs.add(new Dog("dog2"));
dogs.add(new Dog("dog3")); dogMap.put("dog100", new Dog("100"));
dogMap.put("dog101", new Dog("101"));
dogMap.put("dog102", new Dog("102"));
} public String execute() throws Exception {
return super.execute();
}

调用了两个Action后,ValueStack中的内容 TestAction 先进栈,OgnlAction 后进栈:

OGNL 常用的就上面这些。

链接: http://pan.baidu.com/s/1c8Hima 密码: gkch

Struts_OGNL(Object Graph Navigation Language) 对象图导航语言的更多相关文章

  1. OGNL(对象图导航语言)学习

    一.关于OGNL(Object-Graph Navigation Language),一种可以方便地操作对象属性的开源表达式语言. 特点:  1)支持对象方法调用,形式如:objName.method ...

  2. Ognl对象图导航语言 源码

    // -------------------------------------------------------------------------- // Copyright (c) 1998- ...

  3. java:struts框架5(Converter,Validation,Tags(Object-Graph Navigation Language))

    1.Converter: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...

  4. Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------

    Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...

  5. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;

    OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁: 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能 ...

  6. OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取 ...

  7. OGNL 对象视图导航语言

    [Object Graphics Navigate Language] 类似于EL(Expression Language)表达式, 可以帮助我们在配置文件.JSP中来获取对象的值 这门语言比EL功能 ...

  8. [Javascript] Creating an Immutable Object Graph with Immutable.js Map()

    Learn how to create an Immutable.Map() through plain Javascript object construction and also via arr ...

  9. EL(Expression Language)表达式语言

    EL(Expression Language)表达式语言 EL的基本语法是以${开始,以}结束 为了能够方便地输出数据,EL提供了11个内置对象,其中 2个内置对象为了方便输出请求参数 param用来 ...

随机推荐

  1. 洛谷 P1003 铺地毯

    嗯.... 一道比较水的模拟题.. 刚拿到题的时候被它的数据范围吓到了,二维数组不可能开那么大啊,可是一边做发现测试数据太水 ... 先看一下题吧... 题目描述 为了准备一个独特的颁奖典礼,组织者在 ...

  2. 【转】eclipse上的.properties文件中文编辑显示问题

    首先,解决.properties文件中的中文编辑问题,我们发现,在.properties文件中输入的中文变成了这个样子: 这是eclipse的.properties文件,默认的编码方式是iso-885 ...

  3. FileWriter 中午乱码

      解决办法 BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (fil ...

  4. POJ 3281 Dining ( 最大流 && 建图 )

    题意 : 有 N 头牛,John 可以制作 F 种食物和 D 种饮料, 然后接下来有 N 行,每行代表一头牛的喜好==>开头两个数 Fi 和 Di 表示这头牛喜欢 Fi 种食物, Di  种饮料 ...

  5. python连接mysql数据库遇到的问题

    1.源代码: from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy ...

  6. android Activity启动过程(二)从ActivityManagerService的startActivity到栈顶Activity的onPause过程

    ActivityManagerService.startActivity() ActvityiManagerService.startActivityAsUser() ActivityStackSup ...

  7. pyplot

    错误: 执行 import matplotlib.pyplot 报错 ImportError: No module named _tkinter, please install the python- ...

  8. 为什么vue+webpack需要用到node,如何部署项目到服务器?

    第一部分 之前一直不太理解为什么要使用vue+webapck,还有在使用了vue-cli之后会用到后台,即vue-cli自动帮我们安装了express服务器,在本地服务器上运行,因为我们希望可以模拟在 ...

  9. 深入学习webpack(三)

    在前面两篇博客中,主要讲了webpack的使用和webpack的核心概念,他们都是非常重要的,在这篇博客中,讲主要讨论webpack配置相关问题. 参考文章:https://webpack.js.or ...

  10. 基于log4net自定义异步logging组件

    我们在做开发的时候,需要把一些信息记录下来,方便问题排查.数据分析和统计.通常我们使用log4net作为logging的工具,但是大部分时候需要加以封装,以便更加方便的使用,并且不妨碍主业务程序的运行 ...