1.关于值栈
1)helloworld时,${productName}读取productName时,实际上属性并不在request等域中,而是从值栈中读取。
2)ValueStack: 可以从ActionContext中获取值栈对象
其分为两个逻辑部分
>Map栈:实际上是OgnlContext类型,是一个Map,ActionContext的引用,里面保存各种Map,如sessionMap,requestMap等。
>对象栈:CompoundRoot类型,是一个使用ArrayList定义的栈,存储各种当前Action实例相关
2.Struts2使用s:property标签 和ognl表达式来读取值栈中的属性值。
1)值栈中的属性值:
对象栈>某一对象的属性值;
Map栈>request,session,applicaion,属性值或请求参数值(OGNL表达式加上前缀#才会搜索Map栈,不然会搜索对象栈)
使用ognl时,导入struts2标签:
<span style="white-space:pre"> </span><%@ taglib prefix="s" uri="/struts-tags" %>
使用debug标签可以方便开发者查看值栈中的情况
<s:debug></s:debug>
页面实例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'details.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:debug></s:debug>
ProductName :<s:property value="[1].productName"/> <br>
ProductDesc :<s:property value="[1].productDesc"/> <br>
ProductPrice :${productPrice} <br>
productPrice:<s:property value="[0].productPrice"/> <br>
<br><br>
ProductName1: ${sessionScope.product.productName }
<!-- 读取Map栈里的数据,存在request等对象里的值 -->
<s:property value="#session.product.productName"/>
<br><br>
ProductName2: ${requestScope.test.productName }
<br><b>
<!-- 使用OGNL调用public类静态方法 -->
<s:property value="@java.lang.Math@PI"/>
<br><b>
<s:property value="@java.lang.Math@cos(0)"/>
<!-- 调用对象栈的方法 -->
<s:property value="setProductName('hcx')"/>
<br>
<s:property value="productName"/><br>
<!-- 调用数组对象的属性 -->
<%
String [] names = new String[]{"aa","bb","cc"};
request.setAttribute("names",names);
%>
length:<s:property value="#attr.names.length"/> <!-- attr标签会 从request session application 依次搜索对应属性,找到为止 -->
<br>
names[2]:<s:property value="#attr.names[2]"/>
<br><br>
<%
Map<String,String> letters= new HashMap<String,String>();
letters.put("AA","a");
request.setAttribute("letters",letters);
%>
<!--使用ognl访问map -->
Map大小: <s:property value="#attr.letters.size"/>
<br><s:property value="#attr.letters['AA']"/>
</body>
</html>