`
everlxq
  • 浏览: 111864 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

s标签以及ognl

 
阅读更多
s:debug

我们可以看到.它提供的是Struts ValueStack Debug ..也就是说,都是struts2的值栈(就是各个值的信息)..

这个值栈又分为两种.Value Stack Contents 和 Stack Context .

(1).Value Stack Contents 里面的信息我们可以用 <s:property value="sss"> 这样来直接访问.

(2) Stack Context  里面的信息我们可以 <s:property value="#sss">这样来访问






ognl


OGNL表达式struts2标签“%,#,$”
一、什么是OGNL,有什么特点?   
  
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:    
  
1、支持对象方法调用,形式如:objName.methodName();   
  
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 |  值名],例如:   
  
@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;   
  
3、支持赋值操作和表达式串联,例如:   
  
price=100, discount=0.8, calculatePrice(),这个表达式会返回80;   
  
4、访问OGNL上下文(OGNL context)和ActionContext;   
  
5、操作集合对象。   
  
    
  
二、使用OGNL表达式   
  
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。   
  
1、“#”符号有三种用途:   
  
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:   
  
    
  
名称   
 作用   
 例子   
    
parameters   
 包含当前HTTP请求参数的Map   
 #parameters.id[0]作用相当于request.getParameter("id")    
    
request   
 包含当前HttpServletRequest的属性(attribute)的Map   
 #request.userName相当于request.getAttribute("userName")    
    
session   
 包含当前HttpSession的属性(attribute)的Map   
 #session.userName相当于session.getAttribute("userName")    
    
application   
 包含当前应用的ServletContext的属性(attribute)的Map   
 #application.userName相当于application.getAttribute("userName")    
    
  
注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。   
  
    
  
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}     
  
  
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}     
  
#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:    
  
<s:property value="#myMap['foo1']"/>     
  

2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。  

这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :  
 
var oDiv = eval_r("document.all.div"+index)     
  
  
当index变量为1时,语句就会被当作var oDiv = document.all.div1  var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:    
  
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      
  
<s:property value="#myMap['key1']"/>      
  
<s:url value="#myMap['key1']" />    
  
  
上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:    
    
  
<s:url value="%{#myMap['key1']}"/>   
  
则输出为“value1”。   
  
    
  
 
  
 
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。  
 
3、“$”有两种用途   
  
(1)、在国际化资源文件中,引用OGNL表达式。   
  
(2)、在Struts 2配置文件中,引用OGNL表达式:    
  
<action name="saveUser" class="userAction" method="save">   
  
<result type="redirect">listUser.action?msg=${msg}</result>   
  
</action>   
  
----------------------------------

值栈(ValueStack) :
可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 
调用ActionContext的put(key,value)放入的数据,需要使用#访问。
OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号
#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

—    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。



例子

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>    
    
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">    
    
<html xmlns="http://www.w3.org/1999/xhtml">    
    
<head>    
    
    <title>Struts2 OGNL 演示</title>    
    
</head>    
    
<body>        
    
    <h3>访问OGNL上下文和Action上下文</h3>    
    
    <!-使用OGNL访问属性值-->    
    
    <p>parameters: <s:property value="#parameters.msg" /></p>    
    
    <p>request.msg: <s:property value="#request.msg" /></p>    
    
    <p>session.msg: <s:property value="#session.msg" /></p>    
    
    <p>application.msg: <s:property value="#application.msg" /></p>    
    
    <p>attr.msg: <s:property value="#attr.msg" /></p>    
    
    <hr />    
    
    <h3>用于过滤和投影(projecting)集合</h3>    
    
    <p>年龄大于20</p>    
    
    <ul>    
    
    <!-判断年龄-->    
    
        <s:iterator value="persons.{?#this.age>20}">    
    
            <li><s:property value="name" /> - 年龄:<s:property value="age" /></li>    
    
        </s:iterator>    
    
    </ul>    
    
    <p>姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]"/></p>    
    
    <hr />    
    
    <h3>构造Map</h3>    
    
    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    
    
    <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>    
      
    <hr />   
      
    <h4>%符号的用法</h4>    
    
    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    
    
    <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>    
    
    <p>不使用%:<s:url value="#foobar['foo1']" /></p>    
    
    <p>使用%:<s:url value="%{#foobar['foo1']}" /></p>    
    
    <hr />  
        <%    
            request.setAttribute("req", "request scope");    
            request.getSession().setAttribute("sess", "session scope");    
            request.getSession().getServletContext().setAttribute("app",    
                    "aplication scope");    
        %>    
        1.通过ognl表达式获取 属性范围中的值    
        <br>    
        <s:property value="#request.req" />    
        <br />    
        <s:property value="#session.sess" />    
        <br />    
        <s:property value="#application.app" />    
        <br />    
        <hr>    
    
       2.通过<span style="background-color: #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值    
        <br>    
        <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>    
        <s:iterator value="#list" var="o">    
            <!-- ${o }<br/> -->    
            <s:property />    
            <br />    
        </s:iterator>    
        <br />    
        <hr>    
    
       3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值    
        <br>    
        <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" />    
            <br />    
        </s:iterator>    
        <br />    
        <hr>    
      4.通过ognl表达式 进行逻辑判断    
        <br>    
        <s:if test="'aa' in {'aaa','bbb'}">    
            aa 在 集合{'aaa','bbb'}中;    
        </s:if>    
        <s:else>    
            aa 不在 集合{'aaa','bbb'}中;    
        </s:else>    
        <br />    
        <s:if test="#request.req not in #list">    
                不 在 集合list中;    
        </s:if>    
        <s:else>    
             在 集合list中;    
        </s:else>    
        <br />    
        <hr>    
          
       5.通过ognl表达式 的投影功能进行数据筛选    
        <br>    
        <s:set name="list1" value="{1,2,3,4,5}"></s:set>    
        <s:iterator value="#list1.{?#this>2}" var="o">    
            <!-- #list.{?#this>2}:在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->    
            ${o }<br />    
        </s:iterator>    
        <br />    
        <hr>    
       6.通过ognl表达式 访问某个类的静态方法和值    
        <br>    
        <s:property value="@java.lang.Math@floor(32.56)" />    
    
        <s:property value="@com.rao.struts2.action.OGNL1Action@aa" />    
        <br />    
        <br />    
        <hr>    
      7.ognl表达式 迭代标签 详细    
        <br>    
        <s:set name="list2"    
            value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>    
        <table border="1">    
            <tr>    
                <td>索引 </td>    
                <td>值</td>    
                <td>奇?</td>    
                <td> 偶?</td>    
                <td>首?</td>    
                <td> 尾?</td>    
                <td>当前迭代数量</td>    
            </tr>    
            <s:iterator value="#list2" var="o" status="s">    
                <tr bgcolor="<s:if test="#s.even">pink</s:if>">    
                    <td>    
                        <s:property value="#s.getIndex()" />    
                    </td>    
                    <td>    
                        <s:property />    
                    </td>    
                    <td>    
                        <s:if test="#s.odd">Y</s:if>    
                        <s:else>N</s:else>    
                    </td>    
                    <td>    
                        <s:if test="#s.even">Y</s:if>    
                        <s:else>N</s:else>    
                    </td>    
                    <td>    
                        <s:if test="#s.first">Y</s:if>    
                        <s:else>N</s:else>    
                    </td>    
                    <td>    
                        <s:if test="#s.isLast()">Y</s:if>    
                        <s:else>N</s:else>    
                    </td>    
                    <td>    
                    <s:property value="#s.getCount()"/>    
                </td>    
                </tr>    
            </s:iterator>    
        </table>    
        <br>    
        <hr>         
          
          
       8.ognl表达式:  if/else if/else 详细<br>    
        <% request.setAttribute("aa",0); %>    
        <s:if test="#request.aa>=0 && #request.aa<=4">    
                在0-4之间;    
        </s:if>    
        <s:elseif test="#request.aa>=4 && #request.aa<=8">    
                在4-8之间;    
        </s:elseif>    
        <s:else>    
             大于8;    
        </s:else>    
        <br>    
        <hr>    
    9.ognl表达式: url 详细<br>    
        <% request.setAttribute("aa","sss"); %>    
        <s:url action="testAction" namespace="/aa/bb">    
            <s:param name="aa" value="#request.aa"></s:param>    
            <s:param name="id">100</s:param>    
        </s:url>    
        <br/>    
        <s:set name="myurl" value="'http://www.baidu.com'"></s:set>    
        value以字符处理:   <s:url value="#myurl"></s:url><br>    
        value明确指定以ognl表达式处理:    <s:url value="%{#myurl}"></s:url>    
        <br>    
        <hr>    
    10.ognl表达式: checkboxlist 详细<br>    
        1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    
        name:checkboxlist的名字<br>    
        list:checkboxlist要显示的列表<br>    
        value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    
        <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>    
        <br>    
         以上生成代码:<br>    
        <xmp>    
            <input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/>    
            <label for="checkbox1-1" class="checkboxLabel">上网</label>    
            <input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/>    
            <label for="checkbox1-2" class="checkboxLabel">看书</label>    
            <input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/>    
            <label for="checkbox1-3" class="checkboxLabel">爬山</label>    
            <input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/>    
            <label for="checkbox1-4" class="checkboxLabel">游泳</label>    
            <input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/>    
            <label for="checkbox1-5" class="checkboxLabel">唱歌</label>"    
        </xmp>    
        2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    
        name:checkboxlist的名字<br>    
        list:checkboxlist要显示的列表<br>    
        listKey:checkbox 的value的值<br>    
        listValue:checkbox 的lablel(显示的值)<br>    
        value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    
        <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>    
        <br>    
                       以上生成代码:<br>    
        <xmp>    
            <input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/>    
            <label for="checkbox2-1" class="checkboxLabel">上网</label>    
            <input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/>    
            <label for="checkbox2-2" class="checkboxLabel">看书</label>    
            <input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/>    
            <label for="checkbox2-3" class="checkboxLabel">爬山</label>    
            <input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/>    
            <label for="checkbox2-4" class="checkboxLabel">游泳</label>    
            <input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/>    
            <label for="checkbox2-5" class="checkboxLabel">唱歌</label>    
        </xmp>    
        <hr>    
</body>    
</html>    


Syntax for list: {e1,e2,e3}. This idiom creates a List containing the String "name1", "name2" and "name3". It also selects "name2" as the default value.

<s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" />
Syntax for map: #{key1:value1,key2:value2}. This idiom creates a map that maps the string "foo" to the string "foovalue" and "bar" to the string "barvalue":

<s:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" />
To determine if an element exists in a Collection, use the operations in and not in.

<s:if test="'foo' in {'foo','bar'}">
   muhahaha
</s:if>
<s:else>
   boo
</s:else>

<s:if test="'foo' not in {'foo','bar'}">
   muhahaha
</s:if>
<s:else>
   boo
</s:else>
分享到:
评论

相关推荐

    struct及其struct2.0标签(OGNL)讲解,有实例

    本教程将深入讲解Struts2中的一个重要概念——`struct`及其升级版`struct2.0`,同时会涉及到OGNL(Object-Graph Navigation Language)以及Struts2中的标签库。 首先,`struct`是Struts2框架的基础组成部分,它是...

    struts标签和ognl语法

    3. **`&lt;s:if&gt;`、`&lt;s:elseif&gt;` 和 `&lt;s:else&gt;`**:这些标签提供了条件逻辑,用于根据 OGNL 表达式的值来决定是否渲染某些内容。例如,`&lt;s:if test=" "&gt;...&lt;/s:if&gt;` 会检查表达式的结果,如果为真则执行其中的代码。 4...

    ognl标签的使用案例

    - `&lt;s:if&gt;`和`&lt;s:else&gt;`:这些标签允许基于OGNL表达式的条件逻辑。例如,`&lt;s:if test="%{user.age &gt; 18}"&gt;成年人&lt;/s:if&gt;&lt;s:else&gt;未成年人&lt;/s:else&gt;`。 **4. OGNL表达式** OGNL表达式可以包含点号(.)来访问对象的...

    struts2标签和OGNL表达式

    在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`&lt;s:property value="name"/&gt;`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...

    java的Struts中的OGNL标签的使用,详细介绍

    首先,OGNL标签通常嵌入在JSP的Struts2标签库中,如`s:property`和`s:set`。`s:property`标签用于显示对象的属性值,例如: ```jsp &lt;s:property value="%{user.name}" /&gt; ``` 这里,`user`是Action类的一个属性,`...

    struts2标签和OGNL表达式.pdf

    例如,&lt;s:set&gt;标签用于设置OGNL上下文中的值,&lt;s:iterator&gt;标签用于遍历列表或映射中的元素。通过OGNL表达式可以实现对集合的遍历、筛选和排序操作。 在OGNL表达式中,可以使用各种操作符,如in和notin来判断元素...

    OGNL学习笔记,包含struts2中ognl的各种用法

    在示例代码中,`&lt;s:property&gt;`标签使用OGNL表达式`#request.req`、`#session.sess`和`#application.app`分别获取了Request、Session和Application范围内的属性值。这展示了OGNL如何灵活地访问不同级别的数据。 其次...

    OGNL访问OGNL上下文和Action上下文Struts2rarfdsafsdfasdfas

    通过阅读`Struts#.txt`文件,我们可以深入学习Struts2框架下OGNL的使用方法和技巧,了解如何有效地利用OGNL上下文和Action上下文来操纵数据,以及如何在JSP页面中使用OGNL标签进行数据展示和控制流。这将有助于提升...

    ognl(关于标签strusts2)

    - OGNL在Struts2标签中的应用,如`&lt;s:property&gt;`、`&lt;s:if&gt;`、`&lt;s:set&gt;`等。 - 安全性考虑,如何避免OGNL注入攻击。 - 实战练习,通过编写Struts2应用来实践OGNL的使用。 在深入研究Struts2和OGNL时,可以查看`...

    struts2 OGNL之&lt;s:property&gt;标签访问值栈(value stack)用法

    在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`&lt;s:property&gt;`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...

    ognl图形导航语言

    在使用OGNL表达式时,尤其是在Struts2的标签中,需要特别注意`#`、`%`这两个符号的使用。`#`符号有三个主要用途: 1. 访问非根对象,如OGNL上下文和Action上下文,`#`常用于访问ActionContext中的各种上下文属性。 ...

    OGNL符号的使用

    在 Struts2 中,OGNL 表达式需要结合 Struts 标签来使用。其中,“%”、“#”、“$”这三个符号的使用非常重要。 “#”符号有三种用途: 1. 访问非根对象(Struts 中值栈为根对象),例如:#parameters.id[0] 相当...

    s20505_valueStack_OGNL

    在给定的压缩包文件“s20505_valueStack_OGNL”中,我们关注的核心知识点是Struts2中的OGNL(Object-Graph Navigation Language)和相关标签的使用。OGNL是Struts2默认的表达式语言,用于在视图层和控制器层之间传递...

    使用的ognl的chm

    4. **JSP标签**:Struts2的JSP标签库支持使用OGNL表达式来动态地获取和显示数据。 **在Hibernate中的应用:** 1. **查询构造**:虽然Hibernate主要使用HQL或 Criteria API,但OGNL可以在某些场景下用于构建复杂的...

    struts2中的ognl

    使用OGNL时,通常配合Struts2的标签,比如`s:property`,通过值栈来访问和显示数据。 3. **EL与值栈的区别**: - Expression Language(EL)虽然也能访问值栈,但它只能从栈顶开始查找,而OGNL可以更灵活地遍历...

    Struts2_OGNL

    例如,使用&lt;s:property&gt;标签可以输出Action中的属性值,如示例代码中的`username=&lt;s:property value="username"/&gt;`和`password=&lt;s:property value="password"/&gt;`。 为了实现一个基于OGNL的登录系统,可以遵循以下...

    struts2 OGNL 表达式及各种标签的使用

    本文将深入探讨OGNL的基本用法、标签的使用以及其在Struts2中的实际应用。 1. **OGNL基本概念** - OGNL是一种表达式语言,用于获取和设置对象属性。它支持点号和索引访问、方法调用、运算符、集合操作等。 - 例如...

    ognl表达式案例

    标签库还包括其他有用的标签,如`&lt;s:set&gt;`用于设置变量,`&lt;s:if&gt;`和`&lt;s:else&gt;`进行条件判断,以及`&lt;s:iterate&gt;`用于迭代集合。这些标签大大简化了JSP页面的逻辑,使代码更清晰,更易于维护。 下面是一些OGNL表达式...

    OGNL表达式

    OGNL表达式通常结合Struts2的标签一起使用,比如使用 `&lt;s:property value="expression"/&gt;` 来展示数据。在使用过程中,需要注意#、%和$这三个符号的正确使用: - **#**:通常用于表示OGNL表达式,在Struts2中作为...

    OGNL百度百科OGNL百度百科

    - Struts2 使用 OGNL 作为默认的表达式语言,并提供了丰富的标签库,例如 `&lt;s:property value="name"/&gt;` 可以用来显示 `name` 属性的值。 #### 三、OGNL 的实现原理 OGNL 实现的核心是 Context 结构,其实质是一个...

Global site tag (gtag.js) - Google Analytics