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 表达式的更多相关文章

  1. 对于EL表达式和ONGL表达式区别的相关理解

    java程序跑起来之后,会有一个内存空间分配出来,存入用到的值,这个值的周围就是上下文空间,而九大内置对象等,都在这个值的周围放着,像这样: el 就只能获取value stack 周围 的数据,va ...

  2. Struts2笔记——ONGL表达式语言

    OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. ----------- ...

  3. 表达式语言之ongl表达式

    OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...

  4. ongl表达式中得到对象,调用对象方法(OA项目权限显示模块)

    在用户是否拥有某项权限的问题  是这样解决的: 用户登录之后  登录信息是保存在session域中的  通过el表达式可得到登录的对象信息  那么怎样判断用户是否拥有某项权限呢 ?如果没有上图中的判断 ...

  5. JSTL、EL、ONGL、Struts标签的区别与使用

     一.JSTL 来源 我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题: jsp维护难度增加 出事提示不明确,不容易提示 分工不明确等 解决上面的问题可以 ...

  6. ongl与Struts标签

    一.ONGL OGNL 的全称是“Object-Graph Navigation Language”,即对象图导航语言,它是一种功能强大的开源表达式语言.使用这种表达式语言可以通过某种表达式语法存取  ...

  7. Struts2搭建及利用OGNL表达式弹出计算器

    0x01 环境搭建 1.创建Struts2应用 创建一个动态网站项目 2.配置Tomcat启动环境 3.在WebContent目录下的WEB-INF文件夹中创建web.xml,Tomcat启动时会加载 ...

  8. struts2笔记(2)

    <context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...

  9. Struts2 源码分析——DefaultActionInvocation类的执行action

    本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...

随机推荐

  1. sim卡中的汉字存储格式

    Sim卡中的ucs2格式 Sim卡中的中文都是以ucs2格式存储的,ucs2和unicode只是字节序不同,unicode是小头在前,ucs2是大头在前. Ucs2与GB2312互换可以用VC中的Wi ...

  2. isequal 和startswith 使用

    如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作: :fromhost-ip, isequal, "192.168.0.160″ /var/log/host160.log : ...

  3. hdu 1210_(逻辑训练)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1210 #include<stdio.h> int main() { int n,t,sum ...

  4. POJ1008

    2014-08-22 题意: (有中文版题目..)  就是两种历法的转换 思路: 把两种历法的细节了解了就很简单了 Haab历法一年365,Tzolkin一年260天 先求出总天数sumDay,然后s ...

  5. nodejs项目中的路由写法

    //两种路由写法,一种封装成函数,返回结果,此种方法可以传递参数, "use strict"; var _ = require("lodash"); var e ...

  6. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  7. sql server 规则

    1.规则的创建 create rule rule_no1 as @e_salary>500 2.把自定义规则绑定到列 exec sp_bindrule 'rule_no1','employee. ...

  8. AngularJS ng-class用法

    mark from https://my.oschina.net/gejiawen0913/blog/188547 ng-class是AngularJS预设的一个指令,用于动态自定义dom元素的css ...

  9. vi、vim 配置上下左右方向键和删除键

    vi.vim 配置上下左右方向键和删除键 " An example for a vimrc file. " " Maintainer: Bram Moolenaar &l ...

  10. c#实现pdf另存为功能

    c#实现pdf另存为功能 /// <summary> /// PDF另存为效果 /// </summary> /// <param name="fileName ...