1.OGNL讀取Map棧
GG_CZY.java
package com.qbz.struts2_02; import java.util.Map; import java.util.UUID; 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 GG_CZY implements SessionAware,RequestAware{ //省略 ...... ...... public String save() { if(this.id==null){ this.id = UUID.randomUUID().toString().replace("-", ""); } //1.獲取值棧 ValueStack stack = ActionContext.getContext().getValueStack(); //2.給新對象複製 GG_CZY czy = new GG_CZY(null,null,"王小二","放牛"); //3將新對象壓入值棧中 stack.push(czy); this.requestMap.put("reqTest", this); this.sessionMap.put("sessTest", czy); return "save"; } private Map<String,Object> requestMap; @Override public void setRequest(Map<String, Object> arg0) { this.requestMap = arg0; } private Map<String,Object> sessionMap; @Override public void setSession(Map<String, Object> arg0) { this.sessionMap = arg0; } }
實現SessionAware,RequestAware接口,並往request、session中賦值。
Show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:debug></s:debug> ID:${id}<br> 編號:${ dlh}<br> 姓名:${ name}<br> 部門:${ bmmc}<br> name:<%=request.getAttribute("name") %><br> name:<s:property value="name"/><br> name[0]:<s:property value="[0].name"/><br> name[1]:<s:property value="[1].name"/><br> requestTest:<s:property value="#request.reqTest.name"/><br> sessionTest:<s:property value="#session.sessTest.name"/> </body> </html>
Debug
總結
2.OGNL調用字段和方法
-調用,任何一個 Java 類裏的靜態字段或方法.
-調用,被壓入到 ValueStack 棧的對象上的公共字段和方法.
-調用,任何一個 Java 類裏的靜態字段或方法.
前提:設置啓用允許調用java類裏的靜態方法。
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
Show.jsp
<s:property value="@java.lang.Math@abs(0)"/><br> <s:property value="@java.lang.Math@PI"/><br>
刷新後效果:
-調用,被壓入到 ValueStack 棧的對象上的公共字段和方法.
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:debug></s:debug> ID:${id}<br> 編號:${ dlh}<br> 姓名:${ name}<br> 部門:${ bmmc}<br> name:<%=request.getAttribute("name") %><br> name:<s:property value="name"/><br> name[0]:<s:property value="[0].name"/><br> name[1]:<s:property value="[1].name"/><br> <s:property value="setName('哈哈哈哈')"/> name:<s:property value="name"/><br> requestTest:<s:property value="#request.reqTest.name"/><br> sessionTest:<s:property value="#session.sessTest.name"/><br> <s:property value="@java.lang.Math@abs(0)"/><br> <s:property value="@java.lang.Math@PI"/><br> </body> </html>
<s:property value="setName('哈哈哈哈')"/>
執行了值棧中所有對象的所有setName(String str)方法。
3.OGNL讀取訪問數組類型的屬性
1. 有些屬性將返回一個對象數組而不是單個對象, 可以像讀取任何其他對象屬性那樣讀取它們. 這種數組型屬性的各個元素以逗號分隔, 並且不帶方括號
2. 可以使用下標訪問數組中指定的元素: colors[0]
3. 可以通過調用其 length 字段查出給定數組中有多少個元素: colors.length
在action方法中初始化一個數組
private Map<String,Object> requestMap; ...... String [] str = new String[]{"aa","bb","cc","dd","ee"}; this.requestMap.put("str", str);
show.jsp
<s:property value="#attr.str.length"/><br> <s:property value="#attr.str[2]"/>
效果顯示: