您的位置:首页 > 编程语言 > Java开发

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)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可



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