Struts_OGNL(Object Graph Navigation Language) 对象图导航语言
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) 对象图导航语言的更多相关文章
- OGNL(对象图导航语言)学习
一.关于OGNL(Object-Graph Navigation Language),一种可以方便地操作对象属性的开源表达式语言. 特点: 1)支持对象方法调用,形式如:objName.method ...
- Ognl对象图导航语言 源码
// -------------------------------------------------------------------------- // Copyright (c) 1998- ...
- java:struts框架5(Converter,Validation,Tags(Object-Graph Navigation Language))
1.Converter: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...
- Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------
Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...
- OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁: 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能 ...
- OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取 ...
- OGNL 对象视图导航语言
[Object Graphics Navigate Language] 类似于EL(Expression Language)表达式, 可以帮助我们在配置文件.JSP中来获取对象的值 这门语言比EL功能 ...
- [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 ...
- EL(Expression Language)表达式语言
EL(Expression Language)表达式语言 EL的基本语法是以${开始,以}结束 为了能够方便地输出数据,EL提供了11个内置对象,其中 2个内置对象为了方便输出请求参数 param用来 ...
随机推荐
- git 打tag
查看已有tag git tag 创建新的tag git tag <version or tagname> -m <tag description> 例如创建一个版本1.0.0的 ...
- 牛客寒假算法基础集训营4 B applese 走方格
链接:https://ac.nowcoder.com/acm/contest/330/B 构造题,但是有两个特判... 1 2 2 1 然后就水了,血亏 #include<stdio.h&g ...
- react 部分语法补充
jsx语法 todolist.js import React, { Component,Fragment } from 'react'; import './style.css' class Todo ...
- java程序员的从0到1:@Resource与@Autowired的比较
目录: 1.@Resource与@Autowired的源码分析 2.@Resource与@Autowired的相同点 3.@Resource与@Autowired的不同点 正文: 1.@Resourc ...
- POJ2828 Buy Tickets(线段树之插队问题)
飞翔 问题是这样的:现在有n个人要买票,但是天黑可以随便插队.依次给出将要买票的n个人的数据信息.包含两项:pos,当前第i号人来了之后他肯定要插入到pos这个位置,如果当前pos无人,那最好了,直接 ...
- 如何用css让一个容器水平垂直居中
方法一: 以前设置里面的绿div总是会使用{position:absolute;left:50%;top:50%;margin-left:-div宽度的一半;margin-top:-div高度的一半} ...
- 在Pycharm上编写WordCount程序
本篇博客将给大家介绍怎么在PyCharm上编写运行WordCount程序. 第一步 下载安装PyCharm 下载Pycharm PyCharm的下载地址(Linux版本).下载完成后你将得到一个名叫: ...
- windows服务开启(收藏url)
windows服务开启(收藏url) http://blog.csdn.net/wanda39kela/article/details/46310093
- Deep Visualization:可视化并理解CNN(转)
转载地址:https://zhuanlan.zhihu.com/p/24833574 一.前言 CNN作为一个著名的深度学习领域的“黑盒”模型,已经在计算机视觉的诸多领域取得了极大的成功,但是,至今没 ...
- Problem01 不死神兔
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 ...