struts2 ognl 表达式
Struts 2中的表达式语言
Struts 2支持以下几种表达式语言:
1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2. JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3. Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4. Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
1. 支持对象方法调用,如xxx.doSomeSpecial();
2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
3. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
4. 访问OGNL上下文(OGNL context)和ActionContext;
5. 操作集合对象。
“#”主要有三种用途:
1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下面有几个ActionContext中有用的属性:
parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter("id")
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute("userName")
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute("userName")
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute("userName")
attr
用于按request > session > application顺序访问其属性(attribute)
#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
<s:iterator value="books.{?#this.price > 35}">
<li><s:property value="title" /> - $<s:property value="price" /></li>
</s:iterator>
<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/>
问题:?#this的多个判断问题 &&
3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 之前讲过
%的特性 计算表达式 类似javascript中的eval函数 可用s:url举例说明%用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值
举例:用s:url或<s:set举例
<s:textfield key="state.label" name="state" value="%{'CA'}" />
计算boolean值(带有转义符的):
<s:select key="state.label" name="state" multiple="%{true}"/>
带有属性的:
<s:select key="state.label" name="state" multiple="allowMultiple"/>
既带有转义符又带有属性的:
<s:select key="state.label" name="state" multiple="%{allowMultiple}"/>
表示式语言符号
1.在Freemarker、Velocity或者JSTL的表达式语言的JavaBean对象的标准文本
<p>Username: ${user.username}</p>
2.在值栈中的一个username属性
<s:textfield name="username"/>
3. 引用值栈中的属性的另一种方式
<s:url id="es" action="Hello">
<s:param name="request_locale">
es
</s:param>
</s:url>
<s:a href="%{es}">Espanol</s:a>
4. 在Session Context中获得user对象的userName属性
<s:property name="#session.user.username" />
5. 在一个静态map中,像("username","trillian")一样
<s:select label="FooBar" name="foo" list="#{'username':'trillian', 'username':'zaphod'}" />
$”有两个主要的用途
1. 用于在国际化资源文件中,引用OGNL表达式,参考前面的国际化校验配置
2. 在Struts 2配置文件中,引用OGNL表达式传递参数
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
Struts 2支持以下几种表达式语言:
1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2. JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3. Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4. Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
1. 支持对象方法调用,如xxx.doSomeSpecial();
2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
3. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
4. 访问OGNL上下文(OGNL context)和ActionContext;
5. 操作集合对象。
“#”主要有三种用途:
1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下面有几个ActionContext中有用的属性:
parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter("id")
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute("userName")
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute("userName")
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute("userName")
attr
用于按request > session > application顺序访问其属性(attribute)
#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
<s:iterator value="books.{?#this.price > 35}">
<li><s:property value="title" /> - $<s:property value="price" /></li>
</s:iterator>
<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/>
问题:?#this的多个判断问题 &&
3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 之前讲过
%的特性 计算表达式 类似javascript中的eval函数 可用s:url举例说明%用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值
举例:用s:url或<s:set举例
<s:textfield key="state.label" name="state" value="%{'CA'}" />
计算boolean值(带有转义符的):
<s:select key="state.label" name="state" multiple="%{true}"/>
带有属性的:
<s:select key="state.label" name="state" multiple="allowMultiple"/>
既带有转义符又带有属性的:
<s:select key="state.label" name="state" multiple="%{allowMultiple}"/>
表示式语言符号
1.在Freemarker、Velocity或者JSTL的表达式语言的JavaBean对象的标准文本
<p>Username: ${user.username}</p>
2.在值栈中的一个username属性
<s:textfield name="username"/>
3. 引用值栈中的属性的另一种方式
<s:url id="es" action="Hello">
<s:param name="request_locale">
es
</s:param>
</s:url>
<s:a href="%{es}">Espanol</s:a>
4. 在Session Context中获得user对象的userName属性
<s:property name="#session.user.username" />
5. 在一个静态map中,像("username","trillian")一样
<s:select label="FooBar" name="foo" list="#{'username':'trillian', 'username':'zaphod'}" />
$”有两个主要的用途
1. 用于在国际化资源文件中,引用OGNL表达式,参考前面的国际化校验配置
2. 在Struts 2配置文件中,引用OGNL表达式传递参数
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.