Struts2--ONGL--值栈
ONGL:用来访问栈里对象属性的语言,通常由Struts标签来解析,
注意:要在接续OGNL的页面加入<%@ taglib prefix="s" uri="/struts-tags"%>,否则,栈内信息不回被访问到,也就是<s:debug></s:debug>访问栈内标签不起作用(暂时先这么叫吧)
值栈:
栈的特点:后入先出
1.首先要通过ActionContext来获取值栈对象ValueStack。
ActionContext ac =ActionContext.getContext();
//获取值栈对象
ValueStack vs = ac.getValueStack();
值栈分为对象站和Map栈
对象栈:存放Action的实例及相关对象
Map栈:存放封装web资源的map对象,实际是ActionContext的引用
application
session
request
parameters
attr通用属性
按照request session application的循序查找属性值
方法:
push(Object)把对象压入对象栈的顶部
pop()弹出返回对象栈的顶部对象
peek()得到对象栈的顶部对象,并不弹出
OGNL访问方式:
1.使用Struts标签
1.1访问对象栈:按先后顺序访问(后入先出)
value=“[起始索引].属性名” 指定匹配的起始索引位置(索引从0开始)
1.2访问Map栈
如果作用域=attr
按照request session application的循序查找建值
1.3访问类的静态方法和静态属性
首先要在Struts的配置文件里打开访问静态方法的代码,如下:
方法:
value=“@全类名@方法名(参数列表)”
value=“@全类名@静态属性名”
1.4访问对象的集合属性
输出集合内容:value=“[起始索引].集合属性名”
访问集合单元数组和List:value=-"[起始索引].集合属性名[索引]"
Map:value=-"[起始索引].集合属性名[‘key’]"
获取集合长度
数组:value=“[起始索引].集合属性名.length”
List 和Map:value=“[起始索引].集合属性名.size” 或 value=“[起始索引].集合属性名.size()”
判断内容是否为空:value=“[起始索引].集合属性名.isEmpty()”
2.使用EL
访问map栈:${作用域。key}
访问对象站:
按先后顺序匹配属性名,只输出第一个,后面的忽略
${属性名}
不能指定查找的起始位置
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
<% application.setAttribute("app","application");
application.setAttribute("ses","application顶顶顶顶"); session.setAttribute("ses", "回话的测试内容");
session.setAttribute("app", "回话的测试内容fffff"); request.setAttribute("req", "request"); %>
<a href="test.do?userID=666666&date=123">下一个页面</a> </body>
</html>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- 覆盖默认的过滤的扩展名 -->
<constant name="struts.action.extension" value="do,action,,"></constant> <!-- 启用动态调用
<constant name=""></constant>--> <!-- 允许调用静态方法和静态属性 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <!-- 定义包 -->
<package name="text" extends="struts-default" >
<action name="test" class="com.hanqi.action.TestAction" > <result>test.jsp</result> </action> </package> </struts>
package com.hanqi.action; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack; public class TestAction { private String userID; private String date; public String getUserID() {
return userID;
} public void setUserID(String userID) {
this.userID = userID;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String testtag()
{
return"success";
} //访问值栈
public String execute()
{
ActionContext ac =ActionContext.getContext();
//获取值栈对象
ValueStack vs = ac.getValueStack(); //随机数对象
vs.push(new Random()); //向对象栈压入对象
vs.push(new Date()); //对象本身是集合
List<String> ls = new ArrayList<>();
ls.add("ABC");
ls.add("DEF");
vs.push(ls); //对象的属性是集合
TestList tl = new TestList();
tl.setMyList(ls);
vs.push(tl); return "success";
} }
<%@page import="java.util.Date"%>
<%@page import="com.opensymphony.xwork2.util.ValueStack"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 加载OGNL的自定义标签库 -->
<%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <%
ActionContext ac =ActionContext.getContext();
ValueStack va = ac.getValueStack();
//弹出并返回顶部的对象
//Date dt =(Date)va.pop(); //得到顶部对象
//Date dt = (Date)va.peek(); //out.print(dt); %>
<br> 使用 OGNL访问
<br><br>
EL方式:
${date}
<br><br>
${userID } <br>
访问map栈:<br>
${sessionScope.ses } <br><br>
标签方式:
<s:property value="[1]['date']"/><br>
<s:property value="userID"/><br>
<s:property value="[1].date"/>
<br>
<s:property value="[0].userID"/>
<br>
默认输出顶部对象(value不写,)
<s:property/>
<br>
访问map栈***************
<br>
<s:property value="#session.ses"/><br>
<s:property value="#parameters.userID"/><br> <br>
app=<s:property value="#application.app"/><br>
<s:property value="#request.req"/><br>
<br><br>
ses=<s:property value="#attr.ses"/><br> <br>
调用实例方法:<br>
产生随机数=<s:property value="[0].nextInt(100)"/> <br><br>
调用静态属性和对象方法:<br>
随机数:<s:property value="@java.lang.Math@random()"/>
<br>
PI=<s:property value="@java.lang.Math@PI"/> <br><br>
访问list
<br>
list的长度=<s:property value="[0].size()"/> <!--size后面的()不可去掉 -->
<br>
<s:property value="[0].get(0)"/> <br><br>
访问对象的集合属性:
<br>
长度=<s:property value="[0].myList.size"/><br> <!--size后面的()可以去掉 -->
内容=<s:property value="[0].myList"/>
<br>内容0=<s:property value="[0].myList[0]"/> <br><br>
是否空=<s:property value="[0].myList.isEmpty"/> <!-- 打印值栈信息 -->
<s:debug></s:debug> </body>
</html>
package com.hanqi.action; import java.util.List; public class TestList { private List<String> myList; public List<String> getMyList() {
return myList;
} public void setMyList(List<String> myList) {
this.myList = myList;
} }
Struts2--ONGL--值栈的更多相关文章
- struts2(二)值栈 threadlocal ogal ui
值栈(重要)和ognl表达式 1. 只要是一个mvc框架,必须解决数据的存和取的问题 2. Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3. 把数据存在值栈中,在页面上利用 ...
- Struts2的值栈和OGNL牛逼啊
Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- Struts2 的 值栈和ActionContext
1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...
- Struts2的值栈和对象栈
ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContex ...
- Struts2向值栈中压入属性的方式
Struts2在初始化Action的时候会先向值栈中压入一个action对象,里面包含了各个属性,这些属性是怎么被压进去的?或者说是根据什么来压入的?直到2016年5月5日才理解,原来是在初始化act ...
- Struts2 之值栈
值栈(ValueStack) http://www.cnblogs.com/bgzyy/p/8639893.html 这是我的有关 struts2 的第一篇文章,对于里面我们说到的一个 struts2 ...
- 【struts2】值栈(后篇)
在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...
- 【struts2】值栈(前篇)
1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...
- struts2框架值栈的概述之问题一:什么是值栈?
1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...
随机推荐
- 关于"Command /usr/bin/codesign failed with exit code 1"的解决办法
今天当码农的时候,xcode爆出"Command /usr/bin/codesign failed with exit code 1"这样一个错 当时以为是授权文件设置不正确的问题 ...
- 【整理】--【KERNEL】内核定时器
一.LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <linux/timer.h> 和 kernel/timer.c 文件中 ...
- Visual Studio2013(Update4)无法生成依赖项关系图解决方案
今天为了看别人写的一套框架,就琢磨着有没视图的方式去看别人每个类和方法之间的调用和继承关系.这个时候发现了一个VS2013自带的功能: 带着兴奋的心情小手一抖一点... 我等呀等,等呀等.... 尼玛 ...
- C# 装箱和拆箱的简单理解
一.装箱拆箱的意义 主要用途是可以向ArrayList中添加值类型的元素 二.理解 装箱的含义:理解为可以将子类对象隐式的转化为父类对象(保留自己特有的成员,和子类重写的成员) 装箱:例子为典型的装箱 ...
- Win10 无法完全关机问题
Win10是重新安装的.开机运行时间长了或者跑的东西多了.关机,键盘灯还是亮的,要强制按电源键关机才行. 问题解决:从网上搜以为是显卡驱动问题,上官网更新最新驱动,结果还是关不了机.偶然间搜到是Int ...
- 更改apache网站根目录导致localhost不能访问
使用xampp或wamp安装完集成环境后,更改apache的网站根目录会导致localhost,localhost/phpmyadmin访问不到. 解决方法: 打开apache的配置文件:“../ap ...
- 解决PHP move_uploaded_file函数移动图片失败
出现的问题描述:今天在实现一个在用户注册时上传头像图片文件的PHP脚本时,出现了问题:PHP脚本在前面已经确定 浏览器端上传文件没有错误.上传的文件是合法的.上传的文件是图像文件.已经在服务器端生成了 ...
- Javascript 中的this 指向的对象,你搞清楚了吗?
Javascript 中的this 总让人感到困惑,你能分清以下三种test1(),test2(),test3() 情况下的输出吗? 注:以下Javascript运行环境中为浏览器 //1 this在 ...
- 一次千万级别的SQL查询简单优化体验
背景:从两张有关联的表查询数据,A表数据量1400万,B表数据量8000万.A与B通过ID逻辑关联,没有实际的外键.B表是后来扩展出来的. 问题:根据某个ID查询时超时,运行时跑不出结果. 原因:使用 ...
- C# - JSON详解
最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列 ...