1. 程式人生 > >16.Struts2_OGNL讀取Map棧(Context Map)裡物件的屬性及其他欄位和方法

16.Struts2_OGNL讀取Map棧(Context Map)裡物件的屬性及其他欄位和方法

一.讀取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="@[email protected](0)"/><br>  

<s:property value="@[email protected]"/><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="@[email protected](0)"/><br>    
    <s:property value="@[email protected]"/><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>


相關推薦

16.Struts2_OGNL讀取Map(Context Map)物件屬性及其方法

一.讀取Context Map裡的物件的屬性 1.若想訪問ContextMap裡的某個物件的屬性,可以使用以下幾種方式形式之一: #object.propertyName#object.['propertyName']#object.["propertyName"] 示例:

JS47 Map()的營救:使物件屬性有順序

在對一個物件進行遍歷時,每個瀏覽器都有自己的規則,遍歷的順序是不確定的: var myObject = { z: 1, '@': 2, b: 3, 1: 4, 5: 5 }; for (item in myObject) { console.log(item

任意檔案讀取路徑、payload

敏感欄位 &RealPath= &FilePath= &filepath= &Path= &path= &inputFile= &url= &urls= &Lang= &dis= &da

sqlserver資料庫的image存入方法讀取

存入方法 private void button1_Click(object sender, EventArgs e) { openFileImage.Filter = "*.jpg|*.JPG|*.gif|*.GIF|*.bmp|

MongoDB:16-MongoDB-索引陣列索引子文件

MongoDB允許深入文件內部,對巢狀欄位和陣列建立索引;巢狀物件和陣列欄位可以和複合索引中的頂級欄位一起使用,多數情況下與“正常”索引欄位的行為也是一致的。考慮以下文件集合(use

select標籤下option標籤value屬性有什麼用以及text的區別

1:value的用處 <select > <option value = "A">B</option> </select> 其中“A”“B”有何區別,各自代表什麼意思?答案: B是顯示在網頁上的內容 A是實際傳給後臺表單處理程

MapReduce解析之MapContext,Reduce

HR 中文 明顯 tar 框架 andro 開發 ref session 要理解MapReduce,就必須理解其框架結構,把這三者放在一起講是為了便於大家理解。 也就是兩大組件Map與Reduce 首先看看Map (聲明:這裏感謝Pig2的文章,對我啟發很大,也順便引用一下

MapReduce 中如何處理HBase中的資料?如何讀取HBase資料給Map?如何將結果儲存到HBase中?

   MapReduce 中如何處理HBase中的資料?如何讀取HBase資料給Map?如何將結果儲存到HBase中? Mapper類:包括一個內部類(Context)和四個方法(setup,map,cleanup,run);     &n

map轉實體類(前提是實體類都是string)

/*** * @param map 需轉換的map物件* @param beanName 轉後的bean型別(需寫包名加類名,否則類找不到),例:"gov.nbeic.nbzwy.entity.qualityerrorcount.QualityErrorCount"* @return * @throws In

28.React使用map循環創建對象綁定click無效解決方法

char pan style 鉆石 function blog lec [] 創建對象 var RechargeBtnEle = React.createClass({ getInitialState: function() { return

Map、List、Set在Java中的各種遍歷方法

try one out 循環 java light size i++ pre 一、Map的4種遍歷 Map<String, String> map = new HashMap<String, String>(); map.put("姓名", "

Map集合 把map 集合 轉成Set的方法

com 一個 刪除 取出 -h lin etl 判斷 表結構 |--Hashtable:底層是哈希表數據結構,是線程同步的。不可以存儲null鍵,null值。 |--HashMap:底層是哈希表數據結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtab

Sass函數:Sass Maps的函數-map-has-key($map,$key)

color pan googl 語句 布爾值 意思 布爾 提示 ebo map-has-key($map,$key) 函數將返回一個布爾值。當 $map 中有這個 $key,則函數返回 true,否則返回 false。 前面的示例,當 $key 不在 $map 中時,使用

leetcode677+Map sum使用map就行,加上一個starts_with函式

https://leetcode.com/problems/map-sum-pairs/description/ class MapSum { public: map<string, int> pairs; /** Initialize your data str

遍歷map取對應的值

後臺dao層介面: Map<String,Object> detail(IwResultSpot vo); 中間層: //接收為map Map<String,Object> map = this.detail(vo); List list1 = new Arr

Java中的Map集合以及Map集合遍歷例項

文章目錄 一、Map集合 二、Map集合遍歷例項 一、Map集合 Map<K,V>k是鍵,v是值 1、 將鍵對映到值的物件,一

Java基礎 @org.junit.Test-單元測試方法 + 操縱CollectionMap的工具類 : Collections 的sort/binarySearch/max/min等靜態方法

單元測試程式碼:   ( 在IDEA中先輸入'@Test '然後根據提示進行自動修訂即可!!執行時直接執行即可!         若有多個單元測試塊的時候,直接把滑鼠放在哪裡就自動在哪裡執行那個單元塊) import java.util.*; /**操縱Collection和Map

Java基礎學習01——Map遍歷Map.Entry

問題描述 前些天遇到了一個疑問,今天終於驗證了一下,現在記錄下來。 問題是這樣的,大家遍歷Map的時候用Map.Entry,通過Map.Entry獲取到key和value,與存入Map當中的key和value是同一個物件嗎? 為了驗證一下這個問題我寫了如下程式碼: public st

關於map巢狀mapmap巢狀list(轉載https://blog.csdn.net/mustbehard/article/details/17310043)

import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set;

【轉】Map 與 Unordered_map mapunordered_map的差別使用

map和unordered_map的差別和使用 map和unordered_map的差別還不知道或者搞不清unordered_map和map是什麼的,請見:http://blog.csdn.net/billcyj/article/details/78065438 需要引入的標頭檔案不同m