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. Copy an serializable object deeply

    http://www.java2s.com/Tutorial/Java/0100__Class-Definition/Copyanserializableobjectdeeply.htm http:/ ...

  2. FPC Trace Pattern Layout Design Notices (軟板線路設計注意事項)

    整理了一些軟板(FPCB/Flex Cable)製造廠關於線路設計的要求 (Design Guide)以避免應用上的品質問題. 1.Relationship between Through Hole, ...

  3. Android LocalActivityManager的用法

    在开发中会碰到在一个activity中的局部(或者是activity的Fragment中)显示其他的activity 的内容,这时就用到了LocalActivityManager类. 假设这个容器是一 ...

  4. [Oracle] Listener的动态注册

    在有Oracle Listener的动态注册之前,采用的是静态注册,所谓静态注册是指Oracle实例在启动时,读取listener.ora里的配置,然后注册到Listener,它主要有两个缺点: 1. ...

  5. Table显示边框

    style="border-bottom: 1px solid #CCCCCC;"

  6. win7+cygwin+hadoop+eclipse

    1.Cygwin : Net    下的:openssh,openssl Base  下的:sed (若需要Eclipse,必须sed)默认即可 Devel 下的:subversion(建议安装) 2 ...

  7. codeforces 547B. Mike and Feet 单调栈

    题目链接 用单调栈计算出一个数字, 左边第一个比他小的数字的位置, 右边比第一个他小的数字的位置, 然后len = r[i] - l[i] +1. ans[len] = max(ans[len], a ...

  8. 面试题之 query转为obj

    要注意处理编码后的字串  对于a=123要得到number形的值 function parseQueryString(url) { var obj = {}; var query = url.sear ...

  9. knockout+echarts

    knockout+echarts实现图表展示   v一.需要学习的知识 knockout, require, director, echarts, jquery.简单的入一下门,网上的资料很多,最直接 ...

  10. 网络上USB后面跟AF或AM接口的意思

    AM to micro 5pin或AF to micro 5pin 这里的AM或AF是Type a male和Type a female的简写 Type a male:A型男士 Type a fema ...