Struts2之初识ognl

1.ognl是什么?

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。

2.ognl的三大要素

1.表达式

表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次 OGNL 操作要做什么。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算。 要想使用OGNL表达式来输出数据,需要借助struts2的标签实现。

2.根对象root

Root对象可以理解为OGNL的操作对象,表达式规定了"做什么",而Root对象则规定了"对谁操作"。OGNL称为对象图导航语 言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。

3.context对象

实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作在哪里进行。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"# "号加上对象名称,即#"对象名称"的形式。
思维导图
在这里插入图片描述

3.ognl与El表达式的区别

1.ognl表达式

1:读取从后台传递的值
%{#name}:表示从值栈的map中取值
%{name}:表示从值栈的对象栈中取值
%{#request.name}:表示从request域中取值

2:自己构建数据
a,构建Map<s:iterator var=“map” value="#{‘key1’:‘value1’,‘key2’:‘value2’}"/>
b,构建List<s:iterator var=“list” value="{‘one’,‘two’,‘three’}">

2.El表达式

单纯在jsp页面中出现,是在四个作用域中取值,page,request,session,application.
如果在struts环境中,它除了有在上面的四个作用域的取值功能外,还能从值栈(valuestack)中取值.

特点1:${name},name在值栈中的查找顺序是:先从对象栈中取,取到终止,否则,向map中取。

特点2:在对象栈的查找顺序是,先从model中找是否有name这个属性,找到终止,否则,找action中>是否有name这个全局变量。

特点3:${#name},里面的是不带#号的。

特点4:如果放在对象栈中的是一个自定义的对象,那么 $ {property}里面可以直接去该对象的属性值,不用这样${object.property}

3.区别

a.用法区别:
ognl 是通常要结合Struts 2的标志一起使用,如<s:property value="#xx" /> struts页面中不能单独使用,

el可以单独使用 ${sessionScope.username}

b.页面取值区别:

名称servletognlel
parametersrequest.getParameter(“username”)#username${username}
requestrequest.getAttribute(“userName”)#request.userName${requestScope.username}
sessionsession.getAttribute(“userName”)#session.userName${sessionScope.username}
applicationapplication.getAttribute(“userName”)#application.userName${applicationScope.username}
attr用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为

4.演示

jsp界面代码

<body>	
	<a href="${pageContext.request.contextPath }/sy/demo_accept1.action?num1=20&&num2=5">一</a>
</body>

实体类

public class Cal { 
	private String num1;
	private String num2;
	public String getNum1() {
		return num1;
	}
	public void setNum1(String num1) {
		this.num1 = num1;
	}
	public String getNum2() {
		return num2;
	}
	public void setNum2(String num2) {
		this.num2 = num2;
	}
	@Override
	public String toString() {
		return "Cal [num1=" + num1 + ", num2=" + num2 + "]";
	}
}

后台

public class HelloAction implements ModelDriven<Cal>{
	
	private HttpServletRequest req;
	private String num1;
	private Cal cal1 = new Cal();

	public String getNum1() {
		return num1;
	}

	public void setNum1(String num1) {
		this.num1 = num1;
	}

	public String accept1() {
		System.out.println("cal2:"+num1);
		System.out.println("cal1:"+cal1);
		return "rs";
	}

	@Override
	public Cal getModel() {		
		return cal1;
	}
}

效果展示
在这里插入图片描述
这里的num1为什么没有值呢?这里就不得不提到它的ognl了,它的存储格式是堆债式,“先进后出”是它的标配,当他取到债顶时就不会取下面的值了,下面有一张图可以详细看到。。

在这里插入图片描述
下面再附赠一张Struts2的ognl的结构图

在这里插入图片描述

小编刚刚出道,有什么写的不对的地方就指出来,大家一起进步。有喜欢的就点亮一下旁边的小红心吧,给小编的一个支持。。。错别字就算了,小编拼音不好!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值