一:什么是值栈

1:ValueStack:值栈。其本身的数据结构是一个栈,使用者可以把一些对象存入栈中。然后使用动态的表达式来读取bean的属性。由于值栈中可能有多个对象

值栈会按照对象出栈的顺序依次尝试使用动态的表达式来读取值,知道成功读取值为止。struts2默认使用的是OgnlValueStack,即使用ognl这个动态表达式语言来读取值。

2:在Struts2执行一次请求的过程中,Struts2会把当前的Action对象自动放入值栈。这样,在渲染JSP时,JSP里的代码使用<s:property value="..."/>之类标签中的Ognl表达式

会直接作用于Action对象,从而方便的读取Action的属性。

二:如何获得值栈

1.1在自定义的拦截器中,使用ActionInvocation.getStack()方法。(ActionInvocation是拦截器的方法参数)

1.2在Action类中,让拦截器植入ValueStack或者使用ActionContext.getContext().getValueStack()来获取值栈。

注意:使用ActionContext分配的context的方式是基于线程的,如果使用这种方法,请确保其不出错!

1.3在jsp中,可以使用标签即可获取栈值栈中的数据!

三:如何将对象存入值栈

1.struts2自动存入Action:之前提到,,Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中。

2.ModelDrivenInterceptor会存入Action的model属性:如果你使用了Struts2提供的 ModelDrivenInterceptor,则它会把Action对象的getModel()方法得到的对象存入值栈中。此时,值栈最底层为Action类,其次为这个model。

3.在自定义的拦截器中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。

4.在Action类中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。

5.在JSP中存入值栈:标签<s:push value="..."></s:push>是专门用来在JSP中把指定的value放入值栈的,但value被放入值栈的时间仅在s:push标签内,即程序运行到</s:push>标签处会把value从值栈中移出。另外,还有一些标签比如<s:iterator/>由于其功能的需要也会把一些对象放到值栈中。

代码如下:

通过调试可以发现其中的root对象是以ArrayList的方式存入user对象的!

Stack Context中的数据则存放在Context中其是以map集合的形式来存放数据的。在是用OGNL表达式来访问时需要加上“#”作为前缀。

使用ognl表达式:

1)“#”符号有三种用途

a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

名称   作用域 

eg:

1-1)parameters :包含当前HTTP请求参数的Map

#parameters.id[0]=>作用相当于request.getParameter("id")

 

1-2)request:包含当前HttpServletRequest的属性(attribute)的Map

#request.userName=>作用相当于request.getAttribute("userName");

 

1-3)session:包含当前HttpSession属性(attribute)的Map

#session.userName=>session.getAttribute("userName");

 

1-4)application:包含当前应用的ServletContext的属性(attribute)的Map

#application.userName=>application.getAttribute("userName");

演示案例:(省略javabean)

1:原始类型和包装类型

action类

private User user;
private String message;
public String execute(){
setUser(new User());
getUser().setName("jbit");
getUser().setAge();
Address address=new Address();
address.setCountry("中国");
address.setCity("北京");
address.setStreet("长安街");
getUser().setAddress(address);
setMessage("展示原始类型和JavaBean");
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}

展示数据的result.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'result.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
信息:<s:property value="message" default="展示数据" /><br/>
姓名:<s:property value="user.name" /><br/>
年龄:<s:property value="user.age" /><br/>
国家:<s:property value="user.address.country" />
</body>
</html>

2:多值类型的数据处理

action类代码:(数组)

    private String[] hobbies;
private Double[] numbers=new Double[]; public String execute(){
System.out.println("hobbies的长度是"+hobbies.length);
for(int i=;i<hobbies.length;i++){
System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies[i]);
}
System.out.println("numbers的长度是"+numbers.length);
for(int i=;i<numbers.length;i++){
System.out.println("numbers数组中第"+i+"个元素是:"+numbers[i]);
} return SUCCESS;
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public Double[] getNumbers() {
return numbers;
}
public void setNumbers(Double[] numbers) {
this.numbers = numbers;
}

action类代码:泛型

private List<String> hobbies;
private List<Double> numbers;
private List<User> users; public String execute(){
System.out.println("hobbies的长度是"+hobbies.size());
for(int i=;i<hobbies.size();i++){
System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies.get(i));
}
System.out.println("numbers的长度是"+numbers.size());
for(int i=;i<numbers.size();i++){
System.out.println("numbers数组中第"+i+"个元素是:"+numbers.get(i));
}
System.out.println("users的长度是"+users.size());
for(int i=;i<users.size();i++){
System.out.println("users数组中第"+i+"个元素是:"+users.get(i).getName());
}
return SUCCESS;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
public List<Double> getNumbers() {
return numbers;
}
public void setNumbers(List<Double> numbers) {
this.numbers = numbers;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}

array.jsp展示数据

<body>
<s:form action="ArraysDataTransfer.action">
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/> <s:textfield name="numbers[0]" label="数字:"/>
<s:textfield name="numbers[1]" label="数字:"/>
<s:textfield name="numbers[2]" label="数字:"/>
<s:submit value="提交"/>
</s:form>
</body>

list.jsp展示数据

<body>
<s:form action="listDataTransfer">
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/> <s:textfield name="numbers[0]" label="数字:"/>
<s:textfield name="numbers[1]" label="数字:"/>
<s:textfield name="numbers[2]" label="数字:"/> <s:textfield name="users.name" label="姓名:"/>
<s:textfield name="users.name" label="姓名:"/>
<s:textfield name="users.name" label="姓名:"/>
<s:submit value="提交"/>
</s:form>
</body>

ognl的更多相关文章

  1. Struts2入门(五)——OGNL和标签库

    一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...

  2. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  3. 4. ValueStack 和 OGNL

    1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...

  4. Struts2中的Ognl

    OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...

  5. Struts2(Ognl)

    OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...

  6. Strust OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. Struts2深入学习:OGNL表达式原理

    今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1

  8. OGNL的使用

    访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...

  9. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  10. Struts 2的OGNL的根对象

    Struts2中的OGNL表达式语言是对Xwork的OGNL的封装.我们要理解一下几点: 1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有 ...

随机推荐

  1. [译]Godot系列教程三 - 场景实例化(续)

    场景实例化(续) 要点 场景实例化带来很多便利的用法,总体来说有: 将场景细分,更便于管理 相对于某些引擎中的Prefab组件更灵活,并且在许多方面更强大 是一种设计更复杂的游戏流程甚至UI的方式 这 ...

  2. 【转】ZigBee是如何组网的?

    组网方案设计:组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点(路由器或终端)加入网络,其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 一.网络初始化:  ...

  3. Thinking in Java——笔记(20)

    Annotations They provide information that you need to fully describe your program, but that cannot b ...

  4. Apache的初中级面试题

    --- 原文:[关于Apache的25个初中级面试题](http://www.oschina.net/translate/apache-interview-questions) Apache 求职面试 ...

  5. PHP 根据key 给二维数组分组

    我们经常拿到一个二维数组出来,会发现结果和自己想要的有些偏差,可能需要根据二维数组里的某个字段对数组分组.先来看以下数组, Array ( [0] => Array ( [id] => 1 ...

  6. java web学习总结(八) -------------------HttpServletResponse对象(二)

    一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,

  7. zookeeper集群

    0,Zookeeper基本原理 ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其他节点都为Follower.当客户端Client连接到Zo ...

  8. Spark on Yarn 学习(一)

    最近看到明风的关于数据挖掘平台下实用Spark和Yarn来做推荐的PPT,感觉很赞,现在基于大数据和快速计算方面技术的发展很快,随着Apache基金会上发布的一个个项目,感觉真的新技术将会不断出现在大 ...

  9. jQuery实现页面内锚点平滑跳转

    平时我们做导航滚动到内容都是通过锚点来做,刷的一下就直接跳到内容了,没有一丝的滚动效果,而且 url 链接最后会有“小尾巴”,就像#keleyi,今天我就介绍一款 jquery 做的滚动的特效,既可以 ...

  10. SharePoint项目实践中如何实现非打破继承看上去很美的权限控制

    首先对于比较机密的数据,打破继承还是必须要的. 但是对于一些普通申请单据,虽然客户也希望用户不要看到其他人的申请单据,但是我还是不推荐打破继承,应为打破继承一方面会造成网站的权限管理特别的凌乱,另一方 ...