博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts ongl 集合伪属性
阅读量:7088 次
发布时间:2019-06-28

本文共 13078 字,大约阅读时间需要 43 分钟。

首先了解下OGNL的概念:OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的。OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。  2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:
。 3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。 4.值栈(ValueStack) :可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。 5.调用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,很暴力。3.$符号$符号主要有两个方面的用途。— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。— 在Struts 2框架的配置文件中引用OGNL表达式,例如:
10
100
BAction-test校验:数字必须为${min}为${max}之间!
下面通过代码对OGNL有更深的了解:action类OgnlAction.java: package com.tjcyjd.test.action; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; @Controller @Namespace("/test") @ParentPackage("struts-default") @Results( { @Result(name = "success", location = "/other_test/showognl.jsp"), @Result(name = "fail", location = "/bbs/admin_login.jsp"), @Result(name = "input", location = "/bbs/admin_login.jsp") }) public class OgnlAction extends ActionSupport { private static final long serialVersionUID = -1494290883433357310L; private List
persons; @Action("ognlTest") public String ognlTest() throws Exception { // 获得ActionContext实例,以便访问Servlet API ActionContext ctx = ActionContext.getContext(); // 存入application ctx.getApplication().put("msg", "application信息"); // 保存session ctx.getSession().put("msg", "seesion信息"); // 保存request信息 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("msg", "request信息"); // 为persons赋值 persons = new LinkedList
(); Person person1 = new Person(); person1.setName("pla1"); person1.setAge(26); person1.setBirthday(new Date()); persons.add(person1); Person person2 = new Person(); person2.setName("pla2"); person2.setAge(36); person2.setBirthday(new Date()); persons.add(person2); Person person3 = new Person(); person3.setName("pla3"); person3.setAge(16); person3.setBirthday(new Date()); persons.add(person3); return SUCCESS; } public List
getPersons() { return persons; } public void setPersons(List
persons) { this.persons = persons; } } jsp页面showognl.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %>
Struts2 OGNL 演示

访问OGNL上下文和Action上下文

parameters:

request.msg:

session.msg:

application.msg:

attr.msg:


用于过滤和投影(projecting)集合

年龄大于20

  • - 年龄:

姓名为pla1的年龄:


构造Map

The value of key "foo1" is


%符号的用法

The value of key "foo1" is

不使用%:

使用%:


<% request.setAttribute("req", "request scope"); request.getSession().setAttribute("sess", "session scope"); request.getSession().getServletContext().setAttribute("app", "aplication scope"); %> 1.通过ognl表达式获取 属性范围中的值

2.通过
ognl表达式创建list 集合 ,并且遍历出集合中的值

3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值
->

4.通过ognl表达式 进行逻辑判断
aa 在 集合{ 'aaa','bbb'}中;
aa 不在 集合{ 'aaa','bbb'}中;
不 在 集合list中;
在 集合list中;

5.通过ognl表达式 的投影功能进行数据筛选
${o }

6.通过ognl表达式 访问某个类的静态方法和值

7.ognl表达式 迭代标签 详细
pink">
索引 奇? 偶? 首? 尾? 当前迭代数量
Y
N
Y
N
Y
N
Y
N

8.ognl表达式: if/else if/else 详细
<% request.setAttribute("aa",0); %>
在0-4之间;
在4-8之间;
大于8;

9.ognl表达式: url 详细
<% request.setAttribute("aa","sss"); %>
100
value以字符处理:
value明确指定以ognl表达式处理:

10.ognl表达式: checkboxlist 详细
1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
name:checkboxlist的名字
list:checkboxlist要显示的列表
value:checkboxlist默认被选中的选项,checkedchecked=checked
以上生成代码:
<div></div> &lt;input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/&gt; &lt;label for="checkbox1-1" class="checkboxLabel"&gt;上网&lt;/label&gt; &lt;input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/&gt; &lt;label for="checkbox1-2" class="checkboxLabel"&gt;看书&lt;/label&gt; &lt;input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/&gt; &lt;label for="checkbox1-3" class="checkboxLabel"&gt;爬山&lt;/label&gt; &lt;input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/&gt; &lt;label for="checkbox1-4" class="checkboxLabel"&gt;游泳&lt;/label&gt; &lt;input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/&gt; &lt;label for="checkbox1-5" class="checkboxLabel"&gt;唱歌&lt;/label&gt;" <div></div> 2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
name:checkboxlist的名字
list:checkboxlist要显示的列表
listKey:checkbox 的value的值
listValue:checkbox 的lablel(显示的值)
value:checkboxlist默认被选中的选项,checkedchecked=checked
以上生成代码:
<div></div> &lt;input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/&gt; &lt;label for="checkbox2-1" class="checkboxLabel"&gt;上网&lt;/label&gt; &lt;input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/&gt; &lt;label for="checkbox2-2" class="checkboxLabel"&gt;看书&lt;/label&gt; &lt;input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/&gt; &lt;label for="checkbox2-3" class="checkboxLabel"&gt;爬山&lt;/label&gt; &lt;input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/&gt; &lt;label for="checkbox2-4" class="checkboxLabel"&gt;游泳&lt;/label&gt; &lt;input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/&gt; &lt;label for="checkbox2-5" class="checkboxLabel"&gt;唱歌&lt;/label&gt; <div></div>

总结OGNL的使用方法:访问属性名字属性获取:
地址属性获取:
访问方法调用值栈中对象的普通方法:
访问静态属性和方法调用Action中的静态方法:
调用JDK中的类的静态方法:
调用JDK中的类的静态方法(同上):
调用JDK中的类的静态方法:
调用普通类中的静态属性:
访问构造方法调用普通类的构造方法:
1.5. 访问数组获取List:
获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):
获取Set:
获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):
×获取Map:
获取Map中所有的键:
获取Map中所有的值:
获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):
获取List的大小:
访问集合 – 投影、选择(? ^ $)利用选择获取List中成绩及格的对象:
利用选择获取List中成绩及格的对象的username:
利用选择获取List中成绩及格的第一个对象的username:
利用选择获取List中成绩及格的第一个对象的username:
利用选择获取List中成绩及格的最后一个对象的username:
利用选择获取List中成绩及格的第一个对象然后求大小:
集合的伪属性OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.集合 伪属性------------------------------------------------------------------------------------------------------Collection(inherited by Map, List & Set) size ,isEmptyList iteratorMap keys , valuesSet iteratorIterator next , hasNextEnumeration next , hasNext , nextElement , hasMoreElements------------------------------------------------------------------------------------------------------- Lambda :[…]格式::[…]使用Lambda表达式计算阶乘:
OGNL中#的使用#可以取出堆栈上下文中的存放的对象.名称 作用 例子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) 获取Paraments对象的属性:
OGNL中%的使用用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息. OGNL中$的使用“$”有两个主要的用途l 用于在国际化资源文件中,引用OGNL表达式l 在Struts 2配置文件中,引用OGNL表达式 值栈ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()l Top语法使用Top获取值栈中的第二个对象:
l N语法使用N获取值栈中的第二个对象:
l @语法调用action中的静态方法:
vs:值栈 1:表示第一个。 ---------------------------------------------------------------------------------------------------------- 来源于:http://www.cnblogs.com/xly1208/archive/2011/11/19/2255500.html

 

你可能感兴趣的文章
给初学者的RxJava2.0教程(三)(转)
查看>>
探究ConcurrentHashMap中键值对在Segment[]的下标如何确定
查看>>
Docker学习记录3: 搭建 Private Registry
查看>>
计算机图形学 补 光线跟踪
查看>>
spring整合logback配置文件
查看>>
captive portal
查看>>
mysql基本数据类型(mysql学习笔记三)
查看>>
Laravel踩坑笔记——illuminate/html被抛弃
查看>>
飞秋命令行
查看>>
做题时一时没想起来的问题总结
查看>>
[转]python-元类
查看>>
复习日记-Listener/filter/servlet3.0/动态代理
查看>>
Win7x64安装了DroidPilot-Win64.exe之后跑不起来 -- 解决办法
查看>>
VS2010 中C++ 和C# 颜色转化
查看>>
java 自带的工具
查看>>
CentOS 7配置MariaDB允许指定IP远程连接数据库
查看>>
计算机基础——指令与程序
查看>>
用三段 140 字符以内的代码生成一张 1024×1024 的图片<转载>
查看>>
HTML CSS
查看>>
sqlserver存储过程中SELECT 与 SET 对变量赋值的区别
查看>>