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. 多目标遗传算法 ------ NSGA-II (部分源码解析) 目标函数值计算 eval.c

    这部分比较简单,具体的函数数值计算是需要调用设定的目标函数的,此部分一个不能忽略的问题是  超出限制条件的处理 , 故对此加以解释. 首先是包装函数, 核心操作调用  evaluate_ind  实现 ...

  2. python——os模块操作文件

  3. 转:OWASP发布Web应用程序的十大安全风险

    Open Web Application Security Project(OWASP)是世界范围内的非盈利组织,关注于提高软件的安全性.它们的使命是使应用软件更加安全,使企业和组织能够对应用安全风险 ...

  4. Regularized Linear Regression with scikit-learn

    Regularized Linear Regression with scikit-learn Earlier we covered Ordinary Least Squares regression ...

  5. Expanding Rods

    http://poj.org/problem?id=1 #include<cstdio> #include<cstring> #include<cmath> #in ...

  6. SignTool.exe(签名工具)

    水漂收集 -- SignTool.exe(签名工具) =============C#.Net 篇目录============== 签名工具是一个命令行工具,用于用证书对文件进行数字签名,验证文件和时间 ...

  7. centos7安装VLC播放器

    centos7安装VLC播放器 1.安装eple 下载地址:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noar ...

  8. Linux下Apache PHP MYSQL 默认安装路径

    apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下apache配置文件:/etc/httpd/conf/httpd.confApache模块路径:/usr/sbin/apa ...

  9. [LeetCode] 205. Isomorphic Strings 解题思路 - Java

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  10. SSLStrip 的未来 —— HTTPS 前端劫持

    前言 在之前介绍的流量劫持文章里,曾提到一种『HTTPS 向下降级』的方案 —— 将页面中的 HTTPS 超链接全都替换成 HTTP 版本,让用户始终以明文的形式进行通信. 看到这,也许大家都会想到一 ...