学习OGNL在Struts2中工作原理
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表达式支持动态处理,可以在运行时动态地创建、修改和调用对象,使得代码更加灵活。
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——常见问题与处理

学习struts2.2.1遭遇滑铁卢~~~~~好多异常~~~~~好多bug~~~~好多问题~~~~~~好多困难~~~好多肥羊~~~一、Filter mapping specifies an unknown filter name ----filter标签在web.xml 里的顺序<filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter>这样写启动服务器时报错 Filter mapping specifies an unknown filter nameadminOperateLogFilter将这两块换个顺序就没问题了,web.xml信息的加载是有顺序的,filter在mapping之前必须要让服务器找到其定义。
<filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter><filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>二、ng.IllegalArgumentException: Filter mapping specifies an unknown filter nameStruts2答:“Struts2”?大写的?are you sure?我猜你一定是看了某struts2.0的权威指南(那是一个chm文件电子书,而且你看的可能是翻译成中文的),我不知道英文版的有没有写错,但是我检查了很久后才发现中文版存在这个大小写错误。
struts2

—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境
搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1》找到开发Struts2应用需要使用到的jar文件. 2》编写Struts2的配置文件 3》在web.xml中加入Struts2 MVC框架启动配置
北京传智播客教育
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境--Struts2在web中的启动配置
在struts1.x中, struts框架是通过Servlet启动的.在struts2中, struts框架是通过Filter启动的.他在web.xml中的配置如下:
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
讲师: 讲师:黎活明
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架. 不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但 Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要 推出struts2.主要是因为struts2有以下优点:
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
第一个Struts2应用--HelloWorld
在默认的配置文件struts.xml 中加入如下配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>
Struts2的介绍及总结

Struts2在WebWork基础上发展起来的,可扩展的JAVA EE web框架。
框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Action类:Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。
Action接口不是必须的,任何有execute标识的POJO 对象都可以用作Struts2的Action对象。
线程模式:Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖:Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。
如果需要,Struts2 Action仍然可以访问初始的request和response。
但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测试性:Struts2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
Action属性能够通过web页面上的taglibs访问。
表达式语言:Struts 2 使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。
ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
Struts2不仅支持JSTL,Struts2 还可使用OGNL进行类型转换。
提供基本和常用对象的转换器。
校验:Struts2支持通过validate方法和XWork校验框架来进行校验。
XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。
Structs2框架技术简单介绍

优点
• 3. 强大的拦截器Struts2的拦截器是一个Action级别 的AOP,Struts2中的许多特性都是通过拦截器来实 现的,例如异常处理,文件上传,验证等。拦截器 是可配置与重用的,可以将一些通用的功能如:登 录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web 项目中,就是使用Struts2的拦截器来完成了系统中 的权限验证功能。
第一步 创建index.jsp
<html><head> <title>第一个Struts简单示例</title> </head> <body> <form action="user/HelloAction" method="post"> 请输入你的大名:<input type="text" name="username" /> <br> <input type="submit" value="提交" /> </form></body></html>
Structs2工作流程
• 此外,如果struts.xml文件中还定义了被请 Action的一些拦截器,那么该Action实例被 调用前后,这些拦截器也会被先后执行。
Structs2工作流程
Structs2工作流程
• 第五步 Action对请求处理完毕以后将返回 一个逻辑视图,该逻辑视图将在struts.xml 文件相应的<result>元素中寻找相应的物理 视图,并返回给客户端 • <result name="success">/WEBINF/page/hello.jsp</result>
7.7 OGNL表达式的综合应用
3.2.5 集合类型转换器
• 上面介绍的是通过字符串数组来接受参数值,同 样也可以通过集合类型来接受参数值。Struts 2 提供的集合类型转换器,会将参数值自动赋值到 集合类型属性中。
3.3 OGNL表达式语言
• Struts 2已经实现了一些常用的类型转换器,但 是这些类型转换器毕竟还是有限的。如果是开发 者自己定义的数据类型,就必须自定义类型转换 器来进行转换。在Struts 2中自定义类型转化器 是非常方便和简单。因为Struts 2的类型转换是 基于OGNL来实现的,所以在介绍自定义类型转换 器之前先简单介绍OGNL。
•
3.3.2 在Eclipse中查看OGNL类文件
• 因为导入的库文件都是已经编译好的class文件, 而不是源文件。必须把这些class文件和下载好的 源代码进行关联,这样就能在Eclipse中查看这些 库文件中的类了。 • 具体步骤如下。
3.4 自定义类型转换器
• Struts 2已经实现了一些常用的类型转换器,但 是这毕竟这些类型转换器毕竟还是有限的。如果 是开发者自己定义的数据类型,就必须自定义类 型转换器来进行转换。
3.4.2 实现自定义类型转换器
• 前面提到过,Struts 2的类型转换器是基于OGNL 实现的。首先在导入的OGNL类库中找到 TypeConverter类,代码如下所示。 • package ognl; • import ng.reflect.Member; • import java.util.Map; • public interface TypeConverter • { • public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType); • }
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。
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 简介、三目表达式概述和字符串参数拼接方法。
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 方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习OGNL在Struts2中工作原理
Struts2内置了OGNL这是大家都知道的了,其实这种说话不严格,应该OGNL本身是一种
很强大的表达式语言,XWork整合了OGNL的一部分并且将这部分内容做了相应的扩展,
而Struts2又建立在XWork这个项目的基础之上,所以Struts2也就内置了OGNL这部分强
大的功能。
为了详细些一步一步做记录吧。
先说OGNL,OGNL内部自己会维护一个OGNL上下文(OgnlContext)是一个实现
了Map接口的对象,OGNL会将对象放在这个上下文中统一管理的,并且会有一个对象被
指定为根对象(root)。假设有User和Customer这么两个类,分别有user和customer两个实
例,这两个对象都有一个name属性,并且将user对象配置为唯一的根对象,那么就会有下
面的情况:
#user.name 返回user.getName();
#customer.name 返回customer.getName();
#name 返回user.getName(); 因为user对象为根对象
OGNL访问对象的基本机制就是这样的。
在XWork中,ValueStack对象是上下文中的根对象,XWork中不仅可以根据表达
式从ValueStack对象中获取对象,还可以获取对象的属性,XWork自己有一个强大的属性
访问器,它可以自动搜索栈内的所有实体(从上到下),直到找到你所访问的对象和属性。
假设ValueStack栈中有两个上面所说的user和customer两个对象,并且user是栈顶元素,
customer在下面,就会有下面的情况:
name 返回user.getName(); 因为user在栈顶,搜索器找到
一个匹配的属性就不会继续找下去
如果希望访问靠后对象的属性XWork提供了索引访问ValueStack的方法:
[0].name 返回user.getName()
[1].name 返回customer.getName();
了解上面这些之后Struts2中的OGNL就很好理解了,Struts2框架也没有对XWork
中的OGNL做太大的修改,只是拿过来做了一下整合工作,Struts2将ActionContext设置
为OGNL中的上下文,ValueStack依然是OGNL上下文中的根元素,大家知道
application,session和request这几个对象也是在ActionContext中的,它们是和根对象
ValueStack共存的,与根对象是无关的,就像刚开始说OGNL那个例子实在OGNL上下文
中的两个平行对象,只不过ValueStack这个对象是这个OGNL上下文中的根对象(root)。
如果要访问上下文中根对象中的对象和属性是不用加任何标记符号的,但是在访问
application,session和request这几个范围内的对象和属性就要用"#"符号来告诉ognl不要在
根对象中去搜索了,而是去我们指定的上下文中去找。用官方一个图来形象描述ValueStack
和其他几个对象的关系:
|--request
|
|--application
|
context map---|--OgnlValueStack(root)
|
|--session
|
|--attr
|
|--parameters
基本原理就是这样了,举例验证理论。
1. ActionContext是OGNL的上下文,ValueStack对象是上下文中的根对象:
随便找一个Action给JSP页面传东西过去的例子,然后在Action的execute()方法中加
入以下代码:
ActionContext.getContext().getValueStack().set("test", "love java");
在目标JSP页面空白处加上如下代码:
再次跳转到该页面就可以看到love java出现在页面上了
2. 其他范围和ValueStack平行关系:
还找刚才那个例子,在Action中加入
request.setAttribute("test1", "love java1");
在JSP页面加入代码:
这次跳转就可以看到love java1出现了
3. OGNL上下文的访问
Action中加入代码:
ActionContext.getContext().put("test2", "love java2");
JSP页面中加入:
看到love java2之后应该大彻大悟了吧,这里值得说一下就是在
ActionContext.getContext().put("test2", "love java2")之后上下文结构:
|--request
|
|--application
|
context map---|--OgnlValueStack(root)
|
|--session
|
|--attr
|
|--parameters
|
|
|--test2
这样更清楚了吧!
总结:
1. 在JSP页面中"%{"就表示OGNL表达式开始,"}"表示OGNL表达式结束
2. 如果访问根对象中的对象和属性不用任何符号标志,如:%{Object.field}
3. 访问特定Scope中的对象和属性用"#"来通知OGNL查询器,
如:%{#request.object},当然OGNL很强大,在一个链中,前一个对象做为解释下一个对
象的上下文。你可以任意扩展这个链,在链中也可以访问对象中的方法。