Struts(十一):OGNL表达式(二)
- Map栈 :request,session,application的一个属性值或一个请求参数的值。
若想访问ContextMap里的某个对象的属性,可以使用以下几种之一:
#object.propertyName
#object['propertyName']
#object["propertyName"]
示例:
返回session中的code属性:#session.code;
返回request中的customer对的name属性值:#request.customer.name
返回域对象(按request,session,application的顺序)的lasterActionDate属性:#attr.lastAccesssDate
- 例子:基于《Struts(九):值栈(OGNL)》中的例子对Product对象进行修改:
Product.java实现RequestAware、SessionAware接口,并在save方法中把this存放到sessionMap,把product2存放到requestMap中:
1 package com.dx.struts2.valuestack; 2 3 import java.io.UnsupportedEncodingException; 4 import java.util.Map; 5 6 import org.apache.struts2.interceptor.RequestAware; 7 import org.apache.struts2.interceptor.SessionAware; 8 9 import com.opensymphony.xwork2.ActionContext; 10 import com.opensymphony.xwork2.util.ValueStack; 11 12 public class Product implements RequestAware,SessionAware{ 13 private Integer productId; 14 private String productName; 15 private String productDesc; 16 private Double productPrice; 17 18 public Integer getProductId() { 19 return productId; 20 } 21 public void setProductId(Integer productId) { 22 this.productId = productId; 23 } 24 public String getProductName() { 25 return productName; 26 } 27 public void setProductName(String productName) { 28 this.productName = productName; 29 } 30 public String getProductDesc() { 31 return productDesc; 32 } 33 public void setProductDesc(String productDesc) { 34 this.productDesc = productDesc; 35 } 36 public Double getProductPrice() { 37 return productPrice; 38 } 39 public void setProductPrice(Double productPrice) { 40 this.productPrice = productPrice; 41 } 42 43 public String save(){ 44 System.out.println("save"); 45 46 // 1、获取值栈对象 47 ValueStack valueStack= ActionContext.getContext().getValueStack(); 48 49 // 2、生成一个Product2对象 50 Product2 product2=new Product2(); 51 product2.setProductDesc("product2 desc"); 52 product2.setProductName("product2 name"); 53 54 // 3、将Product2对象存放到值栈中 55 valueStack.push(product2); 56 57 sessionMap.put("product", this); 58 requestMap.put("product2", product2); 59 60 return "success"; 61 } 62 63 private Map<String,Object> requestMap; 64 65 @Override 66 public void setRequest(Map<String, Object> request) { 67 this.requestMap=request; 68 69 } 70 71 private Map<String,Object> sessionMap; 72 73 @Override 74 public void setSession(Map<String, Object> session) { 75 this.sessionMap= session; 76 } 77 }
details.jsp获取方式有两种:
productName:<br/> ${sessionScope.product.productName}<br/> or<br/> <s:property value="#session.product.productName"/><br/> <br/> productName:<br/> ${requestScope.product.productName}<br/> or<br/> <s:property value="#request.product.productName"/><br/>
- 调用字段和方法
1、可以利用OGNL调用
任何一个java类里的静态字段和方法;
被压入到ValueStack栈的对象上的公共字段和方法。
2、默认情况下,Strut2不允许调用任何java类的方法,需要重新设置struts.ognl.allowStaticMethodAccess标记变量为true.
3、调用静态字段或者方法需要使用如下所以的语法:
@fullyQualifiedClassName@fieldName
例如:
<s:property value="@java.lang.Math@PI"/>
@fullyQualifiedClassName@methodName(argumentList)
例如:
<s:property value="@java.lang.Math@cos(0)"/>
注意:此时默认是不允许输出结果的在strut2-core.jar中default.proerpties中包含struts.ognl.allowStaticMethodAccess
修需在struts.xml中
<struts> <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> ... </struts>
4、调用一个实例字段或者方法的语句,其中object是Object Stack栈里的某个对象的引用:
object.fieldName:[0].datePattern
object.methodName(argumentList):[0].repeat(3,"hello");
<s:property value="[0].setProductName('set product name')"/> <s:property value="[0].productName" />
5、还可以访问数组对象的属性。
<%String[] colors=new String[]{"red","blue"}; request.setAttribute("colors",colors); %> length:<s:property value="#attr.colors.length"/> colors[1]:<s:property value="#attr.colors[1]"/>
6、访问List类型的属性
7、访问Map类型的属性
<%Map<String,String> letters=new HasMap<String,String>(); letters.put("aa","Aa"); request.setAttribute("letters",letters); %> <s:property value="#attr.letters.size"/> AA: <s:property value="#attr.letters["aa"]"/>
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。