ongl 表达式
struts.xml简单配置
<!-- (默认false)设置ognl表达式是否支持静态方法 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<package name="ognl" namespace="/ognl" extends="struts-default">
<action name="ognl" class="com.ouc.wkp.action.OgnlAction">
<result>/ognl.jsp</result>
</action>
</package>
struts.xml
记得打开
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
package com.ouc.wkp.action; 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 org.apache.commons.chain.Catalog; import com.opensymphony.xwork2.ActionSupport;
import com.ouc.wkp.model.Cat;
import com.ouc.wkp.model.Dog;
import com.ouc.wkp.model.User2; //user.xxx只有传,才会构造,想初始化domain model,可以自己new,也可以传参数值
//但这时候要有参数为空的构造方法
//
public class OgnlAction extends ActionSupport {
private String password;
private String username;
private User2 user;
private Cat cat;
private Map<String, Dog> dogMap = new HashMap<String, Dog>();
private Set<Dog> dogs = new HashSet<Dog>();
private List<User2> users = new ArrayList<User2>(); public Cat getCat() {
return cat;
} public void setCat(Cat cat) {
this.cat = cat;
} public User2 getUser() {
return user;
} public void setUser(User2 user) {
this.user = user;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Map<String, Dog> getDogMap() {
return dogMap;
} public void setDogMap(Map<String, Dog> dogMap) {
this.dogMap = dogMap;
} public Set<Dog> getDogs() {
return dogs;
} public void setDogs(Set<Dog> dogs) {
this.dogs = dogs;
} public List<User2> getUsers() {
return users;
} public void setUsers(List<User2> users) {
this.users = users;
} public OgnlAction() {
users.add(new User2(1));
users.add(new User2(2));
users.add(new User2(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"));
} @Override
public String execute() throws Exception {
return SUCCESS;
} public String m() {
return "mmmmm";
}
}
OgnlAction.java
package com.ouc.wkp.model;
//user.xxx只有传,才会构造,想初始化domain model,可以自己new,也可以传参数值
//但这时候要有参数为空的构造方法
public class User2 {
private int age=8; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public User2(){
// System.out.println("user constructor");
} public User2(int age){
this.age=age;
} @Override
public String toString() {
return "user"+age;
}
}
User2.java
package com.ouc.wkp.model;
public class Cat {
private Dog friend;
public Dog getFriend() {
return friend;
}
public void setFriend(Dog friend) {
this.friend = friend;
}
public String miaomiao(){
return "miaomiao";
}
// public Cat(){
//
// }
//
// public Cat(Dog friend){
// this.friend=friend;
// }
//
// @Override
// public String toString() {
// return "cat"+friend;
// }
}
Cat.java
package com.ouc.wkp.model;
public class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dog(){
}
public Dog(String name){
super();
this.name=name;
}
@Override
public String toString() {
return "dog"+name;
}
}
Dog.java
然后就是比较核心的ognl.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'ognl.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<s:debug></s:debug>
This is ognl.jsp
<br> 访问值栈中的action的普通属性:username=
<s:property value="username" />
<br /> 访问值栈中对象的普通属性(get set 方法)
<s:property value="user.age" />
<br /> 访问值栈中对象的普通属性(get set 方法)
<s:property value="cat.friend.name" />
<br /> 访问值栈中对象的普通方法
<s:property value="password.length()" />
<br /> 访问值栈中对象的普通方法
<s:property value="cat.miaomiao()" />
<br /> 访问静态方法:
<s:property value="@com.ouc.wkp.action.S@s()" />
<br /> 访问静态属性:
<s:property value="@com.ouc.wkp.action.S@STR" />
<br /> 访问Math类的静态方法:
<s:property value="@@max(2,3)" />
<br /> 访问普通类的构造方法:
<s:property value="new com.ouc.wkp.model.User2(10)" />
<br /> 访问List:
<s:property value="users" />
<br /> 访问List中某个元素:
<s:property value="users[1]" />
<br /> 访问List中元素某个属性的集合:
<s:property value="users.{age}" />
<br /> 访问List中元素某个属性的集合中的特定值:
<s:property value="users.{age}[0]" />
<br /> |
<s:property value="users[0].age" />
<br /> 访问Set:
<s:property value="dogs" />
<br /> 访问Set中某个元素:
<s:property value="dogs[1]" />
<br /> 访问Map:
<s:property value="dogMap" />
<br /> 访问Map中某个元素:
<s:property value="dogMap.dog101" />
<br /> |
<s:property value="dogMap['dog101']" />
<br /> |
<s:property value="dogMap[\"dog101\"]" />
<br /> 访问Map中所有的key:
<s:property value="dogMap.keys" />
<br /> 访问Map中所有的value:
<s:property value="dogMap.values" />
<br /> 访问容器的大小:
<s:property value="dogMap.size()" />
<br /> |
<s:property value="users.size" />
<br /> 投影(过滤):
<s:property value="users.{?#this.age==1}[0]" />
<br /> 投影:
<s:property value="users.{^#this.age>1}.{age}" />
<br /> 投影:
<s:property value="users.{$#this.age>1}.{age}" />
<br /> 投影:
<s:property value="users.{$#this.age>1}.{age}==null" />
<br /> []:
value stack从上往下数<s:property value="[0].username" />
</body>
</html>
ognl.jsp
输入网址
http://localhost:8081/maShiBing/ognl/ognl?password=p&username=u&user.age=9&cat.friend.name=fuck
运行结果为

ongl 表达式的更多相关文章
- 对于EL表达式和ONGL表达式区别的相关理解
java程序跑起来之后,会有一个内存空间分配出来,存入用到的值,这个值的周围就是上下文空间,而九大内置对象等,都在这个值的周围放着,像这样: el 就只能获取value stack 周围 的数据,va ...
- Struts2笔记——ONGL表达式语言
OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. ----------- ...
- 表达式语言之ongl表达式
OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...
- ongl表达式中得到对象,调用对象方法(OA项目权限显示模块)
在用户是否拥有某项权限的问题 是这样解决的: 用户登录之后 登录信息是保存在session域中的 通过el表达式可得到登录的对象信息 那么怎样判断用户是否拥有某项权限呢 ?如果没有上图中的判断 ...
- JSTL、EL、ONGL、Struts标签的区别与使用
一.JSTL 来源 我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题: jsp维护难度增加 出事提示不明确,不容易提示 分工不明确等 解决上面的问题可以 ...
- ongl与Struts标签
一.ONGL OGNL 的全称是“Object-Graph Navigation Language”,即对象图导航语言,它是一种功能强大的开源表达式语言.使用这种表达式语言可以通过某种表达式语法存取 ...
- Struts2搭建及利用OGNL表达式弹出计算器
0x01 环境搭建 1.创建Struts2应用 创建一个动态网站项目 2.配置Tomcat启动环境 3.在WebContent目录下的WEB-INF文件夹中创建web.xml,Tomcat启动时会加载 ...
- struts2笔记(2)
<context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
随机推荐
- 关于ODI agent的配置部署
分类: Linux 最近,做了几个ODI项目的部署,发现ODI agent所在的位置对整个E-LT工作的影响还是比较大的,根据Oracle的官方说法,agent一般需要部署在目标端的数据库服务器上,或 ...
- [问题解决] "Nautilus could not create the required folder "/home/kenneth/.config/nautilus"
错误: "Nautilus could not create the required folder "/home/kenneth/.config/nautilus" 发 ...
- 神奇的i=i++
最近在看c语言,被神奇的i=i++吸引,其实感觉编程是一件有趣的事情(特别喜欢算法).下面是我的测试,linux 下 gcc编译 #include<stdio.h> main () { ...
- 智能家居项目(2):项目project框架的搭建
项目管理器: Linux中的项目管理器"make"有些类似于windows中的Visual C++里的"project",它是一种控制编译或者反复编译软件的工具 ...
- asp.net MVC Razor 语法(1)
Razor 不是编程语言.它是服务器端标记语言. 什么是 Razor ? Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时, ...
- 【原】浅谈Firefox下的js、css、图片阻塞现象(一)
外部js文件阻塞body中的图片 以如下html为例: <!DOCTYPE HTML> <html> <head> <meta http-equiv=&quo ...
- Kettle 学习笔记
一直用SSIS做ETL,越来越感觉这玩意不是亲生的.因此萌生换ETL工具的想法,不过Kettle社区版没什么调度系统,貌似错误处理也不是很方便,且先了解吧. 本文简略的记录了整个软件的使用流程. 开始 ...
- VS2013 快捷键乱掉如何修改回来
比如 CTRL+E+C =注释 F6=重新生成解决方案 CTRL+D+Q=运行时快速监视 工具-->选项-->环境-->键盘-->应用以下其他键盘映射方案,下拉选择 Visua ...
- Java 注解机制
一.注解中的信息已经在Class中了,我们应该如何读取出来 java.lang.reflect.AnnotatedElement接口: public Annotation[] getAnnotatio ...
- python读取中文文件编码问题
python 读取中文文件后,作为参数使用,经常会遇到乱码或者报错asii错误等. 我们需要对中文进行decode('gbk') 如我有一个data.txt文件有如下内容: 百度 谷歌 现在想读取文件 ...