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

来源:互联网 发布:淘宝怎么批量添加水印 编辑:程序博客网 时间:2024/06/05 06:05

一.读取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;@Overridepublic void setSession(Map<String, Object> arg0) {this.sessionMap1=arg0;}private Map<String,Object> resquest2;@Overridepublic 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;@Overridepublic void setSession(Map<String, Object> arg0) {this.sessionMap1=arg0;} private Map<String,Object> request2;@Overridepublic 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>




阅读全文
0 0