Struts2之初识ognl
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.页面取值区别:
名称 | servlet | ognl | el |
---|---|---|---|
parameters | request.getParameter(“username”) | #username | ${username} |
request | request.getAttribute(“userName”) | #request.userName | ${requestScope.username} |
session | session.getAttribute(“userName”) | #session.userName | ${sessionScope.username} |
application | application.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的结构图
小编刚刚出道,有什么写的不对的地方就指出来,大家一起进步。有喜欢的就点亮一下旁边的小红心吧,给小编的一个支持。。。错别字就算了,小编拼音不好!!!