zoukankan      html  css  js  c++  java
  • struts2:OGNL表达式之#、%、$符号运用

    1. OGNL表达达符号"#"

    1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()

    注意:当系统创建了Action实例后,被保存到Value Stack中,无需书写“#“符号即可访问Action的属性:

    另外,struts提供了一些命名对象,这些对象与根对象无关它们只是存在于Stack Context中。访问这些对象需要“#“符号指明:

    说明:

    • parameters对象:用于访问HTTP请求参数。例如:#parameters.username、#parameters['username'],等同于:request.getParameter("username")。
    • request对象:用于访问HttpServletReques对象的属性。例如:#request.foo、#request['foo'],等同于:request.getAttribute("foo")。
    • session对象:用于访问HttpSession对象的属性。例如:#session.foo、#session['foo']、等同于:session.getAttribute("foo")。
    • application对象:用于访问ServletContext对象的属性。例如:#application.foo、#application['foo'],等同于调用ServletContext的getAttribute("foo")。
    • attr对象:用于按request -> session -> application顺序访问其属性(attribute)。例如:#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。

    1.2 用于过滤和投影(projecting)集合

    • ?——所有匹配选择逻辑的元素
    • ^——只提取符合选择逻辑的第一个元素
    • $——只提取符合选择逻辑的最后一个元素

    例如,通过ognl表达式的投影功能进行数据筛选,数据生成:

    <%
        List<Student> listStudent = new ArrayList<Student>();
        listStudent.add(new Student(1, "张三", new Date()));
        listStudent.add(new Student(2, "李四", new Date()));
        listStudent.add(new Student(3, "赵五", new Date()));
        listStudent.add(new Student(4, "孙六", new Date()));
        listStudent.add(new Student(5, "钱七", new Date()));
        pageContext.setAttribute("listStudent", listStudent);
    %>

    数据使用:

        <br>
        <s:iterator value="#attr.listStudent.{?#this.id % 2 != 0}" var="cur">
            <s:property value="#cur.username"/>
        </s:iterator>
        <br/>
        <s:iterator value="#attr.listStudent.{^#this.id % 2 != 0}" var="cur">
            <s:property value="#cur.username"/>
        </s:iterator>
        <br/>
        <s:iterator value="#attr.listStudent.{$#this.id % 2 != 0}" var="cur">
            <s:property value="#cur.username"/>
        </s:iterator>
        <br/>
        <s:property value="#attr.listStudent.{username}[0]"/>
        <br/>
        <s:property value="#attr.listStudent.{$#this.id == 3}.{username}[0]"/>

    输出为:

    张三  赵五   钱七    
    张三      
    钱七      
    张三  
    赵五 

    1.3 构造Map

    例如:通过ognl表达式创建Map集合,并且遍历出集合中的值

        <s:set name="map"
            value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>
        <s:iterator value="#map" var="o">
            ${o.key }->${o.value }<br/>
            <!--    <s:property value="#o.key"/>-><s:property value="#o.value"/><br/>   -->
            <!--    <s:property value="key" />-><s:property value="value" /> -->
        </s:iterator>

    输出为:

    1->eeeee
    2->ddddd
    3->ccccc
    4->bbbbb
    5->aaaaa

    2. %的用法

    struts2中“%{}”符号的作用是指出其内部是一个ognl表达式。例如:

    <s:textfield lable="user" name="user" value="%{#session.user}" />

    不过有些标签默认认定,整个字符串就是一个表达式,所以不用%{} ,例如:

    <s:property value="#session.user" />

    在非struts2标签中,是不能用%{}的,但是可以使用EL表达式,例如:

    <input name="user" value="${session.user}" />
    // 下面是嵌套用法
    <input name="user" value="<s:property value='#session.user' />" />

    注意:不能在struts2标签中的字符串中,再次嵌套struts2标签;也不能在struts2标签中用EL表达式。例如:

    // 错误一
    <s:textfield lable="user" name="user" value="<s:property value='#session.user' />" /> 
    // 错误二
    <s:textfield lable="user" name="user" value="${session.user}" />

    3. $的用法

    3.1 用于在国际化资源文件中,引用OGNL表达式

    参考:struts2:国际化

    3.2 在struts2配置文件中引用OGNL表达式 

    例如,早期的示范代码中,有如下片段:

            <action name="login" class="com.clzhang.ssh.demo1.LoginAction">
                <result name="input">/ssh/demo1/login.jsp</result>
                <result name="error">/ssh/demo1/wrong.jsp</result>
                <result name="list" type="redirectAction">
                    <param name="idInList">${id}</param>
                    <param name="actionName">listBook</param>
                </result>
            </action>

    本文参考:

    http://www.docin.com/p-339114913.html

    http://www.cnblogs.com/xly1208/archive/2011/11/19/2255500.html

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/nayitian/p/3467441.html
Copyright © 2011-2022 走看看