Struts2之OGNL
来源:互联网 发布:jsp java获取js变量 编辑:程序博客网 时间:2024/06/05 05:48
OGNL:Object-Graph Navigation Language是一个用来获取 和设置 java对象属性的表达式语言。
OGNL Context:
OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象ValueStack。在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图
访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session。另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
ValueStack的结构:
在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象
|--request
|--application
Context -----|--OgnlValueStack root变量[action, OgnlUtil, ... ]
|--session
|--attr
|--parameters
在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action 。然后把action存放进ValueStack(Struts2总是把当前Action实例放置在栈顶),所以action的实例变量可以被OGNL访问。
使用OGNL表达式:(实例)(尤其注意attr!!)
如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。
application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContext的getAttribute("username")。
session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。
request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。
parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。
attr对象:用于按page->request->session->application顺序访问其属性。
public class OgnlAction extends ActionSupport { private static final long serialVersionUID = -1494290883433357310L; private List<Person> persons; @Action("ognlTest") public String ognlTest() throws Exception { // 获得ActionContext实例,以便访问Servlet API ActionContext ctx = ActionContext.getContext(); // 存入application ctx.getApplication().put("msg", "application信息"); // 保存session ctx.getSession().put("msg", "seesion信息"); // 保存request信息 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("msg", "request信息"); // 为persons赋值 persons = new LinkedList<Person>(); Person person1 = new Person(); person1.setName("pla1"); person1.setAge(26); person1.setBirthday(new Date()); persons.add(person1); Person person2 = new Person(); person2.setName("pla2"); person2.setAge(36); person2.setBirthday(new Date()); persons.add(person2); Person person3 = new Person(); person3.setName("pla3"); person3.setAge(16); person3.setBirthday(new Date()); persons.add(person3); return SUCCESS; } public List<Person> getPersons() { return persons; } public void setPersons(List<Person> persons) { this.persons = persons; } }jsp页面:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Struts2 OGNL 演示</title> </head> <body> <h3>访问OGNL上下文和Action上下文</h3> <!-使用OGNL访问属性值--> <p>parameters: <s:property value="#parameters.msg" /></p> <p>request.msg: <s:property value="#request.msg" /></p> <p>session.msg: <s:property value="#session.msg" /></p> <p>application.msg: <s:property value="#application.msg" /></p> <p>attr.msg: <s:property value="#attr.msg" /></p> <hr /> <h3>用于过滤和投影(projecting)集合</h3> <p>年龄大于20</p> <ul> <!-判断年龄--> <s:iterator value="persons.{?#this.age>20}"> <li><s:property value="name" /> - 年龄:<s:property value="age" /></li> </s:iterator> </ul> <p>姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]"/></p> </body></html>
至于关于struts的标签库,因为网上资料都还不错,就没有整理了。
作者注:好久没使用struts2了,最近要准备面试,忘得有点多了。但是网上的资料很混乱,于是自己结合着http://blog.csdn.net/tjcyjd/article/details/6850203以及之前自学的传智播客的关于Struts2教程的PPT发了这篇博客,希望能对大家有帮助。
- struts2之OGNL
- Struts2之Ognl用法
- 八、Struts2之OGNL
- struts2之ognl表达式
- Struts2之ognl
- Struts2之OGNL
- struts2.x之OGNL
- struts2之OGNL
- Struts2之Ognl详解
- struts2之OGNL表达式
- Struts2之OGNL
- struts2之ognl表达式
- struts2之OGNL表达式
- 传智播客--struts2.x之OGNL
- struts2总结之 OGNL表达式
- Struts2之OGNL使用小结
- 【struts2学习之OGNL详解】
- Struts2复习之OGNL(1)
- ssh免密码登陆
- 图的存储与遍历
- Radial Sets系列文章
- Device Tree(二):基本概念
- 卢卡斯莱默检验法检验梅森素数
- Struts2之OGNL
- WebServices
- 使用UIcollectionView实现图片轮播
- Matlab绘图-很详细,很全面
- Java解析HTML之HTMLParser使用与详解
- LeakCanary检测安卓内存泄漏
- Eclipse 常用插件在线安装地址
- 简析Spring MVC 数据解析
- STL 初学