- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章:strts2中的OGNL
第四章:Struts 2中的OGNL主讲:刘雷 学习目标 掌握OGNL表达式的使用 掌握值栈的概念 掌握struts2对OGNL表达式的增强 OGNL简介 Struts2的一个关键特性就是它可以对Action携带的数据进行读写访问,例如在前面我们在表单中使用user.username指定数据传递给Action的user对象的username属性,在s:property元素中使用user.username来获取用户的名字,这是通过表达式语言(Expression Language,EL)来实现的,这种表达式语言就是OGNL。 OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。 为什么要使用OGNL 视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现。例如,在JSP页面中使用JSP2.0内置的表达式语言获取user对象的username属性,可以简写为${user.username},如果换作Java脚本代码,则需要写为: %@ page language=java import=java.util.*,com.bim.pojo.User pageEncoding=gbk% % User user = (User)request.getAttribute(user); String username = user.getUsername(); out.print(username); % 哪一种方法更为简捷,相信大家已经一目了然了。 既然JSP2.0已经内置了一种表达式语言,那么为什么还要使用OGNL呢? 相对于其它的表达式语言而言,OGNL的功能更为强大,它提供了很多高级而必须的特性,例如强大的类型转换功能,静态或实例方法的执行,跨集合投影(projection),以及动态lambda表达式定义等。 OGNL基础 OGNL表达式的计算都是围绕OGNL上下文来进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了java.util.Map接口)来表示。OGNL上下文可以包含一个或多个JavaBean对象,在这些对象中有一个是特殊的,这个对象就是上下文的根(root)对象。如果在写表达式的时候,没有指定使用上下文中的哪一个对象,那么根对象将被假定为表达式所依据的对象。 计算OGNL表达式的示例代码(一): 计算OGNL表达式的示例代码(二) 计算OGNL表达式的示例代码(三) 说明 OgnlContext就是一个Map,在Map中保存值,需要指定键(key),你在写表达式的时候使用的就是键名,而不是对象名,这一点一定要注意。 在Ognl上下文中,只能有一个根对象,如果你访问根对象,那么在写表达式的时候,直接写对象属性(property)就可以了;否则,你需要使用”#key”前缀,例如表达式:#. 另外需要注意的是,OGNL表达式中的属性(property)是JavaBean的属性,而不是类中的实例变量。 再看一个简单示例 请看下面的需求,假设有如下用户对象模型: Java代码 public interface User { public String getName(); public Date getRegisterDate(); public Customer getCustomer(); } public interface Customer { public String getId(); public String getName(); public boolean isVip(); } public interface EntCustomer extends Customer { public String getTrustId(); // 组织机构代码证号 }?? 问题及解决方案(一) 对于给定的用户jack,且该用户所属客户是企业客户,那么我们如何获取该用户的姓名?如何获取用户所属客户的名称?如何判断该用户所属客户是否是VIP客户?如何取jack所属企业的组织机构代码证号? * 采用java代码的方式,我们可以用如下的API调用得到所需信息: Java代码 jack.getName(); jack.getCustomer().getName(); jack.getCustomer().isVip(); ((EntCustomer)jack.getCustom
文档评论(0)