struts2 OGNL详细操作(#,%,$)

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>OGNL表达式语言学习</title>
</head>
<body>
	<ol>
		
		<li> 访问值栈中action的普通属性: username = <s:property value="username"/> </li>
		
		<li> 访问值栈中普能对象的(get/set):<s:property value="user.age"/> | <s:property value="user['age']"/> || <s:property value="user[\"age\"]"/>
		<!-- 对于user对象是否由struts创建,只要你有传参给它(&user.age=10)就会自动创建,也可以在action 手动new -->
		
		<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
		
		<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
		
		<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
		
		<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
		<!-- 类名方法名前加@, 2.1版本的要加 constant name="struts.ognl.allowStaticMethodAccess" value="true"  -->
		
		<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
		
		<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
		
		<hr />
		<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
		<hr />
		
			
		<li>访问List:<s:property value="users"/></li>
		<li>访问List中某个元素:<s:property value="users[1]"/></li>
		<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
		<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
		
		<li>访问Set:<s:property value="dogs"/></li>
		<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
		
		<li>访问Map:<s:property value="dogMap"/></li>
		<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
		<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
		<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
		<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
		<hr />
		
		<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
		<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
		<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
		<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
		<hr />
		
		<li>[]:<s:property value="[0].username"/></li>
		
	</ol>
	
	<s:debug></s:debug>
</body>
</html>

 

 

 

 

 下面说明一下几个关键点:"{}"符节可以看做是一个集合;?#表示过滤users.{?#this.age==1}取出来是一个集合.

^#表示第一个,$#表示最后一个,这有点像正则表达式.

<s:property value="[0].username"/>这个有点意思,在值栈中在栈顶永远是action,栈底是com.opensymphony.xwork2.DefaultTextProvider,这

样好像对我们没有多大多处啊?其实我们有时值栈可能会有多个action,这样就对我们有用了,可以起来精确定位.(在我们使用chain时存在多

个action).

 

使用一项技术首先要了解它的基本功能与操作: 有时我们会用到 # % $ '',下面说明一下它们各自的使用方法;

1.<s:property value="users"/> 像这个表过式value="users" 其实它已经使用了OGNL,你也可以这样写
value="%{users}",( %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用),一般可以不用就
不要用等到要用时再用,像include标签的value为string类型,这时我们就要用%强制转换成OGNL.

2."#"其实是OGNL操作actioncontext的符号,可以用这个标签<s:debug></s:debug>来查看哪些是ValueStack哪些是actionContext.

3.有时你不想用到OGNL,你可以有''来操作,例:<s:property value="'name'"/> 这样就不会使用到OGNL,只会输出name;

4.$符号用于i18nstruts配置文件

 

附件:尚学堂的例子

 

 

你可能感兴趣的:(html,struts,正则表达式,XHTML)