Struts2支持的表达式语言:
- OGNL可以方便地操作对象属性的开源表达式语言
- JSTL JSP2.0集成的表达式语言
- .....
Struts2默认的表达式预言师OGNL。它具有如下优势:
-
支持对象方法调用,如xxx.doSomeSpecial();
- 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
- 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
- 访问OGNL上下文(OGNL context)和ActionContext;
- 操作集合对象。
OGNL的用法:
OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。大家经常遇到的问题是#、%和$这三个符号的使用。
”#“主要有三种用法
- 访问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属性,直到找到为止 |
- 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
- 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
例如:有如下Action代码
public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware {
private static final long serialVersionUID = 1L;
private HttpServletRequest request;
private Map<String, String> session;
private ServletContext application;
private List<Book> books;
.............此处省略100个字.............
@Override
public String execute() {
request.setAttribute("userName", "Max From request");
session.put("userName", "Max From session");
application.setAttribute("userName", "Max From application");
books = new LinkedList<Book>();
books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));
books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
return SUCCESS;
}
}
以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。我还创建了Book对象的列表用于演示“用于过滤和投影(projecting)集合”的功能
下面是JSP中的代码:
<body>
<h3>访问OGNL上下文和Action上下文</h3>
<p>parameters: <s:property value="#parameters.userName" /></p>
<p>request.userName: <s:property value="#request.userName" /></p>
<p>session.userName: <s:property value="#session.userName" /></p>
<p>application.userName: <s:property value="#application.userName" /></p>
<p>attr.userName: <s:property value="#attr.userName" /></p>
<hr />
<h3>用于过滤和投影(projecting)集合</h3>
<p>Books more than $35</p>
<ul>
<s:iterator value="books.{?#this.price > 35}">
<li><s:property value="title" /> - $<s:property value="price" /></li>
</s:iterator>
</ul>
<p>The price of "Code Complete, Second Edition" is: <s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/></p>
<hr />
<h3>构造Map</h3>
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>
</body>
以上代码值得注意的是“<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/>”,因为“books.{?#this.title=='Code
Complete, Second Edition'}.{price}”返回的值是集合类型,所以要用“[索引]”来访问其值。”%“的用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在以上jsp中加入以下代码:
<hr />
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
刷新页面,结果如下所示:
"$"的用法
- 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》
- 在Struts 2配置文件中,引用OGNL表达式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
OGNL计算字符串长度并截取
<s:if
test="wo.wodesc.length()>20">
<s:property
value="wo.wodesc.substring(0,19)"/> ...
</s:if>
总结
OGNL是一种功能很大的表达式语言,熟悉它可以使我们的开发变得更快捷。
参考文档:
http://www.blogjava.net/max/archive/2007/04/28/114417.html
分享到:
相关推荐
ognl表达式 ognl表达式 ognl表达式 ognl表达式
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
OGNL是对象图导航语言(即该表达式访问的是对象及对象的属性)
ognl表达式在struts中的用法解析
Struts2的标签库及OGNL表达式语言
JS:ognl表达式 JS:ognl表达式 JS:ognl表达式
NULL 博文链接:https://huguifuture.iteye.com/blog/761843
关于OGNL表达式的使用的整理以及提供的文档说明,ps:文档说明是英文的,可能需要翻译
在web开发技术中最常用到的OGNL表达式,对于ognl有点模糊的朋友,试试看思路必定会很清晰,用起来顺手。
ognl表达式的用法,叫你熟练掌握ognl 表达式
struts2中ognl表达式的用法,详细介绍了ognl表达式与struts2基本标签的结合。
ognl表达式的详细教学描述,介绍如何使用ognl表达式和ognl的运行原理
struts2标签和OGNL表达式struts2标签和OGNL表达式
NULL 博文链接:https://chaoyi.iteye.com/blog/2158731
struts2-OGNL表达式测试代码
NULL 博文链接:https://takeme.iteye.com/blog/1668255
NULL 博文链接:https://z-one.iteye.com/blog/1584602
与上一讲上传的资源,OGNL表达式2讲,只要是一些常用标签使用的案例