OGNL是从ActionContext中获取数据的。
ActionContext的结构:
ValueStack:
List:动作类放在此处。取存放在ValueStack中的root的对象的属性,直接写即可
访问以下内容中的对象要使用#+(范围)session, 还有 列出的所有的#加上key属性取出值
application:ServletContext中的那个Map
session:HttpSession中的那个Map
request:ServletRequest中的那个Map
parameters:请求参数的那个Map。(如同EL表达式的paramValues内置对象)
attr:相当于PageContext的findAttribute方法。${username}
小技巧:在页面中使用<s:debug/>查看上下文中的对象
<s:property value="[0].userName"/> 省略[0].就是取第一个Action实例动作的userName
<s:property value="#session.user"/>
EL表达式会先在四大域顺序找值,如果找不到去ValueStack中找值,struts2实现了这一内容
${requestScope.userName} el表达式在request中搜索,找不到去value Stack中寻找搜索
ActionContext的结构:
ValueStack:
List:动作类放在此处。取存放在ValueStack中的root的对象的属性,直接写即可
访问以下内容中的对象要使用#+(范围)session, 还有 列出的所有的#加上key属性取出值
application:ServletContext中的那个Map
session:HttpSession中的那个Map
request:ServletRequest中的那个Map
parameters:请求参数的那个Map。(如同EL表达式的paramValues内置对象)
attr:相当于PageContext的findAttribute方法。${username}
小技巧:在页面中使用<s:debug/>查看上下文中的对象
<s:property value="[0].userName"/> 省略[0].就是取第一个Action实例动作的userName
<s:property value="#session.user"/>
EL表达式会先在四大域顺序找值,如果找不到去ValueStack中找值,struts2实现了这一内容
${requestScope.userName} el表达式在request中搜索,找不到去value Stack中寻找搜索
<c:property value="#request.userName" /> request中搜索,找不到去value Stack中寻找搜索
ognl表达式的投影功能
?:获得所有符合逻辑的元素。
^获得符合逻辑的第一个元素
$获得符合逻辑的最后一个元素
例如<s:iterator value="books.{?#this.price>35}">
<s:property value="title"/><s:property value="price"/><br/>
</s:iterator>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>利用OGNL表达式创建集合</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:set var="list1" value='{"a","b","c"}'></s:set><br/><!-- 默认放到了ActionContext上下文件中,scope="action" -->
<s:set var="list2" value="{'aa','bb','cc'}" scope="session"/>
<s:iterator value="#session.list2" var="l">
<s:property value="#l"/><br/>
</s:iterator>
<hr/>
<s:property value="#list1[1]"/>
<hr/>
<s:set var="map1" value="#{'a':'valuea','b':'valueb'}" scope="session"/>
<!-- 打印valueb -->
<s:iterator value="#session.map1" var="me">
<s:property value="#me.key"/>=<s:property value="#me.value"/><br/>
</s:iterator><!-- 作用如同forEach -->
<hr/>
<c:forEach items="${sessionScope.map1}" var="me">
${me.key }=${me.value }<br/>
</c:forEach>
<hr/>
<s:if test="'aaa' not in {'aa','bb'}">
不在
</s:if>
<s:debug></s:debug>
</body>
</html>