s标签以及ognl
s:debug
ognl
2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
例子
我们可以看到.它提供的是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>
相关推荐
本教程将深入讲解Struts2中的一个重要概念——`struct`及其升级版`struct2.0`,同时会涉及到OGNL(Object-Graph Navigation Language)以及Struts2中的标签库。 首先,`struct`是Struts2框架的基础组成部分,它是...
3. **`<s:if>`、`<s:elseif>` 和 `<s:else>`**:这些标签提供了条件逻辑,用于根据 OGNL 表达式的值来决定是否渲染某些内容。例如,`<s:if test=" ">...</s:if>` 会检查表达式的结果,如果为真则执行其中的代码。 4...
- `<s:if>`和`<s:else>`:这些标签允许基于OGNL表达式的条件逻辑。例如,`<s:if test="%{user.age > 18}">成年人</s:if><s:else>未成年人</s:else>`。 **4. OGNL表达式** OGNL表达式可以包含点号(.)来访问对象的...
在Struts2中,OGNL表达式通常与Struts标签结合使用,如`s:property`标签,用于显示对象的属性值。例如,`<s:property value="name"/>`将显示栈顶对象的"name"属性值。栈顶对象是指在ValueStack(值栈)中位于最顶层...
首先,OGNL标签通常嵌入在JSP的Struts2标签库中,如`s:property`和`s:set`。`s:property`标签用于显示对象的属性值,例如: ```jsp <s:property value="%{user.name}" /> ``` 这里,`user`是Action类的一个属性,`...
例如,<s:set>标签用于设置OGNL上下文中的值,<s:iterator>标签用于遍历列表或映射中的元素。通过OGNL表达式可以实现对集合的遍历、筛选和排序操作。 在OGNL表达式中,可以使用各种操作符,如in和notin来判断元素...
在示例代码中,`<s:property>`标签使用OGNL表达式`#request.req`、`#session.sess`和`#application.app`分别获取了Request、Session和Application范围内的属性值。这展示了OGNL如何灵活地访问不同级别的数据。 其次...
通过阅读`Struts#.txt`文件,我们可以深入学习Struts2框架下OGNL的使用方法和技巧,了解如何有效地利用OGNL上下文和Action上下文来操纵数据,以及如何在JSP页面中使用OGNL标签进行数据展示和控制流。这将有助于提升...
- OGNL在Struts2标签中的应用,如`<s:property>`、`<s:if>`、`<s:set>`等。 - 安全性考虑,如何避免OGNL注入攻击。 - 实战练习,通过编写Struts2应用来实践OGNL的使用。 在深入研究Struts2和OGNL时,可以查看`...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
在使用OGNL表达式时,尤其是在Struts2的标签中,需要特别注意`#`、`%`这两个符号的使用。`#`符号有三个主要用途: 1. 访问非根对象,如OGNL上下文和Action上下文,`#`常用于访问ActionContext中的各种上下文属性。 ...
在 Struts2 中,OGNL 表达式需要结合 Struts 标签来使用。其中,“%”、“#”、“$”这三个符号的使用非常重要。 “#”符号有三种用途: 1. 访问非根对象(Struts 中值栈为根对象),例如:#parameters.id[0] 相当...
在给定的压缩包文件“s20505_valueStack_OGNL”中,我们关注的核心知识点是Struts2中的OGNL(Object-Graph Navigation Language)和相关标签的使用。OGNL是Struts2默认的表达式语言,用于在视图层和控制器层之间传递...
4. **JSP标签**:Struts2的JSP标签库支持使用OGNL表达式来动态地获取和显示数据。 **在Hibernate中的应用:** 1. **查询构造**:虽然Hibernate主要使用HQL或 Criteria API,但OGNL可以在某些场景下用于构建复杂的...
使用OGNL时,通常配合Struts2的标签,比如`s:property`,通过值栈来访问和显示数据。 3. **EL与值栈的区别**: - Expression Language(EL)虽然也能访问值栈,但它只能从栈顶开始查找,而OGNL可以更灵活地遍历...
例如,使用<s:property>标签可以输出Action中的属性值,如示例代码中的`username=<s:property value="username"/>`和`password=<s:property value="password"/>`。 为了实现一个基于OGNL的登录系统,可以遵循以下...
本文将深入探讨OGNL的基本用法、标签的使用以及其在Struts2中的实际应用。 1. **OGNL基本概念** - OGNL是一种表达式语言,用于获取和设置对象属性。它支持点号和索引访问、方法调用、运算符、集合操作等。 - 例如...
标签库还包括其他有用的标签,如`<s:set>`用于设置变量,`<s:if>`和`<s:else>`进行条件判断,以及`<s:iterate>`用于迭代集合。这些标签大大简化了JSP页面的逻辑,使代码更清晰,更易于维护。 下面是一些OGNL表达式...
OGNL表达式通常结合Struts2的标签一起使用,比如使用 `<s:property value="expression"/>` 来展示数据。在使用过程中,需要注意#、%和$这三个符号的正确使用: - **#**:通常用于表示OGNL表达式,在Struts2中作为...
- Struts2 使用 OGNL 作为默认的表达式语言,并提供了丰富的标签库,例如 `<s:property value="name"/>` 可以用来显示 `name` 属性的值。 #### 三、OGNL 的实现原理 OGNL 实现的核心是 Context 结构,其实质是一个...