- 浏览: 7189169 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
转自:
http://www.blogjava.net/max/category/16130.html
Struts 2中的表达式语言
Struts 2支持以下几种表达式语言:
- OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
- JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
- Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
- Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
- 支持对象方法调用,如xxx.doSomeSpecial() ;
- 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar') 或@tutorial.MyConstant@APP_NAME ;
- 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice() ,这个表达式会返回80;
- 访问OGNL上下文(OGNL context)和ActionContext;
- 操作集合对象。
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),如下面代码所示:
< web-app id ="WebApp_9" version ="2.4"
xmlns ="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/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
“#”主要有三种用途:
- 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称 作用 例子 parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id") request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName") session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName") application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName") attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 - 用于过滤和投影(projecting)集合,如books.{?#this.price<100} ;
- 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'} 。
下面让我们它们的具体写法,首先是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;
}
@Override
public 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 Edition " , 32.99 ));
books.add( new Book( " 978-0596007867 " , " The Art of Project Management " , 35.96 ));
books.add( new Book( " 978-0201633610 " , " Design Patterns: Elements of Reusable Object-Oriented Software " , 43.19 ));
books.add( new Book( " 978-0596527341 " , " Information Architecture for the World Wide Web: Designing Large-Scale Web Sites " , 25.19 ));
books.add( new Book( " 978-0735605350 " , " Software Estimation: Demystifying the Black Art " , 25.19 ));
return SUCCESS;
}
}
清单2 src/tutorial/action/OgnlAction.java
以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将 其取回。我还创建了Book对象的列表用于演示“用于过滤和投影(projecting)集合”的功能,至于Book的代码大家可以在我前一文章《在Struts 2中实现CRUD 》看到。
下面是Ognl.jsp的代码,内容如下:
<% @ taglib prefix = " s " uri = " /struts-tags " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > Struts OGNL Demo </ title >
</ head >
< body >
< h3 > 访问OGNL上下文和Action上下文 </ h3 >
< p > parameters: < s:property value ="#parameters.userName" /></ p >
< p > request.userName: < s:property value ="#request.userName" /></ p >
< p > session.userName: < s:property value ="#session.userName" /></ p >
< p > application.userName: < s:property value ="#application.userName" /></ p >
< p > attr.userName: < s:property value ="#attr.userName" /></ p >
< hr />
< h3 > 用于过滤和投影(projecting)集合 </ h3 >
< p > Books more than $35 </ p >
< ul >
< s:iterator value ="books.{?#this.price > 35}" >
< li >< s:property value ="title" /> - $ < s:property value ="price" /></ li >
</ s:iterator >
</ ul >
< p > The price of "Code Complete, Second Edition" is: < s:property value ="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]" /></ p >
< hr />
< 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 >
</ body >
</ html >
清单3 WebContent/Ognl.jsp
以上代码值得注意的是“<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/> ”,因为“books.{?#this.title=='Code Complete, Second Edition'}.{price} ”返回的值是集合类型,所以要用“[索引]”来访问其值。
最后是Struts 2的配置文件struts.xml,内容如下:
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< constant name ="struts.devMode" value ="true" />
< package name ="Struts2_OGNL_DEMO" extends ="struts-default" >
< action name ="Ognl" class ="tutorial.action.OgnlAction" >
< result > /Ognl.jsp </ result >
</ action >
</ package >
</ struts >
清单4 src/struts.xml
发布运行应用程序,结果如下所示:
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
< h3 > %的用途 </ h3 >
< p >< s:url value ="#foobar['foo1']" /></ p >
< p >< s:url value ="%{#foobar['foo1']}" /></ p >
清单6 演示%用途的代码片段
刷新页面,结果如下所示:
清单7 示例运行结果2
“$”有两个主要的用途
- 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序 》
- 在Struts 2配置文件中,引用OGNL表达式,如
< action name ="AddPhoto" class ="addPhoto" >清单8 演示$用途的代码片段
< interceptor-ref name ="fileUploadStack" />
< result type ="redirect" > ListPhotos.action?albumId=${albumId} </ result >
</ action >
总结
OGNL是一种功能很大的表达式语言,熟悉它可以使我们的开发变得更快捷。
发表评论
-
Struts2 通过"流"下载文件时显示中文文件名
2010-04-10 22:47 5836Struts2 通过"流"下载文件时对结果 ... -
JSONplugin 下载
2009-03-29 10:44 5527地址是: http://code.google.com/p/j ... -
如何在log4j中设置属性把struts2的debug信息去掉
2009-03-28 19:23 12097struts2 在发开时,控制台如输出大量信息,太烦人了 ... -
由Spring管理的Struts2的Action的全程安全问题
2009-03-28 18:57 17300Struts2的Action的线程安全 ... -
Struts2通用的Action配置
2009-03-28 14:03 3611struts.xml 配置一个<action/> ... -
常用的Struts 2.0的标志(Tag)介绍
2009-03-28 11:26 1840转自:http://www.blogjava.net/max/ ... -
struts2开发注意事项
2009-03-28 10:30 2583我有一个index.jsp , 是全部的首页, 内容如下 : ... -
12 struts2拦截器
2009-03-19 11:47 2804自己写拦截器, 要认识下面接口 与 类 com.op ... -
11 动态代理的例子
2009-03-18 18:15 1773结构如下 : package com.client ... -
10 一个通用的跳入jsp视图的方法
2009-03-17 12:15 2141后注: 以有新的解决方法,请见 Struts2通用的Actio ... -
9 动态调用Action与Action中方法(二)
2009-03-17 12:02 2318其实有 8 动态调用Action与Action中方法(一) ... -
8 动态调用Action与Action中方法(一)
2009-03-17 11:03 3992Struts1 提供了DispatchAction 实现一个A ... -
7 Struts2输入校验(二)----验证框架
2009-03-17 11:02 3379一 文件名约定: 1) 验证XML的文件名: Acti ... -
6 addActionError与addFieldError
2009-03-17 09:21 6688前面的第5讲中用到了addFieldError, 所以这里就 ... -
5 Struts2输入校验(一)----validate方法-validateXxx方法
2009-03-08 16:32 10074这是一种编码校验的方 ... -
4 Struts2类型转换(二)----集合类型
2009-03-08 14:32 2349情况一 : HTML复选框 与 List<Stri ... -
3 Struts2类型转换(一)----常规类型,自定义类型,错误处理
2009-03-08 11:30 5949Struts2的类型转换是基于OGNL表达式的.有良好的扩展性 ... -
2 Struts2的优点与Struts1的区别:
2009-02-28 08:52 4855单实例与多实例有状 ... -
1 struts2标签的定义文件 struts-tags.tld
2008-08-10 15:59 10691在工程中使用struts2标签 一、 struts ...
相关推荐
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于数据绑定和表示层的数据交换。这篇博客文章可能详细探讨了如何在Struts2中使用OGNL来传递和操作数据。 OGNL是Struts2的核心...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL表达式的理解和用法。 OGNL的全称是对象图导航语言,它的主要功能是在对象模型...
在这个实例中,我们将深入探讨如何在Struts2中使用OGNL来获取Servlet对象的值、筛选集合中的对象,以及理解OGNL表达式的生命周期。 首先,让我们了解OGNL的基本语法。OGNL允许我们通过点号(.)和方括号([])来...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl的封装--PropertyAccessor"这个主题主要涉及Struts2框架如何处理OGNL表达式,特别是如何...
本篇笔记主要介绍了在Struts2中使用OGNL的一些基本用法。 首先,OGNL可以用来获取不同范围内的属性值。在Java Web开发中,有四种常见的作用域:Request、Session、Application和Page。在示例代码中,`<s:property>`...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇文档将深入探讨OGNL在Struts2中的使用,以及它如何增强框架的功能。 ### OGNL简介 OGNL是一种轻量...
### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...
这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的组件,它允许在视图层和控制层之间传递和操作数据。 首先,我们来看`.classpath`、`.mymetadata`、`.project...
OGNL(Object-Graph Navigation Language)是Struts2框架中的一个重要组件,用于在Web应用中访问和操作Java对象的属性,调用其方法,以及执行类型转换等操作。 OGNL是对象图导航语言的缩写,它是一种功能强大的...
这是自己用的ognl表达式学习的ppt,不要下载!
在Struts2中,OGNL(Object-Graph Navigation Language)是其默认表达式语言,用于数据绑定、属性访问以及控制流程。本篇文章将详细介绍Struts2中OGNL的使用,包括基本语法、表达式操作以及在实际开发中的应用。 ##...
在Struts2中,OGNL被广泛用于访问和操作应用程序中的对象属性,包括在请求、参数、session、application上下文中的数据。 1. **访问数据上下文**: - 在Struts2中,使用`#`符号可以访问特定的数据上下文,如`...
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,...
OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许开发者访问和操作 ValueStack 中...
在Struts2中,OGNL用于处理动作类的属性到JSP页面的传递,以及用户输入到动作类的绑定。 首先,让我们了解OGNL的基本语法。OGNL表达式通常包含两个部分:对象引用和属性访问。例如,`user.name`表示获取名为`user`...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL在Struts2中的应用,并通过案例"TextOgnl"来展示其工作原理。 一、OGNL的基本...
在Struts2中,OGNL被广泛用于访问Action中的属性,以及在视图层(如JSP)中绑定和操作数据。 首先,OGNL使得访问对象属性变得非常直观。它支持点符号(.)和方括号([''])两种方式来访问属性。例如,如果在Action...