OGNL表达式语言(#号的用法)

  用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext()
    1、  如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

    

        也可写为#request[‘userName’]或#session[‘userName’]或#appliction[‘userName’]

   2 、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可

    

 Action中代码:
ValueStack valueStack=ServletActionContext.getContext().getValueStack();
valueStack.set("msg", "msg_xxx");
Jsp页面:
valueStack:<s:property value="msg"/><br>

 用法2:集合的投影(过滤)
    1、集合的投影(只输出部分属性)  
               collectionName.{ expression }

      

  

 <s:iterator value="#request.persons.{name}" var="person">
<s:property value="#person"/><br>
</s:iterator>

    2、集合的过滤
       1) 集合的过滤有以下三种方式:
           a.“?#”:过滤所有符合条件的集合,如:users.{?#this.age > 19};
           b.“^#”:过滤第一个符合条件的元素,如:users.{^#this.age > 19};
           c.“$#”:过滤最后一个符合条件的元素,如:users.{$#this.age > 19}
      2) this   表示集合中的元素;

  

 <s:iterator value="#request.persons.{?#this.age>24}" var="person">
<s:property value="#person"/><br>
</s:iterator>

   3、集合的投影和过滤
         投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]

 <s:iterator value="#request.persons.{?#this.age>24}.{name}" var="person">
<s:property value="#person"/><br>
</s:iterator>

  用法3:构造Map,如#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。

      这种方式常用在给radio或select、checkbox等标签赋值上

  

 jsp页面:
<s:radio list=“#{‘male’:‘男’,‘female’:‘女’}” name=“sex” label=“性别” />
运行结果是
<input type="radio" name="sex" id="sexmale" value="male"/>男
<input type="radio" name="sex" id="sexfemale" value="female"/>女
 Action中的代码:
Map map=new HashMap();
map.put("male", "男");
map.put("female", "女");
ServletActionContext.getRequest().setAttribute("map", map);
jsp页面:
<s:radio list="#request.map" name="sex" label="性别" />
运行结果是
<input type="radio" name="sex" id="sexfemale" value="female"/>女
<input type=“radio” name=“sex” id=“sexmale” value=“male”>男

OGNL表达式语言(%用法)

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

 形式一: { }中ognl表达式
Action中的代码:
ServletActionContext.getRequest().setAttribute("username", "username_request");
jsp页面:
<s:textfield name="name" label="%{#request.username} "/>
运行结果是
username_request : <input type="text" name="name" value="" id="name"/> 形式二: { }中值用 ’ ’引起来,这是不再是ogle表达式,而是普通的字符串
jsp页面:
<s:textfield name="name" label="%{'foo'}"/>
运行结果是
foo : <input type="text" name="name" value="" id="name"/>

OGNL表达式语言($用法)

  “$”有两个主要的用途
      *  用于在国际化资源文件中,引用OGNL表达式
      *  在Struts 2配置文件中,引用OGNL表达式

 在struts2配置文件中引用ognl表达式 ,引用request等作用域中的值
Action中的代码:
ServletActionContext.getRequest().setAttribute("msgxx", "msg_request");
struts.xml文件中
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${#request.msgxx}</result>
</action>
</package>
jsp页面:
parameters Msg:<s:property value="#parameters.msg[0]"/>
运行结果是
msg_request
 在struts2配置文件中引用ognl表达式 ,引用值栈的值
Action中的代码:
valueStack.set("msgxx", "msg_valueStack");
struts.xml文件中
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
</action>
</package>
jsp页面:
parameters Msg:<s:property value="#parameters.msg[0]"/>
运行结果是
msg_valueStack

OGNL标签

  property标签

    property标签用于输出指定值:
      <s:property value=“#name" default="a default value" />     
          * default: 可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
          *  escape:可选属性,指定是否格式化HTML代码。 escape=“false”时,hr作为html标签使用
          *  value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。

 

       <s:property  value="#request.username"/>:输出栈顶的值
输出: username=username_valueStack, msgxx=msg_valueStack <s:property value="#request.username111" default="default value"/>
<s:property value="%{'<hr> hr的使用'}" escape="false" />
输出:<hr> hr的使用
注:escape=“false”时,hr作为html标签使用

 set标签

  set标签用于将某个值放入指定范围。
        var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
        scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在action中。
          value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。

       <s:set value="#request.username"  var="xxx“ scope=“request” /><br>
<s:property value=“#request.xxx" /><br> <s:set value="#request.username" var="xxx" scope="page" /><br>
<s:property value="#attr.xxx" /><br> <s:set value="#request.username" var="xxx" /><br>
<s:property value="xxx" /><br>

push标签

push:将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。
     value:要push到堆栈中的值 。

<s:push value="#request.username">
<s:property/>
</s:push>
<br>
测试删除: <s:property/>

action标签
Action:通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action
       name:action名字(不包括后缀,如.action)
       namespace:action所在命名空间
       executeResult:Action的result是否需要被执行,默认值是false不执行

 <package name="ognl"   namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
</action>
</package> <s:action name="ognlAction_test" namespace="/ognl" executeResult="true" />

iterator标签

Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。

value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。

var:    可选属性,引用变量的名称.

status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:

int getCount(),返回当前迭代了几个元素。

int getIndex(),返回当前迭代元素的索引。

boolean isEven(),返回当前被迭代元素的索引是否是偶数

boolean isOdd(),返回当前被迭代元素的索引是否是奇数

boolean isFirst(),返回当前被迭代元素是否是第一个元素。

boolean isLast(),返回当前被迭代元素是否是最后一个元素。

<s:iterator value="%{#request.persons}" var="person">
<s:property value="#person"/><br>
</s:iterator>
<s:iterator value="%{#request.persons}" var="person">
<s:property value="#person.id"/>~<s:property value="#person.name"/>~<s:property value="#person.age"/>
</s:iterator> <s:iterator value="%{#request.persons}" var="person" status="st">
返回当前迭代了几个元素. <s:property value="#st.count"/><br>
返回当前迭代元素的索引.<s:property value="#st.index"/><br>
返回当前被迭代元素的索引是否是偶数.<s:property value="#st.even"/><br>
返回当前被迭代元素的索引是否是奇数.<s:property value="#st.odd"/><br>
返回当前被迭代元素是否是第一个元素.<s:property value="#st.first"/><br>
返回当前被迭代元素是否是最后一个元素.<s:property value="#st.last"/><br><br>
</s:iterator> <table border="1">
<s:iterator value="%{#request.persons}" var="person" status="st">
<tr class="<s:property value="#st.even?'evenClass':'oddClass'"/>">
<td><s:property value="#person.id"/></td>
<td><s:property value="#person.name"/></td>
<td><s:property value="#person.age"/></td>
</tr>
</s:iterator>
</table>

if/elseif/else标签  

  if/elseif/else  基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用

 <s:if test="#age==23">
23
</s:if>
<s:elseif test="#age==21">
21
</s:elseif>
<s:else>
都不等
</s:else>

url标签

url:该标签用于创建url,可以通过"param"标签提供request参数.

value:如果不提供就用当前action,使用value后缀必须加.action

action:用来生成url的action,如果没有则使用value

namespace :命名空间

var:引用变量的名称.

 <s:url action="ognlTagAction_test" namespace="/ognl" var="myurl">
<s:param name="name" value="%{'张老师'}"></s:param>
<s:param name="id" value="12"></s:param>
</s:url> <a href='<s:property value="#myurl" />' >xxxx</a><br>
<a href='<s:property value="%{#myurl}" />' >xxxx</a><br> 使用value<br>
<s:url value="ognlTagAction_test.action" namespace="/ognl" var="myurl">
<s:param name="id" value="12"></s:param>
<s:param name="cnname" value="%{'zhang'}"></s:param>
</s:url> <a href='<s:property value="#myurl" />' >xxxx</a><br>

ognl操作集合

使用ognl操作list和数组

 Action中:
List<Person> list = new ArrayList<Person>();
for(int i=0;i<;i++){
Person p = new Person();
p.setId(i);
p.setName("lucy"+i);
p.setAge(20+i);
list.add(p);
}
request.setAttribute("persons", list);
Jsp:
集合的长度:<s:property value="#request.persons.size"/><br>

使用ognl操作list和数组

  ognl也可直接创建集合对象. 利用下拉列表框:

 Jsp:
<s:iterator value="{1,2,3,4}">
<s:property/> <br>
</s:iterator> <s:iterator value="{'s1','s2','s3','s4'}" var="s">
<s:property value="#s"/> <br>
</s:iterator>

使用ognl操作map
    ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
    创建map与创建list语法很相似,不同的是map前需要加"#"号.

 <s:iterator value="#{'key01':'value01','key02':'value02'}">
<s:property/> <br>
</s:iterator> <s:iterator value="#{'key01':'value01','key02':'value02'}">
key=<s:property value="key"/> value=<s:property value="value"/> <br>
</s:iterator> <s:iterator value="#{'key01':'value01','key02':'value02'}" var="map">
key=<s:property value="#map.key"/> value=<s:property value="#map.value"/> <br>
</s:iterator>

Struts2 之 ognl的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. Struts2之OGNL

    一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...

  3. Struts2对Ognl的支持

                                                      Struts2对Ognl的支持 一. 写作背景 由于工作性质的变化,最近一直在研究struts2,从 ...

  4. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  5. struts2之OGNL和struts2标签库和ValueStack对象

    OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.  struts2框架默认就支持Ognl表达式语言(所以 ...

  6. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  7. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  8. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  9. Struts2与OGNL的联系

    1.Struts与OGNL的结合原理 (1)值栈: OGNL表达式要想运行就要准备一个OGNLContext对象,Struts2内部含有一个OGNLContext对象,名字叫做值栈. 值栈也由两部分组 ...

  10. Struts2之OGNL与ValueStack

    时间:2017-1-12 12:02 --OGNL1.OGNL表达式是什么    OGNL的全称是Object-Graph Navigation Language的缩写,中文名是对象图导航语言,它是一 ...

随机推荐

  1. JVM笔记-temp

    jvm源码分析之堆外内存完全解读 http://lovestblog.cn/blog/2015/05/12/direct-buffer/

  2. Java笔记-快速失败and安全失败

    参考资料:http://blog.csdn.net/chenssy/article/details/38151189 快速失败 fail-fast 安全失败 fail-safe java.util包下 ...

  3. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  4. VM虚拟机上 实现CentOS 6.X下部署LVS(DR)+keepalived实现高性能高可用负载均衡

    一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...

  5. Web分析日志分析2

    http://www.docin.com/p-649515490.html http://wenku.baidu.com/link?url=kB-83fbl1Zc3Y6U2BYLj-lKMWShe8Z ...

  6. OSPF+LVS ,qugga,vconfig,...感觉这些很有想法啊

    将以前铁板一块的硬件拿来无限细分,路由器,交换机可灵活实现,SDN,NVF.硬盘可以分区,分区可以分布式块存储,操作系统可虚拟化,KVM OR LXC,网络可自由随时按需求定制更改配置. 操作系统支持 ...

  7. KEIL, a Smart Comliler

    KEIL是一个神的编译器.举一二例来说明: 1. 编译器出现WARNING"expression with possibly no effect",是提示你当前语在正做无用功,如在 ...

  8. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

  9. Delphi 托盘程序实现 转

    unit MainUnit; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F ...

  10. AWK中几个变量

    学习AWK语言 https://awk.readthedocs.org/en/latest/chapter-one.html http://www.ibm.com/developerworks/cn/ ...