struts2中的OGNl表达式
OGNL全称是Object-Graph Navigation Language(对象图形导航语言),相对于EL语言,除了保持EL语言的优点外,他的其他优点如下:
- 能够访问对象的普通方法
- 能够访问类的静态属性和静态方法
- 强大的操作集合类对象的能力
- 支持赋值操作和表达式串联
- 访问OGNL上下文和ActionContext
使用ognl表达式还能获取其他值,这些值并不需要存放进作用域中,而是放到值栈中
<!-- 一进来就把其他页面加载进来,相当于c:include -->
<s:action name="testognl" executeResult="true" namespace="/"/>
访问属性<s:property value="temp"/>
访问action普通方法:<s:property value="show()"/>
访问非action静态方法<s:property value="@com.sxt.po.User@show()"/>
操作list集合:
<s:set name="typeList" value="{'aaa','bbb','ccc'}"/>
<s:select list="#typeList"/>
集合数量:<s:property value="#typeList.size()"/>
操作map集合:设置键值对,可以给option设置value值
<s:set name="typemap" value="#{1:'aaa',2:'bbb',3:'ccc' }"/>
<s:select list="#typemap"></s:select>
相当于:
<select>
<option value="1">aaa</option>
<option value="2">bbb</option>
<option value="3">ccc</option>
</select>
把数组放到复选框中提供选择<s:checkboxlist list="houstList" name=""/>
使用迭代器,把集合中的数据输出
<s:if test="houstList!=null && houstList.size()>0">
<s:iterator status="vs" value="houstList" var="house">
<s:property value="#house.title"/>
</s:iterator>
</s:if>
使用迭代器,把数组中的数据输出
<s:if test="fileName!=null && fileName.length>0">
<s:iterator value="fileName" status="file">
<!-- 第一种方式:<s:property value="fileName[#file.index]"/> -->
<img alt="" src="upload/images/<s:property value="fileName[#file.index]"/>" width="300px" height="300px"/>
<!-- 第二种方式:<s:property> -->
<a href="upload/benxi_download.sxt?fileName=<s:property/>">下载</a>
<hr>
</s:iterator>
</s:if>
<s:else>没有值</s:else>
过滤/投影
查询房屋信息(租金价格>900) {?#this.price>900}.{title}输出所有的
<s:property value="houselist.{?#this.price>900}[0].{title}"/>
第一个符合要求的
<s:property value="houselist.{^#this.price>900}"/>
最后一个符合要求的
<s:property value="houselist.{$#this.price>900}"/>
获得参数值:<s:property value="#parameters.temp[0]"/>
运算:<s:property value="age+1"/>
<s:if test="houselist!=null&&houselist.size()>0">
正在出租的房屋:
<s:iterator value="houselist" var="house" status="vs">
<s:property value="#vs.count"/>
<s:property value="#house.title"/>
<s:property value="#house['price']"/>
日期:<s:property value="#house.addDate"/>
<s:date name="#house.addDate" format="yyyy年MM月dd日"/>
</s:iterator>
</s:if>
<s:else>没有房屋出租</s:else>
<!-- 查看值栈中的数据 -->
<s:debug/>
对应的java文件
public String execute() throws Exception {
//设置数据,并存放进作用域当中
User user = new User();
user.setName("benxi");
user.setAge(26);
ActionContext.getContext().getSession().put("user", user);
//模拟房屋集合
House house1=new House(100, "靓房出租1", "大气上档次", new BigDecimal(500), new BigDecimal(120), "12497080343",new java.sql.Date(System.currentTimeMillis()));
House house2=new House(101, "靓房出租2", "大气上档次", new BigDecimal(800), new BigDecimal(130), "12497080344",new java.sql.Date(System.currentTimeMillis()));
House house3=new House(102, "靓房出租3", "大气上档次", new BigDecimal(5200), new BigDecimal(140), "12497080345",new java.sql.Date(System.currentTimeMillis()));
House house4=new House(103, "靓房出租4", "大气上档次", new BigDecimal(5300), new BigDecimal(150), "12497080346",new java.sql.Date(System.currentTimeMillis()));
House house5=new House(104, "靓房出租5", "大气上档次", new BigDecimal(5400), new BigDecimal(160), "12497080347",new java.sql.Date(System.currentTimeMillis()));
houselist=new ArrayList<House>();
houselist.add(house1);
houselist.add(house2);
houselist.add(house3);
houselist.add(house4);
houselist.add(house5);
return this.SUCCESS;
}
其他省略