一、什么是OGNL

 Object Graph Navigation Language对象图导航语言。

是Struts2默认的表达式语言,开源,功能更强大。和EL表达式有点相似

存取对象的属性,调用对象的方法

访问静态方法,静态属性

访问值栈及Stack Context

支持赋值、运算操作、字段类型转化等。

二、简单例子

导入所需要的struts2的包

web.xml增加struts2过滤器

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

实体类

package com.pb.entity;

/*
* 街道实体类
*/
public class Street {
private int streetId; //街道ID
private String streetName; //街道名称 public Street() {
super();
// TODO Auto-generated constructor stub
}
public Street(int streetId, String streetName) {
super();
this.streetId = streetId;
this.streetName = streetName;
}
public int getStreetId() {
return streetId;
}
public String getStreetName() {
return streetName;
}
public void setStreetId(int streetId) {
this.streetId = streetId;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
} }
package com.pb.entity;
/*
* 房子实体类
*/
public class Hourse { private int hourseId; //房屋ID
private String hourseName; //房屋名称
private Street street; //房屋所在街道 public Hourse() {
super();
// TODO Auto-generated constructor stub
}
public Hourse(int hourseId, String hourseName, Street street) {
super();
this.hourseId = hourseId;
this.hourseName = hourseName;
this.street = street;
}
public int getHourseId() {
return hourseId;
}
public String getHourseName() {
return hourseName;
}
public Street getStreet() {
return street;
}
public void setHourseId(int hourseId) {
this.hourseId = hourseId;
}
public void setHourseName(String hourseName) {
this.hourseName = hourseName;
}
public void setStreet(Street street) {
this.street = street;
} }

HourseAction

package com.pb.web.action;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.Hourse;
import com.pb.entity.Street; public class HourseAction extends ActionSupport {
private Hourse hourse; @Override
public String execute() throws Exception {
//声明街道对象
Street street =new Street(001,"南新路");
hourse=new Hourse(11,"一房一厅",street);
return SUCCESS;
} public Hourse getHourse() {
return hourse;
} public void setHourse(Hourse hourse) {
this.hourse = hourse;
} }

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="hourse" class="com.pb.web.action.HourseAction">
<result name="success">
/ognl1.jsp
</result>
</action>
</package> </struts>

ognl1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL一</title>
</head>
<body>
房屋的名称:<s:property value="hourse.hourseName"/>
房屋的街道名称:<s:property value="hourse.street.streetName"/>
<s:debug/>
</body>
</html>

在地址栏中输入

http://localhost:8080/OGNLDemo1/hourse.action

发生页面跳转,并取出其中的值

三、访问值栈中的值

四、访问List 、Map、Set

struts.xml

    <action name="ognl" class="com.pb.web.action.OgnlAction">
<result name="success">
/ognllist.jsp
</result>
</action>

ognllistAction

package com.pb.web.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 com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.Street; public class OgnlAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Street> streetList;
private Map<String, Street> streetMap;
private Set <Street> streetSet;
public List<Street> getStreetList() {
return streetList;
}
public void setStreetList(List<Street> streetList) {
this.streetList = streetList;
}
public Map<String, Street> getStreetMap() {
return streetMap;
}
public void setStreetMap(Map<String, Street> streetMap) {
this.streetMap = streetMap;
}
public Set<Street> getStreetSet() {
return streetSet;
}
public void setStreetSet(Set<Street> streetSet) {
this.streetSet = streetSet;
} @Override
public String execute() throws Exception {
streetList=new ArrayList<Street>();
streetList.add(new Street(1, "高新南一路"));
streetList.add(new Street(2, "高新南二路"));
streetList.add(new Street(3, "高新南三路"));
streetMap=new HashMap<String,Street>();
streetMap.put("k1", new Street(4, "高新南四路"));
streetMap.put("k2", new Street(5, "高新南五路"));
streetMap.put("k3", new Street(6, "高新南六路"));
streetSet =new HashSet<Street>();
streetSet.add(new Street(7, "高新南七路"));
streetSet.add(new Street(8, "高新南八路"));
streetSet.add(new Street(9, "高新南九路"));
return SUCCESS;
} }

jsp页页

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL一</title>
</head>
<body>
<h1>List</h1>
访问List<s:property value="streetList" /><br/>
访问List中第一个元素:<s:property value="streetList[0].streetName" /><br/>
List中的大小:<s:property value="streetList.size()" /><br/>
List是否为空:<s:property value="streetList.isEmpty()" /><br/>
自定义集合List:<s:property value="{1,2,3,4,5}" /><br/>
自定义集合List访问第一个元素:<s:property value="{1,2,3,4,5}[0]" /><br/>
<hr/>
<h1>Map</h1>
访问Map<s:property value="streetMap" /><br/>
访问Map中第一个元素:<s:property value="streetMap['k1'].streetName" />|<s:property value="streetMap.k1.streetName"/><br/>
访问Map 中所有key:<s:property value="streetMap.keys" /><br/>
访问Map 中所有values:<s:property value="streetMap.values" /><br/>
Map中的大小:<s:property value="streetMap.size()" /><br/>
Map是否为空:<s:property value="streetMap.isEmpty()" /><br/>
自定义集合Map:<s:property value="#{'k1':'v1','k2':'v2','k3':'v3'}" /><br/>
自定义集合Mapt访问第一个元素:<s:property value="#{'k1':'v1','k2':'v2','k3':'v3'}['k1']" />|<s:property value="#{'k1':'v1','k2':'v2','k3':'v3'}.k1" /> <br/>
<hr/>
<h1>Set</h1>
访问Set<s:property value="streetSet" /><br/>
访问Set中第一个元素:<s:property value="streetSet.toArray()[0].streetName" />|<s:property value="streetSet.toArray()[0].streetName"/><br/>
Set中的大小:<s:property value="streetSet.size()" /><br/>
Set是否为空:<s:property value="streetSet.isEmpty()" /><br/>
<hr/>
<s:debug/>
</body>
</html>

在页面中输入:http://localhost:8080/OGNLDemo1/ognl.action访问

五、访问静态方法和投影

5.1、访问静态方法和静态属性

package com.pb.demo;
public class Demo {
public final static String STR="STATIC STR";
public static String staticMethod(){
String info="Demo Static Method";
return info;
}
}

在ognl2.jsp 中可以通过如下代码访问该类的静态属性以及静态方法:

<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>OGNL 对象图导航语言</h1>
调用静态方法:<s:property value="@com.pb.demo.Demo@staticMethod()"/> <br>
调用静态常量:<s:property value="@com.pb.demo.Demo@STR"/>
<s:debug/>
</body>
</html>

struts.xml

//开启静态方法
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

其中<constant>常量你可以去default.properties 文件中查找并复制使用。

5.2、访问投影

选择就是过滤满足选择条件的集合元素。选择操作的语法是:collection.{X YYY},其中X
是一个选择操作符,后面则是选择用的逻辑表达式,而选择操作符有三种:
?选择满足条件的所有元素
^选择满足条件的第一个元素
$选择满足条件的最后一个元素

package com.pb.entity;
/*
* 用户名
*/
public class User {
private Integer age;
private String name;
private String pasword;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String name, String pasword, Integer age) {
super();
this.name = name;
this.pasword = pasword;
this.age = age;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
public String getPasword() {
return pasword;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setPasword(String pasword) {
this.pasword = pasword;
} }
package com.pb.web.action;

import java.util.ArrayList;
import java.util.List; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class UserAction extends ActionSupport {
private User user;
private List<User> users=new ArrayList<User>();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String execute() throws Exception {
User u1 = new User();
u1.setName("zhangsan");
u1.setPasword("zhangsan");
u1.setAge(10);
this.users.add(u1);
User u2 = new User();
u2.setName("lisi");
u2.setPasword("lisi");
u2.setAge(23);
this.users.add(u2);
User u3 = new User();
u3.setName("wangwu");
u3.setPasword("wangwu");
u3.setAge(22);
this.users.add(u3);
return SUCCESS;
} }

struts.xml

<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.pb.web.action.UserAction">
<result name="success">
/ognl.jsp
</result>
</action>
</package>

jsp页面

<%@taglib prefix="s" uri="/struts-tags" %>
<!-- 年龄大于18 的所有用户的姓名 -->
集合元素过滤:<s:property value="users.{?#this.age>18}.{name}"/><br/>
<!-- 年龄大于18 的所有用户的第一个用户的姓名 -->
集合元素过滤:<s:property value="users.{^#this.age>18}.{name}"/><br/>
<!-- 年龄大于18 的所有用户的最后一个用户的姓名 -->
集合元素过滤:<s:property value="users.{$#this.age>18}.{name}"/><br/>

Struts2(九)OGNL标签一与Struts2标签的更多相关文章

  1. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  2. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  3. struts2之OGNL和struts2标签库和ValueStack对象

    OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.  struts2框架默认就支持Ognl表达式语言(所以 ...

  4. [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. struts2.1.6教程六、使用标签

    1.基础表单标签 准备工作:建立struts2tag项目,搭建好struts2的开发环境.在html我们常用的基础表单标签主要有文本域.密码域.提交.重置四种.它们在strust2中可以通过标签来生成 ...

  6. struts2框架学习笔记7:struts2标签

    三大标签: 1.JSP:脚本,为了替代servlet,已过时 2.JSTL:标准标签库(core.format.sql.xml),还未淘汰的只有core库 3.Struts2标签库:由Struts2开 ...

  7. struts2第四天——拦截器和标签库

    一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...

  8. Struts2中s:set标签和s:if标签小结

    1.  s:set标签 格式:<s:set name="" value="" scope=””/> 说明:把jsp页面中的一个值,以name存储起来 ...

  9. Struts2第十一篇【简单UI标签、数据回显】

    Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签-也就是显示页面的标签-.. 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要在服务器端解析然后再被浏览器 ...

随机推荐

  1. Linux学习7-tomcat部署多个项目(多个端口)

    前言 前面已经在tomcat上搭建了jenkins的环境,如果我们有多个项目需要部署的话,如何在一个tomcat下部署多个项目呢? 前面是直接在:8080/jenkins访问的,如果有其它项目部署的话 ...

  2. Unity中的内存泄漏

    在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...

  3. 蓝精灵:寻找神秘村Smurfs: The Lost Village迅雷下载

    蓝妹妹(黛米·洛瓦托 Demi Lovato 配音)发现了一张遗落的地图,由此引发精灵们对于神秘村庄真实性的猜想.于是,满怀好奇心的蓝妹妹与聪聪(丹尼·朴迪 Danny Pudi 配音).笨笨(杰克· ...

  4. 用自定义的RoundImageView来实现圆形图片(可加边框)

    本文的控件来自:http://blog.csdn.net/alan_biao/article/details/17379925 这个控件不同于之前介绍过的那个框架,这个仅仅能过将图片裁剪为圆形,没能弄 ...

  5. 层次聚类 Hierarchical Clustering

    -------------------------------- 不管是GMM,还是k-means,都面临一个问题,就是k的个数如何选取?比如在bag-of-words模型中,用k-means训练码书 ...

  6. html input type=file 选择图片,图片预览 纯html js实现图片预览

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. BZOJ3916: [Baltic2014]friends

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3916 题解:随便hash.刚开始看错题WA了N发.(我连双hash都写了!) 代码: #inc ...

  8. verilog语法实例学习(4)

    Verilog模块 Verilog中代码描述的电路叫模块,模块具有以下的结构: module module_name[ (portname {, portname})]; //端口列表 [parame ...

  9. Asp.net5 Session Set扩展

    关于Asp.net 5 如何使用Session大家可以参考http://www.mikesdotnetting.com/article/270/sessions-in-asp-net-5 和http: ...

  10. RxJava RxPermissions 动态权限 简介 原理 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...