16.Struts2_OGNL读取Map栈(Context Map)里对象的属性及其他字段和方法

一.读取Context Map里的对象的属性

1.若想访问ContextMap里的某个对象的属性,可以使用以下几种方式形式之一:

#object.propertyName
#object.['propertyName']
#object.["propertyName"]
示例:

  1. 返回session中的code属性:#session.code
  2. 返回request中的customer属性的name属性值:#request.customer.name
  3. 返回域对象(按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>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值