- <span style="font-size: large;"><span style="font-size: large;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>OGNL的使用</title>
- </head>
- <body>
- <h3>OGNL的使用</h3><hr/>
- 访问Action中的普通属性: <s:property value="loginname"/><br/>
- 访问Action中的对象属性: <s:property value="user.birthday"/><br/>
- 访问Action中的Set属性: <s:property value="courseSet.toArray()[0]"/><br/>
- 访问Action中的List属性: <s:property value="list[0]"/><br/>
- 访问Action中的Map属性的键: <s:property value="map.keys.toArray()[1]"/><br/>
- 访问Action中的Map属性的值: <s:property value="map.values.toArray()[1]"/><br/>
- 访问Action中的Map属性的指定键对应的值: <s:property value="map['z']"/><br/>
- 访问Action中的Map属性的大小: <s:property value="map.size"/><br/>
- <hr/>
- 访问ActionContext中的普通属性:<s:property value="#inte"/><br/>
- 访问ActionContext中的对象属性:<s:property value="#user2.loginname"/><br/>
- <hr/>
- 访问Action中的普通方法:<s:property value="getAppName()"/><br/>
- 访问ActionContext中的某个对象上的普通方法:<s:property value="#user2.info()"/><br/>
- <hr/>
- 访问静态属性:<s:property value="@java.lang.Math@PI"/><br/>
- 访问静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>
- 访问Math类中的静态方法:<s:property value="@@floor(44.56)"/><br/>
- <hr/>
- 调用java.util.Date的构造方法:<s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss"/><br/>
- 调用java.util.Date的构造方法创建对象,再调用它的方法:<s:property value="new java.util.Date().getTime()"/><br/>
- <hr/>
- 投影查询:获取userList中所有loginname的列表:<s:property value="userList.{loginname}"/><br/>
- 选择查询:获取userList中所有score大于60的loginname列表:<s:property value="userList.{?#this.score>60.0}.{loginname}"/><br/>
- 选择查询:获取userList中所有score大于60并且gender为true的loginname列表:<s:property value="userList.{?(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- 选择查询:获取userList中所有score大于60并且gender为true的第一个元素的loginname:<s:property value="userList.{^(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- 选择查询:获取userList中所有score大于60并且gender为true的最后一个元素的loginname:<s:property value="userList.{$(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
- <hr/>
- 访问名为xxx的请求参数对应的第一个值:<s:property value="#parameters.xxx[0]"/><br/>
- 访问通过ActionContext中放入Request中的属性:<s:property value="#request.reqAtt"/><br/>
- 访问通过ServletActionContext中放入Request中的属性:<s:property value="#request.reqAtt2"/><br/>
- 访问通过ActionContext中放入Session中的属性:<s:property value="#session.sesAtt"/><br/>
- 访问通过ServletActionContext中放入Session中的属性:<s:property value="#session.sesAtt2"/><br/>
- 访问通过ActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt"/><br/>
- 访问通过ServletActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt2"/><br/>
- 直接访问属性域中指定名称的属性对应的值:<s:property value="#attr.sesAtt2"/><br/>
- <br/><br/><hr/>
- <s:iterator value="userList" status="vs">
- <s:if test="%{#vs.odd}">
- <span style="color: red">
- <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
- </span>
- </s:if>
- <s:else>
- <span style="color: blue">
- <s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
- </span>
- </s:else>
- </s:iterator>
- <hr/><s:debug/>
- </body>
- </html></span></span>
总结:
在上边大家都好奇为什么都用struts的S标签,因为OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等
Action类与JSP页面之间的数据传递
1) 通过HttpServletRequest,HttpSession,ServletContext来传递数据。
a) Action中传数据:在Action类的请求处理方法中先获取各个作用域对象
ServletActionContext.getRequest();
ServletActionContext.getRequest().getSession();
ServletActionContext.getServletContext();
然后调用相应的setAttribute(String "键", Object 值);
b) 在JSP页面中取数据:可以使用EL表达式或代码片段来取出对应作用域中属性值。
c) 页面中的请求参数传递到Action中时,Action中直接定义对应名称的属性,并提供setter方法即可封装此数据。
2) 通过ActionContext实例来传递数据。 ActionContext针对每个正在执行Action的线程中绑定一份。
a) Action中通过ActionContext传递数据。
ActionContext提供了put(String "键", Object 值); //数据不会映射到HttpServletRequest中。
ActionContext提供的getSession().put(String "键", Object 值); //数据会自动映射到HttpSession中。
ActionContext提供的getApplication().put(String "键", Object 值); //数据会自动映射到ServletContext中。
b) 在JSP页面取数据:struts2推荐使用OGNL来取ActionContext中的数据。
1. Struts2中的OGNL的使用。
2. OGNL:对象图导航语言。通过OGNL表达式可以获取对象的属性,调用对象的方法,或构造出对象。
1) OGNL上下文中有一个根对象。这个根对象可以直接获取。不需要#。
2)支持常量:
字符串常量、字符常量、
数值常量:int、long、float、double
布尔常量:true、false
Null常量 : null
支持操作符:支持Java的所有操作符,还支持特有的操作符: ,、 {}、in、not in;
Struts2中的OGNL:
1) Struts2将ActionContext设置为OGNL上下文,并将值栈(ValueStack)作为OGNL的根对象放置到ActionContext中。
2) Struts2总是把当前Action实例放置在值栈的栈顶。所以,在OGNL中引用Action中的属性也可以省略“#”。
常用标签
1) <s:property value="OGNL"/>
2) <s:date name="OGNL" format=""/>
3) <s:if test="OGNL"></s:if><s:elseif test="OGNL"></s:elseif><s:else></s:else>
★4) <s:iterator value="OGNL" status="vs">...</s:iterator>
5) <s:debug/>
struts2中#、%和$这三个符号的使用方法【摘自max struts2教程】
一、"#"的用法
1、 访问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属性,直到找到为止
2、用于过滤和投影(projecting)集合,如books.{?#this.price<100};
3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
二、"%"的用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
三、"$"的用法
1、用于在国际化资源文件中,引用OGNL表达式
2、在Struts 2配置文件中,引用OGNL表达式
例如:
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action? albumId=${albumId}</result>
</action>
相关推荐
为了使EL表达式能够访问`ValueStack`中的数据,Struts2在`HttpServletRequest`的基础上封装了一个类——`StrutsRequestWrapper`。这个类重写了`getAttribute_r`方法,使其能够在没有找到相应属性时,尝试从`...
**表达式语言(EL)与OGNL概述** 表达式语言(EL)是用于在Java应用程序中简洁地访问和操作对象属性的一种方式。它允许开发者通过简单的语法来读取和设置对象的属性,调用方法,以及执行其他面向对象的操作。在Java EE...
在Struts2中,OGNL还可以与ActionContext结合,使得我们能够访问Servlet上下文中的参数、session、request等信息。例如,`#parameters['username']`可以获取请求参数中的用户名,`#session['user']`可以访问session...
在JSP页面中,可以直接通过EL表达式访问ValueStack中的对象属性,如`${foo}`表示获取栈中某个对象的"foo"属性。如果需要访问其他上下文中的对象,如ServletContext、HttpSession、HttpServletRequest的属性,就需要...
EL表达式通常以${}的形式出现,如${expression}。 Struts2的值栈(Value Stack)是一个重要的概念,它用于存储Action中的数据,并且在JSP页面中通过OGNL表达式访问。值栈采用栈的形式组织数据,因此可以按照先进后...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
EL表达式通常在JSP标签中使用,如`${user.name}`,用于显示`user`对象的`name`属性。EL不支持方法调用,但可以与JSTL(JavaServer Pages Standard Tag Library)结合使用,扩展其功能。 3. **主要区别** - **功能...
5. **EL表达式与OGNL表达式的比较**:尽管学习了OGNL表达式,但在实际项目中,EL表达式仍然是非常有用的。特别是对于简单的数据获取场景,EL表达式因其简洁性和安全性而被广泛采用。 #### 二、OGNL上下文-...
- **$**:在JSP页面中表示EL表达式的开头,但在Struts2中通常不直接使用,而是通过#符号配合使用。 #### 五、示例代码详解 为了更好地理解OGNL表达式的使用,我们来看一个具体的示例。假设我们在开发一个简单的Web...
在这个文档中,我们将深入探讨EL表达式,并通过与OGNL、JSTL和STRUTS2标签的对比,进一步理解其用法。 首先,让我们关注EL表达式的语法。EL表达式通常以`#{}`包围,它允许开发者以一种声明式的方式访问和操作Java...
4. EL(表达式语言)增强:OGNL作为Struts2的默认EL,提供更丰富的功能,比如可以方便地访问集合、索引、Map等数据结构。 三、OGNL表达式语法 OGNL表达式的语法十分灵活,主要包括以下几个部分: - 属性访问:如`...
EL表达式在JSP 2.0及更高版本中被广泛使用,与JSTL(JavaServer Pages Standard Tag Library)一起提供了更简洁的页面表示方式。 **OGNL(Object-Graph Navigation Language)** 在EL表达式中,实际上底层是使用了...
2. **EL表达式与OGNL的混合**:在JSP中,EL表达式和OGNL可以混合使用,但EL表达式仅限于页面作用域,而OGNL可以访问更广泛的上下文。 3. **动态方法调用**:OGNL允许动态调用对象的方法,这对于处理不确定方法名的...
在Struts2框架中,OGNL作为默认的数据绑定和表达式语言,用于在Action类的属性与视图层(如JSP)之间传递数据。 2. OGNL的基本语法: OGNL支持多种操作,包括访问对象属性、调用方法、数组和集合操作、算术运算等...
Struts2是一个流行的Java web开发框架,而OGNL(Object-Graph Navigation Language)是它用于表达数据绑定和表达式语言的核心组件。在Struts2中,OGNL被广泛用于访问和操作应用程序中的对象属性,包括在请求、参数、...
OGNL是Struts2的核心特性之一,Struts2使用OGNL来替代原先的EL表达式语言。Struts2将OGNL作为一个库集成到项目中,这使得Struts2在处理表单字段(如text field、hidden)方面更加灵活。与Struts1.x中的form bean相比...
相对EL表达式,它提供了平时我们需要的一些功能,如: ? 支持对象的方法调用 ,如 xxx.sayHello(); ? 支持类静态方法调用和值的访问,表达式的格式为@[类全名]@[方法名|值名],例如:@java.lang.String@format(...
对比JSP2.0内置的EL表达式,OGNL的这些特性使得它成为更加强大的选择,尤其是在复杂应用中。 OGNL的计算是基于OGNL上下文进行的,这个上下文实际上是一个Map对象,由ognl.OgnlContext类实现。Map中可以包含多个...
Struts2的一个关键特性就是它可以对Action携带的数据进行读写访问,例如在前面我们在表单中使用user.username指定数据传递给Action的user对象的username属性,在元素中使用user.username来获取用户的名字,这是通过...