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中:
package com.dx.struts2.valuestack; import java.io.UnsupportedEncodingException;
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;
} public String save(){
System.out.println("save"); // 1、获取值栈对象
ValueStack valueStack= ActionContext.getContext().getValueStack(); // 2、生成一个Product2对象
Product2 product2=new Product2();
product2.setProductDesc("product2 desc");
product2.setProductName("product2 name"); // 3、将Product2对象存放到值栈中
valueStack.push(product2); sessionMap.put("product", this);
requestMap.put("product2", product2); return "success";
} private Map<String,Object> requestMap; @Override
public void setRequest(Map<String, Object> request) {
this.requestMap=request; } private Map<String,Object> sessionMap; @Override
public void setSession(Map<String, Object> session) {
this.sessionMap= session;
}
}
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"]"/>
最新文章
- svn co 与ssl
- EBS创建相应的用户
- FileUpload上传与下载
- C#连接mysql实例
- 成为IBM精英讲师-一分耕耘 一份收获 同时也多了一份责任!
- struts2多文件上传(带进度条)demo+说明
- HDU 1041 Computer Transformation
- bzoj1854
- poj 1964 Cow Cycling(dp)
- 阿里云VPS搭建Hexo博客
- HttpClient Received an unexpected EOF or 0 bytes from the transport stream
- 变量类型-String
- 团队作业-Week9-软件项目的风险
- Nerd的套现ATM机
- Python中*和**的作用(课堂小结)
- spring cloud 路由Zuul的高可用
- Linux下双网卡绑定bond0【转】
- Mac 使用 launchctl 定时运行程序(转载)
- Alpha 冲刺报告6
- [转载]安装archlinux 以后没有 ifconfig,route ,nslo