Struts2的OGNL标签详解

合集下载

OGNL(取值、赋值、调用普通方法、静态方法、创建对象)

OGNL(取值、赋值、调用普通方法、静态方法、创建对象)

OGNL(取值、赋值、调⽤普通⽅法、静态⽅法、创建对象)1、OGNL表达式(1)概念OGNL:对象导航图语⾔(Object Graph Navigation Language),是⼀种表达式语⾔,功能⽐EL表达式更为强⼤,它是集成在Struts中的。

在创建Struts项⽬的时候已经将OGNL有关的包导⼊了,所以,这⾥不需要重复导包。

(2)OGNLContext对象:EL表达式从是⼀个内置对象中取值,⽽OGNL表达式只从OGNLContext对象中取值,该对象可以分为两部分,其中root部分可以存放任何对象,Context部分只能存放键值对。

2、OGNL初始化和取值public class OgnlTest {public void test() throws OgnlException {User rootuser=new User("zhai","123",12);//root部分Map<String,User> context=new HashMap<String, User>();//context部分context.put("user1",new User("user1","111",12));context.put("user2",new User("user2","222",13));OgnlContext ognlContext=new OgnlContext();//创建OGNLContext对象ognlContext.setRoot(rootuser);ognlContext.setValues(context);//将root和context部分放⼊到OGNLContext内部String name= (String)Ognl.getValue("username",ognlContext,ognlContext.getRoot());//取值Integer age=(Integer)Ognl.getValue("userage",ognlContext,ognlContext.getRoot());String password=(String)Ognl.getValue("password",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name+",年龄"+age+",密码:"+password);String name1= (String)Ognl.getValue("#ername",ognlContext,ognlContext.getRoot());Integer age1=(Integer)Ognl.getValue("#erage",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name1+",年龄"+age1);}(1)在初始化部分,需要先对root和context分别做初始化操作,然后将root和context放⼊到OGNLContext对象内部,这样初始化⼯作就完成了。

Struts2学习之二--Struts2标签介绍

Struts2学习之二--Struts2标签介绍

Struts2学习之二--Struts2标签介绍热12已有 14625 次阅读 2009-07-12 18:53[顶]3G移动--Android开发工程师全能班(转) Struts2学习之二--Struts2标签介绍在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。

如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。

我的E-MAIL:Max.M.Yuan@。

在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。

分类将标志库按功能分成HTML、Tiles、Logic和Bean等几部分严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志表达式语言(expression languages)不支持嵌入语言(EL)OGNL、JSTL、Groovy和Velcity以上表格,纯属个人总结,如有所不足或错误,请不吝指正好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。

1.非UI标志o if、elseif和else描述:执行基本的条件流转。

参数:名称必需默认类型描述备注test 是Boolean 决定标志里内容是否显示的表达式else标志没有这个参数id 否Object/String 用来标识元素的id。

在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Condition Flow</title></head><body><h3>Condition Flow</h3><!--这里有点小技巧:本来可以用#[0]来获得,请求中name的值。

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利⽤原理及OGNL机制Struts2漏洞利⽤原理及OGNL机制研究概述在MVC开发框架中,数据会在MVC各个模块中进⾏流转。

⽽这种流转,也就会⾯临⼀些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态⽽造成的:View层—表现为字符串展⽰数据在页⾯上是⼀个扁平的、不带数据类型的字符串,⽆论数据结构有多复杂,数据类型有多丰富,到了展⽰的时候,全都⼀视同仁的成为字符串在页⾯上展现出来。

数据在传递时,任何数据都都被当作字符串或字符串数组来进⾏。

Controller层—表现为java对象在控制层,数据模型遵循java的语法和数据结构,所有的数据载体在Java世界中可以表现为丰富的数据结构和数据类型,你可以⾃⾏定义你喜欢的类,在类与类之间进⾏继承、嵌套。

我们通常会把这种模型称之为复杂的对象树。

数据在传递时,将以对象的形式进⾏。

可以看到,数据在不同的MVC层次上,扮演的⾓⾊和表现形式不同,这是由于HTTP协议与java的⾯向对象性之间的不匹配造成的。

如果数据在页⾯和Java世界中互相传递,就会显得不匹配。

所以也就引出了⼏个需要解决的问题:1.当数据从View层传递到Controller层时,我们应该保证⼀个扁平⽽分散在各处的数据集合能以⼀定的规则设置到Java世界中的对象树中去。

同时,能够灵活的进⾏由字符串类型到Java中各个类型的转化。

2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进⾏访问。

同时,在⼀定程度上控制对象树中的数据的显⽰格式。

我们稍微深⼊思考这个问题就会发现,解决数据由于表现形式的不同⽽发⽣流转不匹配的问题对我们来说其实并不陌⽣。

同样的问题会发⽣在Java世界与数据库世界中,⾯对这种对象与关系模型的不匹配,我们采⽤的解决⽅法是使⽤如hibernate,iBatis等框架来处理java对象与关系数据库的匹配。

现在在Web层同样也发⽣了不匹配,所以我们也需要使⽤⼀些⼯具来帮助我们解决问题。

31________struts2_3_ognl_非UI_UI_过滤投影

31________struts2_3_ognl_非UI_UI_过滤投影

OGNL:【struts的标签库在 struts2-core-2.3.11.jar 下的META-INF下】【引入标签库:<%@ taglib uri="/struts-tags" prefix="s"%>】OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。

Struts2框架使用OGNL作为默认的表达式语言。

OGNL相对其它表达式语言具有下面几大优势:1、支持对象方法调用,如xxx.doSomeSpecial();2、支持类静态的方法调用和值访问,表达式的格式:@[类全名(包括包路径)]@[方法名 | ?值名],例如:@ng.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;3、支持赋值操作和表达式串联,如price=100, discount=0.8,calculatePrice(),这个表达式会返回80;4、访问OGNL上下文(OGNL context)和ActionContext;5、操作集合对象。

Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map的接口.OGNL(Object Graph Navigation Language),是一种表达式语言。

使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。

如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。

================================================================================ ====================================================【一、理解Struts2中的 ValueStack:】ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象.Struts 框架把 ValueStack 对象保存在名为“struts.valueStack”的请求属性中,request 中在 ValueStack 对象的内部有两个逻辑部分:ObjectStack: Struts 把动作和相关对象压入 ObjectStack 中--List 对象栈ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中Map栈Struts 会把下面这些映射压入 ContextMap 中 (Map栈中)root: ObjectStack对象栈的引用parameters: 该 Map 中包含当前请求的请求参数request: 该 Map 中包含当前 request 对象中的所有属性session: 该 Map 中包含当前 session 对象中的所有属性application:该 Map 中包含当前 application 对象中的所有属性attr: 该 Map 按如下顺序来检索某个属性: request, session, application在ObjectStack(对象栈)中一般放入:ValueStackAction对象map集合实体类对象================================================================================ =======================================【二、理解OGNL Context】OgnlValueStack 类包含两个重要的属性一个root和一个context。

Struts2知识点总结

Struts2知识点总结

Struts2基础知识Struts2概述1.Struts2框架应用javaee三层结构中的web层框架。

2.Struts2框架在struts1和webwork基础之上发展的全新框架。

3.Struts2所解决的问题:在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。

图解:4.现在比较稳定的Struts2版本struts-2.3.24-all.zip5.web层常见框架1.struts2.springMVCStruts2框架入门1.导入jar包1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring包,是不能使用的,导入会导致程序不能运行。

2.到app目录里面复制案例的jar包是最好的方法。

2.创建action3.配置action类的访问路径1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的,位置必须在src下面,名称为struts.xml 。

2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即可。

3.action的配置*注意访问路径:http://域名/端口号/项目名/action名.action注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。

4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴即可。

Struts2执行过程图解:Struts2配置1.是一种常量标签2.修改Struts2的默认常量值1.常用方式在struts.xml中进行配置。

2.其它两种方式1.在src下面创建struts.properties文件并修改。

2.在web.xml文件中进行修改。

3.Struts2最常用的常量struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。

Struts2笔记(一)可使用全局页面。

1、配置方法:在package标签下配置2、注意:该标签只能在一个package标签中使用,如果有多个标签,需要重新定义。

STRUTS2入门教程(全新完整版)

STRUTS2入门教程(全新完整版)

一、发展历史及简介发展历史Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages、Servlet、标签库以及面向对象的技术水准。

Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。

这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。

这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。

当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。

同样,软件工程师使用Struts为业务应用的每一层提供支持。

它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。

我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。

如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。

早期Smalltalk程序语言便采用了MVC(Model-View-Controller)模式(Patterns)以增加程序代码弹性,MVC模式将程序代码整理切割为三部分,Model部分是业务与应用领域(Business domain)相关逻辑、管理状态之对象,Controller部分接收来自View所输入的资料并与Model部分互动,struts业务流程控制(Flow Control)之处,View部分则负责展现资料、接收使用者输入资料。

在Java应用中,JFC/Swing、AWT、JSP皆是可用作View的技术规格,而JavaBean与Enterprise JavaBean规格则可用于Model程序代码,一旦应用程序以MVC模式加以适当的分割,Model部分程序代码可在不同使用者接口外观的应用程序中重复使用。

随着JSP与Servlet技术大量应用于以Web为基础的应用程序,Java开发人员群体认为应以较佳的模式以提升Web应用程序的可维护性与重复使用性。

Struts2标签库和OGNL

Struts2标签库和OGNL

第8章?第9章Struts2标签库和OGNL学习内容Struts 2标签库OGNL能力目标熟练使用Struts 2常用标签熟练使用OGNL本章简介前面我们编写的案例使用的都是HTML 标签,这些标签并不能很好的与Struts 2框架结合,Struts 2和Struts 1一样都自带了功能强大、成熟完善的标签库供我们使用,通过使用这些标签库可以大大提高开发效率和代码的可维护性。

其实Struts 2的标签库是建立在OGNL 基础上的,OGNL 是一种功能强大的表达式语言,通过简单的语法即可存取对象的属性、调用对象的方法、遍历等功能。

本章将学习OGNL 和Struts 2标签库,包括数据访问标签、控制标签、表单标签和非表单标签等。

核心技能部分9.1 OGNL9.1.1 ActionContextStruts 2中的ActionContext 、ValueStack 和StackContext 对象与OGNL 密切相关,理解这三个对象时学习OGNL 的前提。

在前面的学习中,我们已经在使用ActionContext 、ValueStack 和StackContext 对象了,这三个对象的作用及其之间的关系如图8.1.1所示。

图8.1.1ActionContext1. ActionContext 对象ActionContextValueStackStackContextAction 其他Session Request Application Parameters Attribute 其他ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文。

我们可以把上下文可以看作是一个容器,用于存放Action执行时需要使用的对象,例如请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)等。

ognl 三目表达式判断字符串参数拼接

ognl 三目表达式判断字符串参数拼接

ognl 三目表达式判断字符串参数拼接1.引言1.1 概述在本文中,将会介绍OGNL(Object-Graph Navigation Language)以及如何利用三目表达式来判断字符串参数拼接的方法。

OGNL是一种强大的表达式语言,可以用于访问和操作对象的属性、方法和索引,是很多Java框架(如Struts2、JSP等)中常用的表达式语言之一。

三目表达式是一种简洁的条件表达式,由三个部分组成:条件部分、真值部分和假值部分。

根据条件的真假情况,表达式可以返回真值部分或假值部分的值。

在本文中,我们将会利用三目表达式来判断字符串参数的情况,并实现相应的拼接方法。

本文的目的是为读者提供一个深入理解OGNL和三目表达式的文章,帮助读者在实际项目中更好地应用这两种技术。

在接下来的章节中,我们将首先介绍OGNL的基本概念和用法,然后深入探讨三目表达式的工作原理和常见用法。

最后,我们将给出一些例子,帮助读者更好地理解和运用OGNL和三目表达式。

在这篇文章中,我们将从基础知识开始,逐步向高级内容过渡。

无论您是初学者还是有一定经验的开发者,本文都会为您提供有价值的信息和实用的技巧。

希望读者通过本文的阅读,能够更加了解OGNL和三目表达式,并能够在实际项目中灵活运用这些技术。

接下来,我们将进入正文部分,首先介绍OGNL的简介和基本概念。

让我们一起开始这段令人兴奋的学习之旅吧!1.2 文章结构该篇文章主要围绕OGNL 和三目表达式展开讨论,并介绍了如何使用这两者来判断字符串参数拼接的方法。

文章结构如下所示:第一部分为引言,主要包括概述、文章结构和目的。

1.1 概述:介绍文章的主题和背景,提出需要解决的问题。

1.2 文章结构:本部分,即本文所在的部分,将详细介绍文章的结构和内容布局。

1.3 目的:阐明文章的目标和意义,以及解决问题的重要性。

第二部分为正文,主要分为三个小节,分别是OGNL 简介、三目表达式概述和字符串参数拼接方法。

s2-052原理

s2-052原理

s2-052原理S2-052是指一种计算机安全漏洞,原理是利用Apache Struts 2框架的一个漏洞来执行远程代码。

Apache Struts 2是一个用于构建Web应用程序的开源框架,被广泛使用。

S2-052漏洞是Struts 2框架的一个安全漏洞,其原理是对Struts 2的核心组件——OGNL(Object-Graph Navigation Language)表达式进行了恶意注入。

在受到该漏洞攻击的情况下,攻击者可以构造恶意请求并发送给受影响的服务器。

服务器接收到请求后,会解析请求中的OGNL表达式,并在执行过程中未对其进行充分验证和过滤,导致攻击者可以在服务器上执行任意代码。

通过利用S2-052漏洞,攻击者可以实现远程命令执行,包括任意文件读取、文件删除、命令执行等操作。

这可能导致服务器的敏感数据泄露、系统被入侵、服务被停止等安全问题。

为了修复这个漏洞,Apache Struts 2开发团队发布了针对S2-052漏洞的安全补丁。

用户应该尽快更新Struts 2框架,并确保及时应用最新的安全补丁,以防止受到S2-052漏洞的攻击。

S2-052漏洞的具体原理如下:1. Apache Struts 2框架中的DefaultActionMapper类存在安全问题,攻击者可以通过构造恶意的请求来利用该漏洞。

2. 默认情况下,Struts 2框架使用的是通配符“/*”来匹配URL中的动作(action)。

攻击者可以通过构造特殊的URL,例如“/*/xxx.action”,来绕过框架的安全检查。

3. 在解析请求时,DefaultActionMapper会将URL中的动作部分进行解析。

恶意请求中的动作部分包含OGNL表达式,由${}包裹。

4. OGNL是Struts 2框架中用于动态访问和操作Java对象的表达式语言,可以通过OGNL表达式执行代码。

5. 由于默认配置下Struts 2框架对OGNL表达式的处理不够安全,未对其中的特殊字符进行充分的过滤和验证。

Struts2介绍

Struts2介绍

Struts2集成指南关于Struts2Struts是Apache软件基金会(ASF)赞助的一个开源项目。

它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。

它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。

Struts,a history在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。

因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。

为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。

后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。

Craig McClanahan2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。

至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。

Struts1 vs. Struts2侵入性Struts 1在编程方面是面向抽象类编程,而不是面向接口编程。

Struts 1要求自定义Action 类继承一个特定的抽象基类Action。

另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。

ognl 规则表达式解析

ognl 规则表达式解析

ognl 规则表达式解析OGNL(Object-Graph Navigation Language)是一种用于Java 语言的表达式语言,它被广泛应用于各种框架和工具中,如Struts2、Spring等。

本文将探讨OGNL规则表达式的用法和应用。

一、OGNL简介OGNL是一种基于Java的表达式语言,它提供了一种简洁而灵活的方式来访问和操作Java对象的属性和方法。

通过OGNL表达式,我们可以在运行时动态地获取、设置对象的属性,调用对象的方法,甚至进行条件判断和循环控制等操作。

二、OGNL表达式的基本语法1. 访问对象属性OGNL表达式使用"."来访问对象的属性。

例如,对于一个名为"person"的对象,我们可以使用如下的OGNL表达式来获取其属性:``````2. 调用对象方法OGNL表达式使用"()"来调用对象的方法。

例如,对于一个名为"person"的对象,我们可以使用如下的OGNL表达式来调用其方法:```person.getName()```3. 条件判断OGNL表达式使用"?"和":"来进行条件判断。

例如,我们可以使用如下的OGNL表达式来判断一个数字是否为正数:```number > 0 ? "positive" : "negative"```4. 数组和集合访问OGNL表达式使用"[]"来访问数组和集合中的元素。

例如,对于一个名为"list"的集合,我们可以使用如下的OGNL表达式来访问其中的元素:```list[0]```5. 运算符OGNL表达式支持常见的算术运算符、逻辑运算符和比较运算符。

例如,我们可以使用如下的OGNL表达式来进行加法运算:```a + b```三、OGNL在框架和工具中的应用1. Struts2Struts2是一个基于OGNL的MVC框架,它使用OGNL表达式来实现数据的绑定和动态结果的定位。

OGNL表达式语言-类似EL、ValueStack、Action

OGNL表达式语言-类似EL、ValueStack、Action

1.OGNL2.ValueStack3.ValueStack4.重构资费列表5.Action基本原理1. OGNL1.1. OGNL介绍1.1.1. 什么是OGNLObject Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。

1.1.2. 为什么用OGNLOGNL表达式功能很强大,后面我们会重点阐述。

而Struts2默认采用OGNL 表达式访问Action的数据,实际上是通过ValueStack用封装后的OGNL来访问的Action。

1.1.3. OGNL原理OGNL是独立的开源组件,Struts2对其进行了改造及封装,要想了解Struts2中OGNL的运行原理,需参考ValueStack。

1.2. OGNL用法1.2.1. Struts2显示标签Struts2中,OGNL表达式要结合Struts2标签来访问数据,即OGNL表达式要写在Struts2标签内,因此我们先来介绍第一个Struts2的标签——显示标签。

1、语法<s:property value="OGNL"/>2、解释该标签的作用是根据OGNL表达式访问Action,并将取出的数据替换标签本身。

如下图,实际上该标签类似于EL表达式中的${ }。

图-11.2.2. 2个常用的OGNL表达式OGNL表达式一共有8种使用方法,其中前2种要求大家必须掌握,是经常要用到的方式,后6种了解即可,下面我们来介绍这2种必须掌握的OGNL。

1、访问基本属性语法:<s:property value="属性名"/>∙解释:这种方式的作用是将Action中的基本属性直接显示到标签的位置,属性名指的是Action中的属性。

∙举例:<s:property value="name"/>2、访问实体对象∙语法:<s:property value="对象名.属性名"/>∙解释:这种方式的作用是将Action中的实体对象属性显示到标签的位置,对象名指的是Action中的实体对象,属性名指的是实体对象中的属性。

ONGL入门介绍

ONGL入门介绍

//获得值栈中的foo属性
${foo}
如果访问其他Context中的对象,由于不是根对象,在访问时,需要加#前缀。
— application对象:用于访问ServletContext,例如#erName或者#application['userName'],相当于调用Servlet的getAttribute("username")。

Struts 2允许在值栈中使用索引,示例代码如下所示:
[0].name // 调用animal.getName()
[1].name // 调用man.getName()
★ 说明注意 ★
使用索引,并不是直接获得指定的元素,而是从指定的索引位置搜索。
Struts 2中的OGNL Context是ActionContext,如图8.2所示。
要使用索引属性,需要提供两对setter和getter方法,一对用于数组,一对用于数组中的元素。
如:有一个索引属性interest,它的getter和setter如下
public String[] interest;
public String[] getInterest(){ return interest;}
假如employees是一个包含了employee对象的列表,那么
#employees.{name}将返回所有雇员的名字的列表。
在投影期间,使用#this变量来引用迭代中的当前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
如果想指定创建的Map类型,可以在左花括号前指定Map实现类的类名。如:

Ognl表达式基本原理和使用方法

Ognl表达式基本原理和使用方法

Ognl表达式基本原理和使⽤⽅法Ognl表达式基本原理和使⽤⽅法1.Ognl表达式语⾔1.1.概述OGNL表达式OGNL是Object Graphic Navigation Language(对象图导航语⾔)的缩写,他是⼀个开源项⽬。

Struts框架使⽤OGNL作为默认的表达式语⾔。

OGNL优势⽀持对象⽅法调⽤,如:×××.doSomeSpecial();⽀持类静态的⽅法调⽤和值访问,表达式的格式@[类全名(包括包路径)]@[⽅法名 | 值名],例如:@ng.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;⽀持赋值操作和表达式串联,如price=100, discount=0.8,calculatePrice(),这个表达式会返回80;访问OGNL上下⽂(OGNL context)和ActionContext;操作(创建)集合对象。

总结:OGNL 有⼀个上下⽂(Context)概念,说⽩了上下⽂就是⼀个MAP结构,它实现了java.utils.Map 的接⼝。

Struts框架默认就⽀持Ognl表达式语⾔。

(从struts项⽬必须引⼊ognl.jar包可以看出)Ognl表达式语⾔的作⽤:jsp页⾯取值⽤EL表达式语⾔,也⽤于页⾯取值,是jsp页⾯取值的标准(默认就可以使⽤)Ognl表达式语⾔,Struts标签默认⽀持的表达式语⾔,必须配置Struts标签⽤,不能离开Struts标签直接使⽤,就是说Ognl必须在Struts 中使⽤对⽐来看,EL使⽤范围更⼴,项⽬中不限制使⽤哪⼀种,哪⼀种熟悉就使⽤哪⼀种1.2.OgnlContext对象(了解)OgnlContext对象是ognl表达式语⾔的核⼼。

但是项⽬中不会要求写OgnlContext的代码,Ognl标签其实是调⽤了OgnlContext对象。

开源框架之struts2笔记归纳

开源框架之struts2笔记归纳

Struts部分: (1)1)为什么要学习Struts框架 (2)2)为什么使用MVC? (2)3)MVC在JavaWeb中的实现 (2)*4) Struts2的主要工作流程 (2)3.Struts2框架的历史 (4)*4.Struts2框架基本使用 (4)1.Struts2使用基本规则 (5)Struts2标签+OGNL表达式 (6)2)OGNL工作原理 (6)4.OGNL在Struts2中的应用 (8)1)xwork对ognl进行扩展和改造 (8)*2)ValueStack对象(参考valuestack.jpg) (9)*3)在JSP中访问ValueStack数据方法 (9)a.使用Struts标签+OGNL表达式 (9)b.使用EL表达式 (9)1.Struts2框架Action组件的核心应用 (10)1)Action组件基本原理 (10)*3)Action属性注入 (11)*4)如何利用一个Action处理多个请求 (11)1.前期课程回顾 (11)1.Result组件原理 (12)1)Result组件的作用 (12)2)Result组件实现规则 (12)*2.常用的几种Result组件 (13)2)Action响应 (13)1.Struts2标签 (14)1)通用标签 (14)2)表单标签 (15)2.拦截器组件 (15)*2)掌握自定义拦截器的使用 (16)Struts部分:======================Day01=========================1)为什么要学习Struts框架Struts框架是MVC设计模式的实现,基于Struts开发可以简化开发难度,提高开发效率。

2)为什么使用MVC?MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。

3)MVC在JavaWeb中的实现Servlet,JSP,Filter,JDBCa.原ShoppingCart程序就是一个MVC结构实现View实现部分:采用JSP组件实现Model实现部分:采用DAO、Entity等组件实现Controller实现部分:采用ActionServlet组件实现b.ShoppingCart程序虽然基于MVC,但结构还有一些问题:当请求数量比较多时,需要在Servlet中编写大量的if...else分支语句,而且Servlet代码量非常多。

ognl 调用方法

ognl 调用方法

OGNL 调用方法什么是 OGNL?OGNL(Object-Graph Navigation Language)是一个用于对象图导航的表达式语言。

它可以通过简洁的语法来访问和操作 Java 对象的属性、方法和索引。

OGNL 最初是为 Struts 框架设计的,但现在已经被广泛应用于其他 Java 框架和工具中,如Spring、Hibernate 等。

OGNL 的特性OGNL 具有以下特性:1.简洁:OGNL 的语法非常简洁,使用起来非常方便。

2.强大:OGNL 支持访问对象的属性、方法和索引,还支持条件判断、循环等复杂表达式。

3.安全:OGNL 提供了安全机制,可以限制表达式的访问权限,防止恶意代码执行。

4.扩展性:OGNL 可以通过自定义函数和操作符来扩展其功能。

如何使用 OGNL?1. 引入依赖首先,在你的项目中引入 OGNL 的依赖。

如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖项:<dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.2.26</version></dependency>2. 创建一个对象在使用 OGNL 之前,我们需要先创建一个 Java 对象。

假设我们有一个名为Person的类,包含了name和age两个属性:public class Person {private String name;private int age;// 省略构造函数和 getter/setter 方法}3. 使用 OGNL 表达式接下来,我们可以使用 OGNL 表达式来访问和操作对象的属性、方法和索引。

访问属性使用 OGNL 表达式可以直接访问对象的属性:Person person = new Person("Alice", 25);String name = (String) Ognl.getValue("name", person); // 获取 name 属性的值int age = (int) Ognl.getValue("age", person); // 获取 age 属性的值调用方法使用 OGNL 表达式可以调用对象的方法:Person person = new Person("Alice", 25);String greeting = (String) Ognl.getValue("sayHello()", person); // 调用 sayHel lo() 方法并获取返回值如果方法有参数,可以在表达式中传递参数:Person person = new Person("Alice", 25);String message = (String) Ognl.getValue("getMessage('Hello')", person); // 调用 getMessage(String) 方法并传递参数访问索引如果对象是一个数组或集合,可以使用索引来访问其中的元素:List<String> names = Arrays.asList("Alice", "Bob", "Charlie");String name = (String) Ognl.getValue("[1]", names); // 获取索引为 1 的元素,即 "Bob"4. OGNL 表达式的语法OGNL 表达式的语法非常简洁,下面是一些常用的语法规则:•访问属性:使用点号.来访问对象的属性,如。

OGNL详解

OGNL详解

struts2 OGNL首先了解下OGNL的概念:OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:1.OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。

它里面可以存放很多个JavaBean对象。

它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。

否则要加前缀“#key”2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。

如:<s:propertyvalue="xxx"/>。

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4.值栈(ValueStack) :可以在值栈中放入、删除、查询对象。

访问值栈中的对象不用“#”。

Struts2总是把当前Action实例放置在栈顶。

所以在OGNL中引用Action中的属性也可以省略“#”。

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……1.#符号#符号的用途一般有三种。

—访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。

实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

arthas ognl 调用方法

arthas ognl 调用方法

arthas ognl 调用方法OGNL是一个用于在Java中访问对象图形的表达式语言。

OGNL允许您直接在Java代码中执行表达式,通过方法调用来获取属性值。

在OGNL中,您可以通过对象的属性名称和方法调用来访问对象图形。

在Action类中使用OGNL在Struts2项目中,OGNL是一个非常常见的工具,通常用于访问Action类中的属性,以及在JSP页面中显示这些属性。

OGNL可以非常方便地访问对象模型中的对象和属性,下面是示例代码:```${}```在上述代码中,我们可以利用OGNL来获取Action类中的user对象的name属性的值。

使用OGNL调用方法除了访问属性之外,OGNL还可以用来调用方法,并将结果作为表达式的值返回。

这在Struts2中通常用于执行Action类中的方法,或者以某种方式修改Action类中的状态。

调用一个无参方法在上述示例代码中,我们调用了user对象的getUsername()方法,并将其结果作为表达式的值返回。

下面是一个调用带有参数方法的示例:```${userService.getUserById(1)}```这种技术在Struts2中非常有用,因为它允许您使用OGNL表达式来直接访问Action类中的方法,而无需在Action类中编写与JSP页面相关的代码。

OGNL也可以用于调用静态方法。

下面是一个调用Math类的pow方法的示例:```${Math.pow(2,3)}```总结OGNL是Java中的一个重要工具,可以帮助您访问对象图形中的属性和方法。

本文介绍了如何在Action类和JSP页面中使用OGNL,以及如何调用带有参数的方法和静态方法。

希望本文提供的信息可以帮助您学习和使用OGNL技术,快速而轻松地访问Java对象模型中的属性和方法。

struts2常用标签详解

struts2常用标签详解

struts2标签详解A:<s:a xhref=""></s:a>-----超链接,类似于html里的<a></a><s:action name=""></s:action>-----执行一个view里面的一个action<s:actionerror/>-----如果action的errors有值那么显示出来<s:actionmessage/>-----如果action的message有值那么显示出来<s:append></s:append>-----添加一个值到list,类似于list.add();<s:autocompleter></s:autocompleter>-----自动完成<s:combobox>标签的内容,这个是ajaxB:<s:bean name=""></s:bean>-----类似于struts1.x中的,JavaBean的值C:<s:checkbox></s:checkbox>-----复选框<s:checkboxlist list=""></s:checkboxlist>-----多选框<s:combobox list=""></s:combobox>-----下拉框<s:component></s:component>-----图像符号D:<s:date/>-----获取日期格式<s:datetimepicker></s:datetimepicker>-----日期输入框<s:debug></s:debug>-----显示错误信息<s:div></s:div>-----表示一个块,类似于html的<div></div><s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----双下拉框E:<s:if test="#name=‟hujianqiang‟">asdfasdf</s:if><s:elseif test=""></s:elseif><s:else></s:else>-----这3个标签一起使用,表示条件判断F:<s:fielderror></s:fielderror>-----显示文件错误信息<s:file></s:file>-----文件上传<s:form action=""></s:form>-----获取相应form的值G:<s:generator separator="" val=""></s:generator>----和<s:iterator>标签一起使用H:<s:head/>-----在<head></head>里使用,表示头文件结束<s:hidden></s:hidden>-----隐藏值I:<s:i18n name=""></s:i18n>-----加载资源包到值堆栈<s:include value=""></s:include>-----包含一个输出,servlet或jsp页面<s:inputtransferselect list=""></s:inputtransferselect>-----获取form的一个输入<s:iterator></s:iterator>-----用于遍历集合L:<s:label></s:label>-----只读的标签M:<s:merge></s:merge>-----合并遍历集合出来的值O:<s:optgroup></s:optgroup>-----获取标签组<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右选择框P:<s:param></s:param>-----为其他标签提供参数<s:password></s:password>-----密码输入框<s:property/>-----得到'value'的属性<s:push value=""></s:push>-----value的值push到栈中,从而使property标签的能够获取value的属性R:<s:radio list=""></s:radio>-----单选按钮<s:reset></s:reset>-----重置按钮S:<s:select list=""></s:select>-----单选框<s:set name=""></s:set>-----赋予变量一个特定范围内的值<s:sort comparator=""></s:sort>-----通过属性给list分类<s:submit></s:submit>-----提交按钮<s:subset></s:subset>-----为遍历集合输出子集T:<s:tabbedPanel id=""></s:tabbedPanel>-----表格框<s:table></s:table>-----表格<s:text name=""></s:text>-----I18n文本信息<s:textarea></s:textarea>-----文本域输入框<s:textfield></s:textfield>-----文本输入框<s:token></s:token>-----拦截器<s:tree></s:tree>-----树<s:treenode label=""></s:treenode>-----树的结构U:<s:updownselect list=""></s:updownselect>-----多选择框<s:url></s:url>-----创建urlStruts2常用的Ajax标签Struts2为了简化Ajax过程,提供了一些常用的Ajax标签,对于一些更复杂的Ajax通信过程,我们可以使用JSON插件来实现。

struts2 页面遍历显示集合

struts2 页面遍历显示集合

struts2 页面遍历显示集合<s:iterator />可以遍历数据栈里面的任何数组,集合等等在使用这个标签的时候有三个属性值得我们关注1. value属性:可选的属性,value属性是指一个被迭代的集合,使用ognl表达式指定,如果为空的话默认就是ValueStack栈顶的集合.2.id属性:可选属性, 是指集合元素的id3.status属性:可选属性,该属性在迭代时会产生一个IteratorStatus对象,该对象可以判断当前元素的位置,包含了以下属性方法:int getCount(); 迭代元素个数int getIndex(); 迭代元素当前索引boolean getFirst(); 是否为第一个boolean getEven(); 是否为偶boolean getLast(); 是否最后一个bolean getOdd(); 是否为奇由于iteratorstatus对象并不是ognl的根对象因此访问需要加上#访问如下例子:<s:iterator value=”{’dd’,'bb’,'cc’}”status=”st”><s:if test=”#st.odd”><s:property value=”#st.index”/></s:if></s:iterator>iterator也可以迭代map对象,map对象中有几对key-value 就迭代几次,分别使用<s:property value=”key”/><s:property value=”value”/>iterator也可以迭代简单的数组集合<s:iterator value="collection1" status="status"><s:property value="collection1[#status.index][0]"/><s:property value="collection1[#status.index][1]"/></s:iterator>说明:[#status.index][?]" ,指示遍历数组指定的脚标元素,如果你不知道数组的长度呢?//以下是遍历数组每一个元素<s:iterator value="total" status="stuts"><s:iterator value="total[#stuts.index]" ><s:property/><br></s:iterator></s:iterator>//直接使用<s:property/>也可以打印出每一个数组内容***********iterator的value******************1.如果需要引用valueStack中的值,需要使用这样的形式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2的OGNL标签详解您的评价:收藏该经验一、Struts2可以将所有标签分成3类:UI标签:主要用于生成HTML元素的标签。

非UI标签:主要用于数据库访问,逻辑控制等标签。

Ajax标签:用于Ajax支持的标签。

对于UI标签,则有可以分为两类:表当标签:表单标签主要用与生成HTML页面的from元素,以及普通表单元素的标签。

非表单标签:非表单标签主要用于生成页面的树、Tab页等。

流程控制标签:主要包含用于实现分页、循环等流程的标签。

数据访问标签:主要包含用于输出ValueStack中的值,完成国际化等功能的标签。

Struts2标签库分类图:二、使用Struts2标签库的准备:1、在Web.Xml文件中增加标签库d定义。

(如果应用使用的是Servlet2.3以前)2、现在jsp中使用taglib编辑指令导入标签库,然后才可以使用标签。

三、Struts2的OGNL标签:OGNL是Object Graphic Navigation Language的缩写,它是一个开源项目。

Struts2框架使用OGNL作为默认的表达式语言。

在传统的OGNL表达式求值中,系统会假设系统只要一个根对象,但Struts2的Stack Context需要多个“根”对象,其中ValueStacke只是多个“根”对象的其中之一。

假设:使用标签OGNL表达式求值,不是用Struts2的OGNL表达式是求之。

如果系统的Context中包含两个对象:foo对象,它在Context中的名字为foo;bar对象,并且它在Context中的名为bar。

将foo对象设置成Context的根对象。

返回foo.getBlah()方法的返回值#foo.blah返回bar.getBlah()方法的返回值#bar.blah可以看出ONGL表达式的语法非正常简洁。

Struts2不只根据表达式从ValueStack中取的对象,还可以直接从对象中获取属性。

Struts2提供了一个特殊的OGNL ProperAccessories(属性访问器),它可以自动搜寻栈内的所有实体(从上到下),直接找到求值表达式匹配的属性。

Struts2使用标准的Context来进行OGNL表达式求值,OGNl处理的顶级对象是一个Context,这个Context对象就是一个Map类型实例,在该OGNL的Context中,有一个对象,这个根对象就是OGNL ValueStack,如果需要访问ValueStack里的属性,例如:#取出Valuestack中的bar属性:${bar};除此之外:Struts2还提供了一些命名对象,这些命名对象与根对象无关,它们只是存在于Stack Context中。

所以,访问这些对象实现需要使用#前缀来指明。

1、paramenters对象:用于访问HTTP请求参数,2、request对象:用于访问HttpServletRequset的属性(Attribute)的Map。

例如#erName3、Session对象:用于访问HttpSession的属性。

例如#erName4、Application对象:用于访问ServletContext的属性。

例如#erName5、Attr对象:如果可以访问到,则访问PageContext,否则将依次搜索HttpServletRequset,HttpSession,ServletContext中的属性。

值得注意的是:当系统创建Action实例后,该Action实例已经被保存到ValueStack中,故无需书写#即可访问Action属性。

OGNL中的集合(List/Map):直接生成一个List类型的集合,该List对象中包含三个元素,都个元素之间以英文逗号隔开;例:<s:set name="list"value="{'song','li','xing'}"/>直接生成一个Map类型的集合,该Map对象中每个Key-value对象之间以英文冒号隔开:多项之间以英文逗号隔开。

例:<s:set name="foobar"value="#{'1':'song','2':'li','3':'xing'}"/>Set标签用于蒋某个值放入指定范围:Scope:指定变量被放置的范围,该属性可以接受aplication、session、requset、page、action。

如果该属性,则默认在OGNL Context中。

Value:赋给变量的值,如果没有设置该属性,则将ValueStack栈顶的值付给变量。

对于集合,OGNL提供了两个与元素:in和not in,其中in判断某个元素是否在指定集合中;not in则用于判断某个元素是否不在指定集合中。

in表达式:<s:if test="'foo'in{'foo','bar'}">在</s:if><s:else>不在</s:else>not in 表达式:<s:if test="'foo'not in{'foo','bar'}">不在</s:if><s:else>在</s:else> OGNL还允许通过某个规则取得集合的自己,取得集合子集有三个操作符:1、?:取出所有符合选择逻辑的元素2、^:取出符合集合逻辑的第一个元素3、$:取出符合选择逻辑的最后一个元素例:<s:iterator value="books.{?#this.price>35}"><s:property value="title"/>-$<s:property value="price"/><br ></s:iterator>在上面代码中,直接在集合后紧跟.{}运算符表明用于取出该集合的子集,{}内的表达式用于获取符合集合的元素,this指的是为了从大集books刷选数据到小集合,需要对大集合books进行迭代,this代表当前迭代的元素。

表达式用于获取集合中价格大于35的书的集合。

(一)、控制标签:Struts2的非UI标签包括控制标签和数据标签,主要用于完成流程控制,以及对ValueStack的控制,数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程控制,例如分支,循环等操作,也可以对集合的合并,排列。

控制标签有:1、if:用于控制选择器输出的标签;2、else if:与if标签结合使用,用于控制选择输出的标签;3、else:与if标签结合使用,用于控制选择输出的标签;4、append:将多个集合拼接成一个新的集合;5、generator:字符解析器,用于将一个字符串解析成一个集合;6、Iterator:这是一个迭代器,用于将集合迭代输出;7、merge:用于多个集合拼接陈一个新的集合。

但与appernd的拼接方式有所不同。

8、sort:用于对集合进行排序;9、Subset:截取集合的部分元素,形成新的子集;If/elseif/else这三个标签都是用于进行分支控制的,他们都是用于根据一个Boolean表达式的值,来确定是否计算、输出标签体的内容。

例:<s:set name="age"value="21"/><s:if test="#age==23">23</s:if><s:elseif test="#age==21">21</s:elseif><s:else>都不等</s:else>iterator标签:用于对集合进行迭代,这里集合包含List、Set和数组,也可对Map类型的对象进行迭代输出。

Value、id、Status三个属性都是可选属性,如果没有指定value属性,则使用ValueStack栈顶的集合。

例:<s:iterator var="u"value="users"status="sts"><s:property value="#sts"/><s:property value="#u"/><br/></s:iterator>如果为<s:iterator/>标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例的方法包含如下几个:Int getCount():返回当前迭代了几个元素;Int getIndex():返回当前元素的索引;Boolean isEven():当前元素的索引是否是偶数;Boolean isFirst():当前元素是否是第一个元素;Boolean isLast():当前元素是否是最后一个元素;Boolean isOdd():当前元素的索引是否是奇数;append标签:用于将多个集合拼接起来,组成一个新的集合,通过阵中的拼接,从而允许通过一个<s:iterator…./>标签就完成对多个集合的迭代。

merge标签的用法看起来很像append标签,也是用于将多个集合拼接成一个集合但是采用的拼接方式与append不同,append是以集合位顺序的拼接,merge是以元素位顺序拼接;generator标签:指定字符串按指定分隔符分隔成多个子串,临时生成多个子串可以使用iterator标签来迭代输出。

可以理解我generator将一个字符串转化成一个集合,在该标签的标签体内,整个临时生成的集合将位于Valuestack的顶端,但一旦该标签结束,该集合将被移除Valuestack。

属性有count:指定生成集合中元素的总数,separator:指定用于解析字符串的分隔符;val:指定被解析的字符串;converter:制定一个转化器,该转化器负责将集合中的每个字符串转化成对象;id:可选属性,制定了该属性,则将生成的集合放在pageContext 属性中;Subset标签:用于取得集合的子集,该标签的底层通过org.apache.Struts2.util.Subset.IteratorFilter类提供实现。

相关文档
最新文档