OGNL和Struts2中的标签

一、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}" />也可以使用,但不会这么用。
-->
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值