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发了这篇博客,希望能对大家有帮助。

 

 

0 1