开源框架:Structs2.0入门学习(6)

简介: 欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入     Struts 2支持以下几种表达式语言:     1、OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;    2、JSTL(JSP Standard Tag Library),JSP 2.

    Struts 2支持以下几种表达式语言:

    1、OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
    2、JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
    3、Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
    4、Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好

    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

    1、支持对象方法调用,如xxx.doSomeSpecial();
    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、操作集合对象。


    “#”主要有三种用途:

    1、访问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属性,直到找到为止

2、用于过滤和投影(projecting)集合,如books.{?#this.price;

3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}

[如果想要实现上面的需要的话就可以用# 来代替了的哦!]


   
   
       
            /Ognl.jsp
               
   


    structs.xml配置文件是可以让这个Action类对应到一个JSP文件的哦!

    先经过了这个Action处理之后才开始进入到这个JSP页面进行相对应的操作的!

    Action中的所有操作集中在execute()方法中去了request.setAttribute("userName", "Max from request");则对应的在JSP页面中就得这样来提取出来的了!

   

request.userName:

只需要一个表达式#就可以搞定的哦!

    “%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:

hr />
   
h3>%的用途h3>
   
p>s:url value="#foobar['foo1']" />p>
   
p>s:url value="%{#foobar['foo1']}" />p>

    清单6 演示%用途的代码片段

    “$”有两个主要的用途

    1、用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》

    2、在Struts 2配置文件中,引用OGNL表达式,如

action name="AddPhoto" class="addPhoto">
           
intercep

    第三个运算符为“$” [第二份资料]

    OGNL表达式的基本单位是导航链。最简单的链包含如下部分:

表达式组成部分 示例
属性名称 如上述示例中的name和headline.text
方法调用 hashCode()返回当前对象的哈希码。
数组元素 listeners[TEC:0]返回当前对象的监听器列表中的第一个元素。

    所有的OGNL表达式都基于当前对象的上下文来评估,导航链的示例如下:

    java 代码name.toCharArray()[0].numericValue.toString()

    评估步骤如下:

    ●  解析根对象的name属性。
    ●  调用上一步返回的结果字符串的toCharArray()方法。
    ●  获取返回的结果数组的第一个字符,是一个Character对象。
    ●  获取字符的数字值表示,Character有一个getNumericValue()方法。
    ●  调用结果Integer对象的toString()方法

    集合 (Maps, Lists, Sets)

    list的语法: {e1,e2}. 它创建一个List, 包含字符串"name1"和"name2".

   

    map的语法: #{key1:value1,key2:value2}. 它创建一个Map,

    将"foo"映射到"foovalue", "bar"映射到"barvalue":MAP是名值映射的哦!一个名对应一个值的!在python中经常用到的!


  muhaha
 
 
    ooo
 

    可以用ONGL语言写到我们的JSP页面中去的实现业务逻辑的哦!而不是用来写的哦!

    一个表达式为in  not in

    选择集合的一个子集(称为投影), 可以在集合中使用通佩符(wildcard)。

    ●  ? - 所有匹配选择逻辑的元素
    ●  ^ - 第一个匹配选择逻辑的元素
    ●  $ - 最后一个匹配选择逻辑的元素

    通过一些通配符来进行运算处理的哦!  Lambda表达式

    OGNL支持基本的lamba表达式语法可以用来编写简单的函数。

    OGNL的集合操作

    可以使用如下代码直接生成一个List对象:

    {e1,e2,e3…}

    该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3.如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。

    如下代码可以直接生成一个Map对象:

    #{key1:value1,key2:value2,…}

    Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间使用逗号隔开。

    对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中

    除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。

    —    ?:获得所有符合逻辑的元素。

    —    ^:获得符合逻辑的第一个元素。

    —    $:获得符合逻辑的最后一个元素。

    例如代码:

    person.relatives.{? #this.gender == 'male'}

    该代码可以获得person的所有性别为male的relatievs集合。

    使用了OGNL表达式的JSP视图,视图用来显示Action中处理的各种信息,读者可以看到,使用OGNL表达式,代码更加简洁和直观。

    [视图的作用是用来显示Action中的各种信息的哦!]

The value of key "foo1" is

上面是用ONGL语言生成一个MAP对象,然后通过#运算符来调用出来这个值了! 8.3.4  OGNL中的#、%和$符号

    1.#符号

    #符号的用途一般有三种。

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

    —    用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}.

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

    [有点类似于正则表达式一样的哦!]

    这个总结的比较好哦!有三种用途。

    2.%符号

    %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:

   

构造Map

   

   

The value of key "foo1" is

   

不使用%:

   

使用%:

    页面输出哈哈:

    不使用%的话:#foobar['foo1']

    使用了的话:bar1

    %:当你的标志为字符串的时候可以计算出来这个值的哦!

    3.$符号

    $符号主要有两个方面的用途。

    —    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

    —    在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

   

           

            10

            100

            BAction-test校验:数字必须为${min}为${max}之间!

       

   

目录
相关文章
|
Java 程序员 应用服务中间件
【推荐】深入浅出学习Spring框架【上】
【推荐】深入浅出学习Spring框架【上】
53 0
|
2月前
|
消息中间件 Java 测试技术
Goim框架的源码学习笔记
Goim框架的源码学习笔记
|
5月前
|
负载均衡 监控 安全
SpringCloud框架的入门教程
Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
90 2
|
存储 监控 Java
【推荐】深入浅出学习Spring框架【中】
【推荐】深入浅出学习Spring框架【中】
35 0
|
前端开发 Java Apache
框架介绍 | 学习笔记
快速学习框架介绍,介绍了框架介绍系统机制, 以及在实际应用过程中如何使用。
框架介绍 | 学习笔记
|
Java 开发者
框架开始 | 学习笔记
快速学习框架开始,介绍了框架开始系统机制, 以及在实际应用过程中如何使用。
|
Web App开发 Java Spring
第12章 使用Kotlin开发Web应用《Kotin 编程思想·实战》
第12章 使用Kotlin开发Web应用 12.1 Kotlin集成Spring Boot开发Web应用 12.1.1 Spring Boot简介 12.
1571 0
|
存储 JSON Java
深入浅出FlatBuffers原理
FlatBuffers 是一个开源的、跨平台的、高效的、提供了多种语言接口的序列化工具库。实现了与 Protocal Buffers 类似的序列化格式。主要由 Wouter van Oortmerssen 编写,并由 Google 开源。本文将基于高德地图数据编译增量发布使用了FlatBuffers序列化工具,为大家分享FlatBuffers的原理。
深入浅出FlatBuffers原理
|
SQL 安全 数据库
【快速入门ORM框架之Dapper】大牛勿进系列
原文:【快速入门ORM框架之Dapper】大牛勿进系列 前言:dapper是什么?Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。
1533 0
下一篇
无影云桌面