Struts2的OGNL表达式
OGNL 教程
使用表达式语言的一个目的就是避免在JSP页面中出现过多的<%%>的语句,使页面与后台代码分离。
表达式语言主要有以下几大好处:1.避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;2.支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;3.简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts 2中的表达式语言Struts 2支持以下几种表达式语言:1.OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;2.JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;3.Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;4.Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是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的用法OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。
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_过滤投影
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。
常用的ONGL表达式
常用ONGL表达式1. 基本对象树的访问对象树的访问就是通过使用点号将对象的引用串联起来进行。
例如:name,,2. 对容器变量的访问对容器变量的访问,通过#符号加上表达式进行。
例如:#name,#,#3. 使用操作符号OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用+, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用mod, in, not in等。
4. 容器、数组、对象OGNL支持对数组和ArrayList等容器的顺序访问:例如:ers[0]同时,OGNL支持对Map的按键值查找:例如:#session['mySessionPropKey']不仅如此,OGNL还支持容器的构造的表达式:例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map你也可以通过任意类对象的构造函数进行对象新建:例如:new .URL("http://localhost/")5. 对静态方法或变量的访问要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources 6. 方法调用直接通过类似Java的方法调用方式进行,你甚至可以传递参数:例如:user.getName(),ers.size(),group.containsUser(#requestUser)7. 投影和选择OGNL支持类似数据库中的投影(projection)和选择(selection)。
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标签中使用,如果有多个标签,需要重新定义。
01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
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 三目表达式判断字符串参数拼接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是指一种计算机安全漏洞,原理是利用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是一种基于Java的开源Web应用框架,它可以帮助开发者快速开发和部署复杂的Web应用程序。
然而,由于Struts2存在一些严重的安全缺陷,攻击者可以利用这些漏洞实施各种攻击,包括远程执行代码、SQL注入和命令注入等。
其中,Struts2远程执行代码漏洞是最为臭名昭著的漏洞之一,该漏洞存在于struts2框架的核心代码里,并且可以通过网络访问执行任意代码,从而导致服务器被完全控制。
攻击者通常通过构造恶意的请求来利用这个漏洞,例如在HTTP请求的头部或参数中插入特殊的代码片段,从而触发struts2的漏洞。
攻击者可以利用这个漏洞执行任意代码,包括删除文件、修改数据、窃取数据等操作。
其原因是,Struts2应用程序在接收到HTTP请求时,会将请求参数转换成Java 对象,并使用一种名为OGNL(Object-Graph Navigation Language)的表达式语言来解析这些对象。
攻击者可以在HTTP请求中注入恶意的OGNL表达式,使其在服务器上执行任意代码。
此外,Struts2还存在一些其他的安全漏洞,包括文件读取漏洞、XSS漏洞和跨站请求伪造(CSRF)漏洞等。
这些漏洞可以通过错误的配置、不安全的代码实现和其他不当的安全实践而导致。
因此,为保障应用程序的安全稳定运行,使用
Struts2开发Web应用程序的开发者需要注意代码的安全性和其他防御性措施的实现。
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表达式来实现数据的绑定和动态结果的定位。
struts2 漏洞原理
struts2 漏洞原理Struts2 是一种开放源代码的 Java Web 应用框架,被广泛应用于构建 Web 应用程序。
然而,Struts2 框架的一个漏洞却给许多应用程序带来了安全隐患。
本文将解释Struts2 漏洞的原理,并提供对于修复漏洞的一些方法。
Struts2 框架漏洞的原理Struts2 框架漏洞源于框架自身的设计缺陷。
设计缺陷使得攻击者可以利用恶意的输入来欺骗 Struts2 框架,从而在应用程序中执行任意的代码。
这种攻击就被称为“远程代码执行攻击”( Remote Code ExecutionAttack )。
Struts2 框架的漏洞主要是由于以下两点原因所导致的:· Struts2 使用了 OGNL (Object-Graph Navigation Language) 来解析 EL (Expression Language) 表达式,但没有正确地对表达式进行过滤,这使得恶意行为成为可能。
· Struts2 框架中的相当一部分功能是通过拦截器来实现的。
攻击者可以利用 Struts2 框架中的拦截器漏洞,绕过应用程序的权限控制来访问关键数据或者执行任意代码。
这两点都是 Struts2 框架漏洞的主因。
攻击者可以利用这两个漏洞来构建恶意的请求,并欺骗 Struts2 框架来执行恶意代码。
导致 Struts2 漏洞的例子为了更好地理解 Struts2 漏洞,可以通过一些例子来说明。
以下是一些可能导致 Struts2 框架漏洞的例子:· 未正确过滤用户输入。
比如在 Struts2 编译以数据表格为基础的应用程序时,如果没有过滤 script 标记,那么攻击者就可以通过执行JavaScript来远程控制代码,这就是远程代码执行攻击。
· XML SSI 漏洞。
攻击者可以通过将恶意代码嵌入到XML 消息中来利用该漏洞。
此漏洞允许攻击者利用Struts2 使用 XML 包含的注入布局中的初始资源解析器来绕过安全检查并完成任意文件读取/写入操作。
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中的实体对象,属性名指的是实体对象中的属性。
OGNL表达式基本语法与用法详解
OGNL表达式基本语法与⽤法详解⼀.OGNL中的#、%和$符号#、%和$符号在OGNL表达式中经常出现,⽽这三种符号也是开发者不容易掌握和理解的部分。
在这⾥我们简单介绍它们的相应⽤途。
1.#符号的三种⽤法1)访问⾮根对象属性,例如⽰例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他⾮根对象时,需要加#前缀。
实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
2)⽤于过滤和投影(projecting)集合,如⽰例中的persons.{?#this.age>20}。
3)⽤来构造Map,例如⽰例中的#{'foo1':'bar1', 'foo2':'bar2'}。
2.%符号%符号的⽤途是在标志的属性为字符串类型时,计算OGNL表达式的值。
如下⾯的代码所⽰:<h3>构造Map</h3><s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /><p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p><p>不使⽤%:<s:url value="#foobar['foo1']" /></p><p>使⽤%:<s:url value="%{#foobar['foo1']}" /></p>运⾏界⾯如下所⽰。
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笔记归纳
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代码量非常多。
struts2注解方式的验证
struts2注解⽅式的验证struts2的验证分为分编程式验证、声明式验证、注解式验证。
因现在的⼈越来越懒,都追求零配置,所以本⽂介绍下注解式验证。
⼀.hello world参考javaeye的这篇⽂章,按着做⼀次,起码有个初步印象Validation使⽤名字叫做validator的Intercepter,在默认情况下,struts2已经定义了这个Intercepter,我们在不加声明的情况下就可以使⽤Validation了如果是使⽤默认的拦截器,就已经开启了验证框架的了,直接⽤。
开启验证的⽅式是(官⽹):打开验证默认拦截器堆栈“defaultStack”已经打开验证。
在创建⾃⼰的拦截器堆栈⼀定要包括两对validation和workflow拦截器。
来⾃struts-default.xml:<interceptor-stack name="defaultStack">...<interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack>从版本2.0.4开始,Struts为XWork的com.opensymphony.xwork2.validator.ValidationInterceptor拦截器提供了扩展。
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 页面遍历显示集合<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中的值,需要使用这样的形式。
ognl表达式的优点
OGNL表达式的优点一、什么是OGNL表达式OGNL(Object Graph Navigation Language)是一种功能强大的表达式语言,用于在Java应用程序中进行对象图的导航和操作。
它被广泛应用于Struts2、Spring等框架中,可以方便地操作Java对象的属性、方法和集合。
二、OGNL表达式的基本语法OGNL表达式由多个组成部分构成,包括对象、属性、方法等。
它的基本语法如下:1.访问对象的属性:通过使用点(.)操作符可以访问对象的属性,例如表示访问user对象的name属性。
2.访问集合元素:通过使用方括号([])操作符加上索引或键值可以访问集合的元素,例如users[0]表示访问users集合的第一个元素。
3.调用对象的方法:通过使用圆括号(())操作符可以调用对象的方法,例如user.getName()表示调用user对象的getName方法。
4.使用逻辑运算符:可以使用逻辑运算符进行逻辑判断,例如a > b表示判断a是否大于b。
5.使用条件运算符:可以使用条件运算符进行条件判断,例如a > b ? a : b表示如果a大于b,则返回a,否则返回b。
三、OGNL表达式的优点1. 简洁易读由于OGNL表达式采用了类似于JavaScript的语法,可以使代码更加简洁易读。
相比于Java代码中繁琐的get、set方法调用和for循环遍历,OGNL表达式可以一行代码实现复杂的对象导航和操作,提高代码的可读性和可维护性。
2. 强大的数据导航能力OGNL表达式具有强大的数据导航能力,可以灵活地访问对象的属性和集合元素。
无论是普通的POJO对象还是复杂的对象图,都可以通过简单的表达式进行导航。
OGNL表达式支持链式导航,可以使用点操作符连续访问嵌套属性,例如user.address.city表示访问user对象的address属性的city属性。
3. 支持动态处理OGNL表达式支持动态处理,可以在运行时动态地创建、修改和调用对象,使得代码更加灵活。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts 2中的OGNL本人是一个EL(Expression Language,以下译为表达式语言)的支持者。
因为我对<% %>写法极为反感,忘记了在那本书上看到的一句话——“使用标志(Tag)的一个目的就是避免在JSP页面中出现过多的<%%>的语句,使页面与后台代码分离。
”表达式语言主要有以下几大好处:1.避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;2.支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;3.简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts 2中的表达式语言Struts 2支持以下几种表达式语言:1.OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;2.JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;3.Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;4.Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是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的用法OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。
大家经常遇到的问题是#、%和$这三个符号的使用。
下面我想通过例子讲述这个问题:首先新建名为Struts2_OGNL的Web工程,配置开发环境。
之前很多朋友在使用Struts 2的过程中都遇到乱码问题。
当然乱码问题由来已久,而且涉及多方面的知识,所以并非三言两语可以说明白,而且互联网上也已经有很多这方便的文章,大家可以Google一下。
不过,如果你在开发的过程,多注意一下,避免乱码问题也不难。
乱码多数是由于编码与解码所使用的方式不同造成的,所以我建议大家将编码方式都设为“utf-8”,如<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>。
另外,在配置web.xml时使用ActionContextCleanUp过滤器(Filter),如下面代码所示:<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /x ml/ns/j2ee/web-app_2_4.xsd"><display-name >Struts 2 OGNL </display-name ><filter ><filter-name >struts-cleanup </filter-name ><filter-class >org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class ></filter ><filter-mapping ><filter-name >struts-cleanup </filter-name ><url-pattern >/*</url-pattern ></filter-mapping ><filter ><filter-name >struts2</filter-name ><filter-class >org.apache.struts2.dispatcher.FilterDispatcher</filter-class ></filter ><filter-mapping ><filter-name >struts2</filter-name ><url-pattern >/*</url-pattern ></filter-mapping ><welcome-file-list ><welcome-file >index.html </welcome-file ></welcome-file-list ></web-app >清单1 WebContent/WEB-INF/web.xml“#”主要有三种用途:1. 访问OGNL 上下文和Action 上下文,#相当于ActionContext.getContext();下表有几个ActionContext 中有用的属性:parameters 参数的Map request.getParameter("id")request 包含当前HttpServletReque st 的属性(attribute)的Map#erName 相当于request.getAttribute("userName") session 包含当前#erName 相当于HttpSession的属性(attribute)的Mapsession.getAttribute("userName")application 包含当前应用的ServletContext的属性(attribute)的Map#erName相当于application.getAttribute("userName")attr 用于按request >session >application顺序访问其属性(attribute)#erName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止2.用于过滤和投影(projecting)集合,如books.{?#this.price<100};3.构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
下面让我们它们的具体写法,首先是Action类代码:packagetutorial.action;import java.util.LinkedList;import java.util.List;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import tutorial.model.Book;import com.opensymphony.xwork2.ActionSupport;public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware {private static final long serialVersionUID = 1L;private HttpServletRequest request;private Map<String, String> session;private ServletContext application;private List<Book> books;public void setServletRequest(HttpServletRequest request) {this.request = request;}@SuppressWarnings("unchecked")public void setSession(Map session) {this.session = session;}public void setServletContext(ServletContext application) {this.application = application;}public List<Book> getBooks() {return books;}@Overridepublic String execute() {request.setAttribute("userName", "Max From request");session.put("userName", "Max From session");application.setAttribute("userName", "Max From application");books = new LinkedList<Book>();books.add(new Book("978-0735619678", "Code Complete, Second Editio n", 32.99));books.add(new Book("978-0596007867", "The Art of Project Manageme nt", 35.96));books.add(new Book("978-020*******", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));books.add(new Book("978-0596527341", "Information Architecture for t he World Wide Web: Designing Large-Scale Web Sites", 25.19));books.add(new Book("978-0735605350", "Software Estimation: Demysti fying the Black Art", 25.19));return SUCCESS;}}清单2 src/tutorial/action/OgnlAction.java以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。