1、“#”符号有三种用途:
(1)、访问struts中值栈对象),OGNL在不添加任何符号的情况下,默认访问的是ValueStack中的值,也就是说是Action中的属性和方法;如OGNL上下文和Action上下文,#相当于ActionContext.getContext()
举例:
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>
<s:property value="#myMap['key1']"/>
<s:url value="#myMap['key1']" />
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>
<s:property value="#myMap['key1']"/>
<s:url value="#myMap['key1']"/>
上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"。
原因:在property标签中,value之后的字符串会自动被解析为OGNL表达式,但是URL标签在被struts解析的时候默认当做字符串对待,所以这里输出的是原字符串 。
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}
#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:
<s:property value="#myMap['foo1']"/>
<s:property value="#myMap['foo1']"/>
2.%符号
%符号的用途是在标志的属性为字符串类型时,转换为计算OGNL表达式的值。让被理解为字符串的表达式,被真正当成ognl来执行。如下面的代码所示:
构造Map
<s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />
The value of key “foo1″ is <s:property value=”#foobar['foo1']” />
不使用%:<s:url value=”#foobar['foo1']” />
使用%:<s:url value=”%{#foobar['foo1']}” />
小结:
a) # 取得ActionContext的值
b) % 将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用
这里顺带提一下EL表达式
EL表达式:
1.基本格式:${}
2.4种取值范围:pageScope,requestScope,sessionScope,applicationScope
${requestScope.user.name}
3.基本运算:.和[] .用于取属性[]用于取Array,List,Map,Set
${requestScope.map['apple']},${requestScope.list[1]}
4.{}里允许的运算:算术运算,关系运算,逻辑运算,empty/not empty空判断
${1+1}
${user.age<18}
${(user.age>18)&&(user.sex=='男')}
${empty user}判断user对象是否为空
5.EL的11个隐含对象
pageContext,param和paramValues,header和headerValues,cookie,initParam和4种取值范围对象
*pageContext可获取jsp的request,response,out,session,config,servletContext等对象
${pageContext.session.uesr}
header
${header.host}
*cookie
${cookie.key}