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

  • 相关阅读:
    梦断代码阅读笔记之二
    《需求工程——软件建模与分析》阅读笔记之四
    阿里云HttpDns接入
    Android电量优化-Battery Historian环境搭建及简单使用
    Crash监控的简单实现方案
    Flutter——比RichText更好用的富文本
    用终端命令行工具iTerm创建flutter项目
    Flutter——打包到TestFlight和安卓
    Flutter——数组以符号隔开转字符串
    某信反反越狱
  • 原文地址:https://www.cnblogs.com/nayitian/p/3467441.html
Copyright © 2011-2022 走看看