一、OGNL简介
1、什么是OGNL:
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言
2、OGNL表达式:
(1)OGNL表达式必须写在struts2的标签中
(2)s:property它就类似于jsp的表达式,把值输出到浏览器上。value属性中的内容不再是我们看到的字符串,它是一个OGNL表达式。如果想让它变成一个普通的字符串,在值外面套上单引号
<s:property value="OGNL-Expression"/> 这是一个OGNL表达式<br/>
<s:property value="'OGNL-Expression'"/>这是一个普通的字符串<br/>
3、OGNL的功能:
(1)前提:OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库
<%@ taglib prefix="s" uri="/struts-tags" %>
(2)支持普通方法的调用(EL表达式只能调用静态方法)
<%--使用普通字符串调用了获取长度的方法--%>
<s:property value="'OGNL-Expression'.length()"/>
(3)访问静态成员(静态属性,静态方法)
<%--struts2默认是禁止访问静态方法,因此在struts.xml文件中开启--%>
<!-- 开启静态方法调用 -->
<constant name="struts.ognl.allowStaticMethodAccess"value="true"></constant>
<!--访问静态属性方式:@全类名@静态属性名称-->
<!--输出int类型的最大数常量-->
<s:property value="@java.lang.Integer@MAX_VALUE" /><br/>
<!--访问静态方法方式:@全类名@静态方法名-->
<!--输出一个小于1的随机数-->
<s:property value="@java.lang.Math@random()" />
(4)操作集合对象
a、创建List对象:使用的是s:radio的标签,创建list集合;{}就相当于创建了一个list集合;list属性中的取值是一个OGNL表达式
<s:radio name="gender" list="{'男','女'}"></s:radio><br/>
b、创建Map对象:使用s:radio创建一个map ;#{}表示创建一个map;1和0作为value给raido标签的value属性赋值;男和女作为key,显示到页面的内容
<s:radio name="gender1" list="#{'1':'男','0':'女'}" />
4、OGNL投影:
(1)”?#”:过滤所有符合条件的集合,如:users.{?#this.age > 19}
(2)”^#”:过滤第一个符合条件的元素,如:users.{^#this.age > 19}
(3)”(美元符)#”:过滤最后一个符合条件的元素,如:users.{$#this.age > 19}
二、struts2的迭代标签:iterator
(1)属性详解1:begin,end,step和jstl的forEach是一样的,表示开始,结束,步长;value属性:要遍历的集合,是OGNL表达式
(2)属性详解2:var属性:取值就是一个字符串,不是OGNL表达式;如果写了该属性:把var的值当成key,把当前遍历的元素作为value,存入到ActionContext这个大Map中;如果没有写该属性:把当前遍历的元素压入栈顶
(3)属性详解3:status属性:
int getIndex() 获取索引(从0开始);
int getCount() 统计个数(从1开始);
boolean isFirst() 是否为第一个元素
boolean isLast() 是否为最后一个元素
boolean isOdd() 是否为奇数
boolean isEven() 是否是偶数
(4)例子:动作类代码
public class Demo4Action extends ActionSupport {
private static final long serialVersionUID = 1L;
//要生成set和get方法,OGNL表达式是通过get来取数据的
List<Student> students;
public String action4(){
students=new ArrayList<Student>();
students.add(new Student("张三",23));
students.add(new Student("李四",24));
students.add(new Student("王五",25));
return SUCCESS;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
(5)例子:jsp代码
<!-- 使用var-->
<s:iterator value="students" var="s" status="vs">
<tr>
<td><s:property value="#vs.count"/></td>
<td><s:property value="#s.name"/></td>
<td><s:property value="#s.age"/></td>
</tr>
<br/>
</s:iterator>
<!-- 没有使用var,元素在栈顶(ValueStack)不需要加# -->
<s:iterator value="students" status="s">
<tr>
<td><s:property value="#s.count"/></td>
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
<br/>
</s:iterator>
(6)例子:struts.xml配置代码
<action name="action4" class="com.san.action.Demo4Action" method="action4">
<result name="success">/demo4.jsp</result>
</action>
三、struts2的其他标签
(1)s:set标签
a、value属性:取值是一个OGNL表达式。
b、var属性:是一个普通的字符串;它是把value属性的值(加”作为字符串,否则是OGNL)作为value,把var属性的值作为key,存入到ActionContext的大map中
<s:set value="'test'" var="str1"/>
<!--取值显示-->
<s:property value="str1"/>
<br/>
(2)s:action标签
a、name属性:是指定一个action动作名称。允许开发者直接调用action
b、executeResult属性:是否执行action;默认取值为false
c、id属性:引用该action的标识
d、namespace属性:调用该action所在的命名空间
<!--相当于调用action-->
<s:action name="action3" executeResult="true" />
(3)s:if s:elseif s:else条件判断标签
<!--test中去set的值判断:test="#grade=='aaa'"-->
<s:set value="'aaa'" var="grade"/>
<s:if test="#grade=='aaa'">这是aaa</s:if>
<s:elseif test="#grade=='bbb'">这是bbb</s:elseif>
<s:else>其他情况</s:else>
(4)s:url标签
a、value属性:是把值直接输出到页面上
b、action属性:是把动作的请求地址输出到页面
c、var属性:把action的取值作为value,把var的取值作为key,放到ActionContext中
<!--url标签:-->
<s:url value="action3"/>
<br/>
<!--使用param注意:
把name作为key,把value作为value值,绑定到请求连接地址后面。
相当于get方式拼接请求参数。name:是一个普通的字符串;
value:OGNL表达式,加''转化为字符串使用
-->
<s:url value="action3" var="urltest">
<s:param name="name" value="'zhangsan'"/>
</s:url>
<!--使用该url-->
<a href="<s:property value='#urltest' />" >点击 s:url</a>
四、struts2中#,$,%符号的使用
(1)#符号
a、取contextMap中key时使用
<s:property value="#name" />
b、OGNL中创建Map对象时使用
<s:radio list="#{'male':'男','female':'女'}" />
(2)(美元符)符号:
<!--
a、在JSP中使用EL表达式时使用,例如${name}
b、在xml配置文件中,编写OGNL表达式时使用,例如文件下载时,文件名编码。
struts.xml——>${@java.net.URLEncoder.encode(filename)}
-->
(3)%符号
在struts2中,有些标签的value属性取值就是一个OGNL表达式,例如
<s:property value="OGNL Expression" />
还有一部分标签,value属性的取值就是普通字 符串,例如
<s:textfield value="username"/>
如果想把一个普通的字符串强制看成时OGNL,就需要使用%{}把字符串套起来。例如:
<s:textfield value="%{username}"/>
<!--
当然在<s:property value="%{OGNL Expression}" />也可以使用,但不会这么用。
-->