Struts2之OGNL
2016-03-30 16:56
330 查看
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)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
![](https://img-blog.csdn.net/20160330164746778?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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顺序访问其属性。
至于关于struts的标签库,因为网上资料都还不错,就没有整理了。
作者注:好久没使用struts2了,最近要准备面试,忘得有点多了。但是网上的资料很混乱,于是自己结合着http://blog.csdn.net/tjcyjd/article/details/6850203以及之前自学的传智播客的关于Struts2教程的PPT发了这篇博客,希望能对大家有帮助。
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 jquery 打造无限层次的树
- 使用struts2+Ajax+jquery验证用户名是否已被注册
- struts2入门Demo示例
- 通过Ajax两种方式讲解Struts2接收数组表单的方法
- Struts2+Hibernate实现数据分页的方法
- ajax交互Struts2的action(客户端/服务器端)
- struts2 spring整合fieldError问题
- Struts2的s:radio标签使用及用jquery添加change事件
- 使用MyEclipse 开发struts2框架实现登录功能(结构教程)
- struts2 中文乱码的解决办法分享
- Struts2访问servlet分享
- struts2单个文件上传的两种实现方式
- 通过实例深入学习Java的Struts框架中的OGNL表达式使用
- struts2+jsp实现文件上传的方法
- struts2+jquery实现ajax登陆实例详解
- struts2中一个表单中提交多个请求的例子(多个提交按钮)
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- Java(基于Struts2) 分页实现代码
- 从搭建Struts2 开发环境说起