一.读取Context Map里的对象的属性
1.若想访问ContextMap里的某个对象的属性,可以使用以下几种方式形式之一:
#object.propertyName
#object.['propertyName']
#object.["propertyName"]
示例:
- 返回session中的code属性:#session.code
- 返回request中的customer属性的name属性值:#request.customer.name
- 返回域对象(按request,session,application的顺序)的lastAccessDate属性:#attr.lastAccessDate
2.实例:
Product.java:实现SessionAware,RequestAware接口,并往request、session中赋值。
package actionbao;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
public class Product implements RequestAware,SessionAware{
private Integer productId;
private String productName;
private String productDesc;
private Double productPrice;
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public Double getProductPrice() {
return productPrice;
}
public void setProductPrice(Double productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", productDesc="
+ productDesc + ", productPrice=" + productPrice + "]";
}
public String save() {
System.out.println("save " + this);
//1.获取值栈
ValueStack valueStack = ActionContext.getContext().getValueStack();
//2.创建Test对象,并为其属性赋值
Test czy= new Test();
czy.setProductName("AAAAAA");
czy.setProductDesc("BBBBBB");
//3将新对象压入值栈中
valueStack.push(czy);
sessionMap1.put("you", this);
resquest2.put("we",czy);
return "details";
}
private Map<String,Object> sessionMap1;
@Override
public void setSession(Map<String, Object> arg0) {
this.sessionMap1=arg0;
}
private Map<String,Object> resquest2;
@Override
public void setRequest(Map<String, Object> arg0) {
this.resquest2=arg0;
}
}
Test.java
package actionbao;
public class Test {
private String productName;
private String productDesc;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
}
details.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
ProductId:${productId}<br/>
ProductName:${productName}<br/>
ProductDesc:${productDesc}<br/>
ProductPrice:${productPrice}<br/>
ProductId:<s:property value="[0].productName"/><br/>
ProductId:<s:property value="[1].productName"/><br/>
ProductId:<s:property value="productDesc"/><br/>
ProductId:<s:property value="productPrice"/><br/>
sessionTest:${sessionScope.you.productName}
<s:property value="#session.you.productName"/><br/>
requestTest:${requestScope.we.productName}
<s:property value="#request.we.productName"/> <br/>
</body>
</html>
结果:
二.OGNL调用字段和方法
(1)调用任何一个 Java 类里的静态字段或方法.
(2)调用被压入到 ValueStack 栈的对象上的公共字段和方法.
(1)调用任何一个 Java 类里的静态字段或方法.
前提:在struts.xml中配置启用允许调用java类里的静态方法。
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
details.jsp
<!--使用OGNL调用public类的public类型的静态字段和静态方法-->
<s:property value="@java.lang.Math@cos(0)"/><br>
<s:property value="@java.lang.Math@PI"/><br>
刷新后效果:
(2)调用被压入到 ValueStack 栈的对象上的公共字段和方法.
<!--调用对象栈的方法为一个属性赋值-->
<s:property value="setProduceName('yiguang')"/>
<s:property value="ProductName"> </br>
三.OGNL读取访问数组类型的属性
1. 有些属性将返回一个对象数组而不是单个对象, 可以像读取任何其他对象属性那样读取它们. 这种数组型属性的各个元素以逗号分隔, 并且不带方括号
2. 可以使用下标访问数组中指定的元素: colors[0]
3. 可以通过调用其 length 字段查出给定数组中有多少个元素: colors.length
实例:
details.jsp:
<!--在jsp中写Java代码,需要放在<% %>中才能运行-->
<%
String [] str = new String[]{"aa","bb","cc","dd","ee"};
request.setAttribute("str", str);
%>
length:<s:property value="#attr.str.length"/><br>
name2:<s:property value="#attr.str[2]"/>
结果:
四.OGNL读取访问 List 类型的属性
实例:
details.jsp:
<!--OGNL读取访问 List 类型的属性 -->
<!--List是一个接口,而接口是不能被实例化的,只有通过实现了该接口的类进行实列化;在jsp中创建list需要导入java.util.ArrayList和java.util.List,>
<%
List<String> arrayList1= new ArrayList<String>();
arrayList1.add("aa");
arrayList1.add("bb");
arrayList1.add("cc");
arrayList1.add("dd");
request.setAttribute("list",arrayList1);
%>
<
<%
List<String> arrayList2 = new ArrayList<String>(){{add("str01"); add("str02");}};
List<String> arrayList3=new ArrayList<String>(){{add("11");add("22");add("33");add("44");}};
request.setAttribute("li",arrayList2);
request.setAttribute("yi",arrayList3);
%>
arraylist1:<s:property value="#attr.list.size"/><br>
arraylist1:<s:property value="#attr.list[1]"/> <br/>
arraylist2:<s:property value="#attr.li.isEmpty"/> <br/>
arraylist3:<s:property value="#attr.yi[1]"/> <br/>
结果显示:
五.OGNL读取访问 Map 类型的属性
实例:
details.jsp
<!--需要引入包<%@ page import="java.util.HashMap"%>和<%@ page import="java.util.Map"%>-->
<%
Map<String,String> map=new HashMap<String,String>();
map.put("aa","AA");
map.put("bb","BB");
request.setAttribute("gou",map);
%>
<s:property value="#attr.gou['aa']"/><br/>
<s:property value="#attr.gou.size"/><br/>
结果显示:
六.使用EL访问值栈中对象的属性
总代码:
Product.java:
package actionbao;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
public class Product implements RequestAware,SessionAware{
private Integer productId;
private String productName;
private String productDesc;
private Double productPrice;
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public Double getProductPrice() {
return productPrice;
}
public void setProductPrice(Double productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", productDesc="
+ productDesc + ", productPrice=" + productPrice + "]";
}
public String save() {
System.out.println("save " + this);
//1.获取值栈
ValueStack valueStack = ActionContext.getContext().getValueStack();
//2.创建Test对象,并为其属性赋值
Test czy= new Test();
czy.setProductName("AAAAAA");
czy.setProductDesc("BBBBBB");
//3将新对象压入值栈中
valueStack.push(czy);
sessionMap1.put("you", this);
request2.put("we",czy);
List<String> arrayList1= new ArrayList<String>();
arrayList1.add("aa");
arrayList1.add("bb");
arrayList1.add("cc");
arrayList1.add("dd");
request2.put("list",arrayList1);
Map<String,String> map=new HashMap<String,String>();
map.put("aa","AA");
map.put("bb","BB");
request2.put("gou",map);
return "details";
}
private Map<String,Object> sessionMap1;
@Override
public void setSession(Map<String, Object> arg0) {
this.sessionMap1=arg0;
}
private Map<String,Object> request2;
@Override
public void setRequest(Map<String, Object> arg0) {
this.request2=arg0;
}
}
details.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
ProductId:${productId}<br/>
ProductName:${productName}<br/>
ProductDesc:${productDesc}<br/>
ProductPrice:${productPrice}<br/>
<!--1.对象栈中某一个对象的属性值.-->
ProductId:<s:property value="[0].productName"/><br/>
ProductId:<s:property value="[1].productName"/><br/>
ProductId:<s:property value="productDesc"/><br/>
ProductId:<s:property value="productPrice"/><br/>
<!--2.访问ContextMap里的某个对象的属性.-->
sessionTest:${sessionScope.you.productName}
<s:property value="#session.you.productName"/><br/>
requestTest:${requestScope.we.productName}
<s:property value="#request.we.productName"/> <br/>
<!--3.调用任何一个 Java 类里的静态字段或方法.-->
<s:property value="@java.lang.Math@cos(0)"/><br>
<s:property value="@java.lang.Math@PI"/><br>
<!--4.调用被压入到 ValueStack 栈的对象上的公共字段和方法-->
<s:property value="setProductName('yiguang')"/>
name1:<s:property value="ProductName"/> </br>
<!--5.OGNL读取访问 数组 类型的属性-->
<%
String [] str1 = new String[]{"aa","bb","cc","dd","ee"};
request.setAttribute("str", str1);
%>
length:<s:property value="#attr.str.length"/><br>
name2:<s:property value="#attr.str[2]"/> <br/>
<!--6.OGNL读取访问list类型的属性-->
<!--
<%
List<String> arrayList1= new ArrayList<String>();
arrayList1.add("aa");
arrayList1.add("bb");
arrayList1.add("cc");
arrayList1.add("dd");
request.setAttribute("list",arrayList1);
%>
-->
<%
List<String> arrayList2 = new ArrayList<String>(){{add("str01"); add("str02");}};
List<String> arrayList3=new ArrayList<String>(){{add("11");add("22");add("33");add("44");}};
request.setAttribute("li",arrayList2);
request.setAttribute("yi",arrayList3);
%>
arraylist1:<s:property value="#attr.list.size"/><br>
arraylist1:<s:property value="#attr.list[1]"/> <br/>
arraylist2:<s:property value="#attr.li.isEmpty"/> <br/>
arraylist3:<s:property value="#attr.yi[1]"/> <br/>
<!--7.OGNL读取访问 Map 类型的属性-->
<!--
<%
Map<String,String> map=new HashMap<String,String>();
map.put("aa","AA");
map.put("bb","BB");
request.setAttribute("gou",map);
%>
-->
<s:property value="#attr.gou['aa']"/><br/>
<s:property value="#attr.gou.size"/><br/>
</body>
</html>