OGNL在Struts2中的应用.docx
- 文档编号:8589216
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:29.72KB
OGNL在Struts2中的应用.docx
《OGNL在Struts2中的应用.docx》由会员分享,可在线阅读,更多相关《OGNL在Struts2中的应用.docx(17页珍藏版)》请在冰豆网上搜索。
OGNL在Struts2中的应用
要谈OGNL在Struts2中的应用,首先得明白OGNL到底是什么
OGNL的历史
OGNL最初是为了能够使用对象的属性名来建立UI组件(component)和控制器(controllers)之间的联系,简单来说就是:
视图与控制器之间数据的联系。
后来为了应付更加复杂的数据关系,DrewDavidson发明了一个被他称为KVCL(Key-ValueCodingLanguage)的语言。
Luke参与进来后,用ANTLR来实现了该语言,并给它取了这个新名字,他后来又使用JavaCC重新实现了该语言。
目前OGNL由Drew来负责维护。
目前很多项目中都用到了OGNL,其中不乏为大家所熟知的,例如几个流行的web应用框架:
WebWork【当然struts2也可以说是WebWork升级版】,Tapestry等。
什么是OGNL?
OGNL是Object-GraphNavigationLanguage的缩写,从语言角度来说:
它是一个功能强大的表达式语言,用来获取和设置java对象的属性,它旨在提供一个更高抽象度语法来对java对象图进行导航,OGNL在许多的地方都有应用,例如:
1)作为GUI元素(textfield,combobox,等)到模型对象的绑定语言。
2)数据库表到Swing的TableModel的数据源语言。
3)web组件和后台Model对象的绑定语言(WebOGNL,Tapestry,WebWork,WebObjects)。
4)作为JakarataCommonsBeanUtils或者JSTL的表达式语言的一个更具表达力的替代语言。
另外,java中很多可以做的事情,也可以使用OGNL来完成,例如:
列表映射和选择。
对于开发者来说,使用OGNL,可以用简洁的语法来完成对java对象的导航。
通常来说:
通过一个“路径”来完成对象信息的导航,这个“路径”可以是到javabean的某个属性,或者集合中的某个索引的对象,等等,而不是直接使用get或者set方法来完成
OGNL的基本语法
OGNL表达式一般都很简单。
虽然OGNL语言本身已经变得更加丰富了也更强大了,但是一般来说那些比较复杂的语言特性并未影响到OGNL的简洁:
简单的部分还是依然那么简单。
比如要获取一个对象的name属性,OGNL表达式就是name,要获取一个对象的headline属性的text属性,OGNL表达式就是headline.text。
OGNL表达式的基本单位是“导航链”,往往简称为“链”。
最简单的链包含如下部分:
表达式组成部分 示例
属性名称 如上述示例中的name和headline.text
方法调用 hashCode()返回当前对象的哈希码。
数组元素 listeners[0]返回当前对象的监听器列表中的第一个元素。
所有的OGNL表达式都基于当前对象的上下文来完成求值运算,链的前面部分的结果将作为后面求值的上下文。
你的链可以写得很长,例如:
name.toCharArray()[0].numericValue.toString()
上面的表达式的求值步骤:
提取根(root)对象的name属性。
调用上一步返回的结果字符串的toCharArray()方法。
提取返回的结果数组的第一个字符。
获取字符的numericValue属性,该字符是一个Character对象,Character类有一个getNumericValue()方法。
调用结果Integer对象的toString()方法。
上面的例子只是用来得到一个对象的值,OGNL也可以用来去设置对象的值。
当把上面的表达式传入Ognl.setValue()方法将导致InappropriateExpressionException,因为链的最后的部分(toString())既不是一个属性的名字也不是数组的某个元素。
了解了上面的语法基本上可以完成绝大部分工作了。
OGNL表达式
1)常量:
字符串:
“hello”字符:
‘h’数字:
除了像java的内置类型int,long,float和double,Ognl还有如例:
0.01B,相当于java.math.BigDecimal,使用’b’或者’B’后缀。
100000H,相当于java.math.BigInteger,使用’h’或’H’后缀。
2)属性的引用例如:
user.name
3)变量的引用例如:
#name
4)静态变量的访问使用@class@field
5)静态方法的调用使用@class@method(args),如果没有指定class那么默认就使用java.lang.Math.
6)构造函数的调用例如:
newjava.util.ArrayList();
其它的Ognl的表达式可以参考Ognl的语言手册。
OGNL的性能
OGNL,或者说表达式语言的性能主要又两方面来决定,一个就是对表达式的解析(Parser),另一个是表达式的执行,OGNL采用javaCC来完成parser的实现,在OGNL2.7中又对OGNL的执行部分进行了加强,使用javasisit来JIT(Just-In-Time)的生成bytecode来完成表达式的执行。
Ognl给这个功能的名字是:
OGNLExpressionCompilation。
基本的使用方法是:
SimpleObjectroot=newSimpleObject();
OgnlContextcontext= (OgnlContext)Ognl.createDefaultContext(null);
Nodenode= (Node)OpileExpression(context,root,"user.name");
StringuserName=(String)node.getAccessor().get(context,root);
实践证明:
OGNL非常接近java直接调用的时间。
表达式语言主要有以下几大好处:
1)避免(MyType)request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
2)支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
3)简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts2中的表达式语言
Struts2支持以下几种表达式语言:
1)OGNL(Object-GraphNavigationLanguage),可以方便地操作对象属性的开源表达式语言;
2)JSTL(JSPStandardTagLibrary),JSP2.0集成的标准的表达式语言;
3)Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4)Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名| 值名],例如:
@java.lang.String@format('foo%s','bar')或@tutorial.MyConstant@APP_NAME;
支持赋值操作和表达式串联,如price=100,discount=0.8,calculatePrice(),这个表达式会返回80;
访问OGNL上下文(OGNLcontext)和ActionContext;
操作集合对象。
Struts2中ONGL的使用示例
index.html
Html代码
1. large;"> large;"> 2. 3. 4. 5. 6.
User.java
Java代码
1. large;"> large;">package com.javacrazyer.web.action; 2. 3.import java.util.Date; 4. 5. 6.public class User { 7. private Integer id; 8. private String loginname; 9. private Double score; 10. private Boolean gender; 11. private Character cha; 12. private Date birthday; 13. 14. public User(){} 15. 16. public User(Integer id, String loginname, Double score, Boolean gender, 17. Character cha, Date birthday) { 18. this.id = id; 19. this.loginname = loginname; 20. this.score = score; 21. this.gender = gender; 22. this.cha = cha; 23. this.birthday = birthday; 24. } 25. public Integer getId() { 26. return id; 27. } 28. public void setId(Integer id) { 29. this.id = id; 30. } 31. public String getLoginname() { 32. return loginname; 33. } 34. public void setLoginname(String loginname) { 35. this.loginname = loginname; 36. } 37. public Double getScore() { 38. return score; 39. } 40. public void setScore(Double score) { 41. this.score = score; 42. } 43. public Boolean getGender() { 44. return gender; 45. } 46. public void setGender(Boolean gender) { 47. this.gender = gender; 48. } 49. public Character getCha() { 50. return cha; 51. } 52. public void setCha(Character cha) { 53. this.cha = cha; 54. } 55. public Date getBirthday() { 56. return birthday; 57. } 58. public void setBirthday(Date birthday) { 59. this.birthday = birthday; 60. } 61. 62. public String info() { 63. return "User [birthday=" + birthday + ", cha=" + cha + ", gender=" 64. + gender + ", id=" + id + ", loginname=" + loginname 65. + ", score=" + score + "]"; 66. } 67.}
OGNLAction.java
Java代码
1. large;"> large;">package com.javacrazyer.web.action; 2. 3. 4.import java.util.ArrayList; 5.import java.util.Date; 6.import java.util.HashMap; 7.import java.util.LinkedHashSet; 8.import java.util.List; 9.import java.util.Map; 10.import java.util.Set; 11. 12.import org.apache.struts2.ServletActionContext; 13. 14.import com.opensymphony.xwork2.ActionContext; 15.import com.opensymphony.xwork2.ActionSupport; 16. 17.public class OGNLAction extends ActionSupport { 18. private static final long serialVersionUID = -2554018432709689579L; 19. private String loginname; 20. private String pwd; 21. private User user; 22. private Set 23. private List 24. private Map 25. private List 26. 27. 28. public String execute() throws Exception{ 29. this.loginname = "xkkkkkkkkkkkkkkkkkkkkkkkk"; 30. this.user = new User(123, "wrr", 88.9, true, 'B', new Date()); 31. this.courseSet = new LinkedHashSet 32. this.courseSet.add("corejava"); 33. this.courseSet.add("JSP/Servlet"); 34. this.courseSet.add("S2SH"); 35. 36. this.list = new ArrayList 37. this.map = new HashMap 38. this.map.put("x", "xxx"); 39. this.map.put("y", "yyy"); 40. this.map.put("z", "zzz"); 41. 42. 43. ActionContext context = ActionContext.getContext(); 44. context.put("uname", "cheney"); 45. context.put("inte", Integer.valueOf(888888)); 46. context.put("user2", new User(123, "xxk", 88.9, true, 'B', new Date())); 47. 48. 49. this.userList = new ArrayList 50. this.userList.add(new User(1, "zs", 48.9, true, 'D', new Date())); 51. this.userList.add(new User(2, "ls", 68.1, true, 'C', new Date())); 52. this.userList.add(new User(3, "ww", 78.2, false, 'B', new Date())); 53. this.userList.add(new User(4, "zl", 88.3, true, 'A', new Date())); 54. 55. //----------------------------------------------------------------- 56. //推荐方式: 不会跟Servlet API耦合 57. context.put("reqAtt", "往ActionContext中put的属性"); 58. context.getSession().put("sesAtt", "往ActionContext.getSession()中put的属性"); 59. context.getApplication().put("appAtt", "往ActionContext.getApplication()中put的属性"); 60. 61. ServletActionContext.getRequest().setAttribute("reqAtt2", "Request作用域中的属性"); 62. ServletActionContext.getRequest().getSession().setAttribute("sesAtt2", "Session作用域中的属性"); 63. ServletActionContext.getServletContext().setAttribute("appAtt2", "Application作用域中的属性"); 64. 65. return SUCCESS; 66. } 67. 68. 69. public String getAppName(){ 70. return "这是OGNL的使用示例代码"; 71. } 72. 73. public String getLoginname() { 74. return loginname; 75. } 76. public void setLoginname(String loginname) { 77. this.loginname = loginname; 78. } 79. public String getPwd() { 80. return pwd; 81. } 82. public void setPwd(String pwd) { 83. this.pwd = pwd; 84. } 85. 86. public User getUser() { 87. return user; 88. } 89. 90. public void setUser(User user) { 91. this.user = user; 92. } 93. 94. public Set 95. return courseSet; 96. } 97. 98. public void setCourseSet(Set
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OGNL Struts2 中的 应用