zoukankan      html  css  js  c++  java
  • 4.Struts2-OGNL

    /*ognl 是 strut2 特有的表达式,使用 ognl,struts2 就无需将对象手动放值进request等范围,页面(从值栈中)直接传值*/

      

    OGNL

     1 <?xml version="1.0" encoding="GB18030" ?>
     2 <%@ page language="java" contentType="text/html; charset=GB18030"
     3     pageEncoding="GB18030"%>
     4 <%@ taglib uri="/struts-tags" prefix="s" %>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     6 <html xmlns="http://www.w3.org/1999/xhtml">
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
     9 <title>OGNL表达式语言学习</title>
    10 </head>
    11 <body>
    12     <ol>
    13         <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
    14         <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user["age"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
    15         <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.dog.name"/></li>
    16         <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
    17         <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
    18         <li>访问值栈中action的普通方法:<s:property value="m()" /></li>
    19         <hr />
    20         <li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.action.S@str()"/></li>
    21         <li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.action.S@STR"/></li>
    22         <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
    23         <hr />
    24         <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.action.User(8)"/></li>
    25         <hr />
    26         <li>访问List:<s:property value="users"/></li>
    27         <li>访问List中某个元素:<s:property value="users[1]"/></li>
    28         <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
    29         <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
    30         <li>访问Set:<s:property value="dogs"/></li>
    31         <li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
    32         <li>访问Map:<s:property value="dogMaps"/></li>
    33         <li>访问Map中某个元素:<s:property value="dogMaps.dogMap1"/> | <s:property value="dogMaps['dogMap1']"/> | <s:property value="dogMaps["dogMap1"]"/></li>
    34         <li>访问Map中所有的key:<s:property value="dogMaps.keys"/></li>
    35         <li>访问Map中所有的value:<s:property value="dogMaps.values"/></li>
    36         <li>访问容器的大小:<s:property value="dogMaps.size()"/> | <s:property value="users.size"/> </li>
    37         <hr />
    38         <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
    39         <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
    40         <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
    41         <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
    42         <hr />
    43         <li>[]:<s:property value="[0].username"/></li>
    44     </ol>
    45     
    46     <s:debug></s:debug>
    47 </body>
    48 </html>


    注:

      1.因为Set是无序的,访问Set中某个元素,是没有意义的,所以是无法通过下标来取出Set中某个元素

      2.访问静态方法,在Struts2.1中 需要在struts.xml中加上 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

      3.访问值栈中对象的属性和方法,需要new出这个对象,需要一个无参的构造方法,(如果该类没有构造方法,系统默认有一个构造方法)

      4.投影只有 '?#' '^#' '$#' 这三种写法, '^#'表示取集合中第一个元素 '$#'表示取集合中最后一个元素users.{?#this.age==1}[0]

      举例分析:users是一个List集合,上式表示:遍历users这个List集合,取出user.age==1 的user 因为可能有多个user满足条件,

      所以是一个集合的形式 最后[0] 表示取出满足条件的user集合中的第一个

      users.{^#this.age>1}.{age}取出满足age>1 的所有user,这是一个集合,所以取 age属性

      也是用集合的方式,选择集合中第一个user,得到一个age集合

      5.[] 表示取出 值栈 中的Object,[0] 表示 取出 值栈中的所有的Object(从第一个开始)

      [1] 表示取出第二个Object [0].username 表示从上往下依次验证值栈中的Object是否有username这个key 如果有,取出这个key对应的value
      另外:如果action之间存在转发(type="chain") 因为这属于一次访问(request)

      所以,两个action都会被当做Object 压在 值栈中

  • 相关阅读:
    Python之路第十二天,高级(5)-Python操作Mysql,SqlAlchemy
    Python之路第十二天,高级(4)-Python操作rabbitMQ
    Python之路第十一天,高级(3)-线程池
    day11 消息队列、多线程、多进程、协程
    day10 多进程、多线程(一)
    day09编程之socket
    day08面向对象(二)
    day07面向对象(初级篇)
    day06反射和正则
    day05开发 (字符串格式化和常用模块)
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7380458.html
Copyright © 2011-2022 走看看