#:
#用来取根目录下的值,例如 session,request等等,取值的时候#session.key.属性名 ,这样会取到想要的对象的属性值。
#代表当前的意思可以取出堆栈上下文的存放对象,不在struts堆栈里,没有#表示从struts堆栈里取
如果从action中取属性值,则test中的属性值前面的'#'不需要
#通常强调从上下文取
当Action的valueStack中有该属性的值时,只需直接使用该属性的名字即可;
当Action的valueStack中没有该属性的值时,比如在session,application范围中的属性值时,需要加#或者#attr.;
访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();
另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈)。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象
,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/>
注意:
在action中设置了该属性的setter/getter方法时,该属性才会取到,否则它不会被拦截器处理,value参数的类型是object,可以理解为这个默认是会解析成ognl表达式的。如果需要输入一个字符串<s:property value="'ddd'">注意,在value里面的ddd字符串外面加了单引号,这样不会将ddd解析成ognl表达式了。
%{}:
%{}类似于强转为值栈的数据类型
并且%用于OGNL标签嵌套时候用的,比如想把一个对象的值赋值给另外一个对象:
用%{}可以取出存在值堆栈中的Action对象,
这是JSP2.1最新规范中的语法,是Struts2为其解决兼容性问题而写成%{#}的
%{}强调的是从你设定的root点取
%{}用于计算表达式
如%{10+20}结果将输出30
如%{"a"+"b"}结果将输出"ab"
%{#}:
在域对象中使用%{#}
比如%{#session.user.userName}
将获得user对象的 userName属性值
%{#}仍然用于计算表达式,只不过操作元可以是变量
如先定义一个变量
<s:set name="age" value="%{25}"/>
则%{#age}将输出25,也可以省略"#",写为%{age}
若将age加10,可这么写:
%{#age+10},将输出30.不能省略"#"。也就说变量用于计算时不能省略"#"