值栈(重要)和ognl表达式

1、  只要是一个mvc框架,必须解决数据的存和取的问题

2、  Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构

3、  把数据存在值栈中,在页面上利用ognl表达式显示出来

讨论的问题

1、  讨论值栈的生命周期

2、  值栈的内存结构

3、  通过什么样的方法把数据放入到值栈中

4、  显示出来

值栈的内存结构

获取值栈的路径

说明:

1、  值是一样的,说明只有一个对象

2、  因为有一种是从request域中获取的,所以是一次请求

内存结构

1、  大致图:

2、  上面图中的context的放大

说明:

_root:(CompoundRoot)

_values:(HashMap)

在这里存放了request,response,session,application等servlet容器的内容

3、_root的放大

说明:

和ValueStack中的root是一致的

值栈的内存总图

说明:

从上图中可以看出valueStack总共分为两个部分:

对象栈:root

Map栈:_values

对象栈的存放

1、  Push方法

2、  add方法

对象栈的提取

从上图中可以看出,peek方法为获取对象栈的栈顶的元素

对象栈的元素的弹出*(栈顶的数据弹出)

作对象栈中的对象

说明:

可以利用valueStack.setParameter方法改变对象栈中对象的属性的值

Map栈的存放

通过该方法可以把一个字符串放入到map栈中的request域中

通过该方法可以把一个字符串放入到map栈中的application域中

通过该方法可以把一个字符串放入到map栈中

package com.itheima09.struts2.action;

import ognl.OgnlContext;

import org.apache.struts2.ServletActionContext;

import com.itheima09.bean.Person;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack; public class ValueStackAction extends ActionSupport{
/**
* 获取值栈
*/
public String testGetValueStack(){
ValueStack valueStack = ActionContext.getContext().getValueStack();
ValueStack valueStack2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
ValueStack valueStack3 = (ValueStack)ServletActionContext.getRequest().getAttribute("struts.valueStack");
System.out.println(valueStack);
System.out.println(valueStack2);
System.out.println(valueStack3);
return SUCCESS;
} /**
* 把一个对象放入到对象栈中
* @return
*/
public String testPutObjToObjectStack_1(){
/**
* 把一个对象放入到对象栈的栈顶
*/
ActionContext.getContext().getValueStack().push("aaaa");
return SUCCESS;
} public String testPutObjToObjectStack_2(){
/**
* 把一个对象放入到对象栈的栈顶
*/
ActionContext.getContext().getValueStack().getRoot().add(0,"aaa");
return SUCCESS;
} public String testPutObjToObjectStack_3(){
/**
* 把一个对象放入到对象栈的最底部
*/
ActionContext.getContext().getValueStack().getRoot().add("aaa");
return SUCCESS;
} /**
* 从对象栈的栈顶提取元素
* @return
*/
public String testGetObjFromObjectStack_1(){
ActionContext.getContext().getValueStack().peek();
return SUCCESS;
} public String testGetObjFromObjectStack_2(){
ActionContext.getContext().getValueStack().getRoot().get(0);
return SUCCESS;
} /**
* 从栈顶把对象弹出对象栈
*/
public String testPopObj_1(){
ActionContext.getContext().getValueStack().pop();
return SUCCESS;
} /**
* 从对象栈中清除一个元素
* @return
*/
public String testPopObj_2(){
ActionContext.getContext().getValueStack().getRoot().remove(0);
return SUCCESS;
} /**
* 把一个对象放入到对象栈中
* @return
*/
public String testPutObjectToObjectStack(){
Person person = new Person();
person.setPid(1L);
person.setName("王二麻子");
//把person放入到了对象栈的栈顶
ActionContext.getContext().getValueStack().push(person);
ValueStack valueStack = ActionContext.getContext().getValueStack();
//通过setParameter方法把对象栈的属性赋值
valueStack.setParameter("name", "aaaaa");
//从对象栈中把栈顶的对象提取出来
person = (Person)ActionContext.getContext().getValueStack().peek();
System.out.println(person.getName());
return SUCCESS;
} /**
* 把一个字符串放入到request域中
*/
public String testPutStrToRequest(){
ServletActionContext.getRequest().setAttribute("request_aaa", "request_aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
} /**
* 把一个字符串放入到application域中
*/
public String testPutStrToApplication(){
ServletActionContext.getServletContext().setAttribute("application_aaa", "application_aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
} /**
* 把一个字符串放入到map栈中
*/
public String testPutStrToMap(){
ActionContext.getContext().put("aaa", "aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
}
}

对象栈和map栈存取数据

Threadlocal

1、  本地线程类

2、  可以存放一个对象

3、  Threadlocal对象只能当前线程访问,其他的线程是不能访问的()

4、  传递参数 主要作用

参数的传递

说明:通过参数的传递,一个字符串很容易的从客户端传递到tl1中的tl1方法,再传递到tl2中的tl2方法

说明:

在TL1Super中用到一个字符串

在TL2Super中用到同样的字符串,但是这两个类是完全松耦合,这个时候要用

Threadlocal传递数据,因为不管是否是送耦合的,但是可以肯定在同一个线程中。所以可以得到同一个线程threadlocal对象中的数据

Ognl表达式

Debug标签(重要)

在页面上引入标签库

可以通过网页的形式把valueStack中值提取出来

关于对象栈:

从上图可以看出来,对象栈的属性来自于对象栈中的每一个对象的属性的get方法

把一个对象放入到对象栈中

上述的两个类中都同时有name属性,而且当前请求的action在对象栈中

package com.itheima09.struts2.action;

import ognl.OgnlContext;

import org.apache.struts2.ServletActionContext;

import com.itheima09.bean.Person;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack; public class ValueStackAction extends ActionSupport{
/**
* 获取值栈
*/
public String testGetValueStack(){
ValueStack valueStack = ActionContext.getContext().getValueStack();
ValueStack valueStack2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
ValueStack valueStack3 = (ValueStack)ServletActionContext.getRequest().getAttribute("struts.valueStack");
System.out.println(valueStack);
System.out.println(valueStack2);
System.out.println(valueStack3);
return SUCCESS;
} /**
* 把一个对象放入到对象栈中
* @return
*/
public String testPutObjToObjectStack_1(){
/**
* 把一个对象放入到对象栈的栈顶
*/
ActionContext.getContext().getValueStack().push("aaaa");
return SUCCESS;
} public String testPutObjToObjectStack_2(){
/**
* 把一个对象放入到对象栈的栈顶
*/
ActionContext.getContext().getValueStack().getRoot().add(0,"aaa");
return SUCCESS;
} public String testPutObjToObjectStack_3(){
/**
* 把一个对象放入到对象栈的最底部
*/
ActionContext.getContext().getValueStack().getRoot().add("aaa");
return SUCCESS;
} /**
* 从对象栈的栈顶提取元素
* @return
*/
public String testGetObjFromObjectStack_1(){
ActionContext.getContext().getValueStack().peek();
return SUCCESS;
} public String testGetObjFromObjectStack_2(){
ActionContext.getContext().getValueStack().getRoot().get(0);
return SUCCESS;
} /**
* 从栈顶把对象弹出对象栈
*/
public String testPopObj_1(){
ActionContext.getContext().getValueStack().pop();
return SUCCESS;
} /**
* 从对象栈中清除一个元素
* @return
*/
public String testPopObj_2(){
ActionContext.getContext().getValueStack().getRoot().remove(0);
return SUCCESS;
} /**
* 把一个对象放入到对象栈中
* @return
*/
public String testPutObjectToObjectStack(){
Person person = new Person();
person.setPid(1L);
person.setName("王二麻子");
//把person放入到了对象栈的栈顶
ActionContext.getContext().getValueStack().push(person);
ValueStack valueStack = ActionContext.getContext().getValueStack();
//通过setParameter方法把对象栈的属性赋值
valueStack.setParameter("name", "aaaaa");
//从对象栈中把栈顶的对象提取出来
person = (Person)ActionContext.getContext().getValueStack().peek();
System.out.println(person.getName());
return SUCCESS;
} /**
* 把一个字符串放入到request域中
*/
public String testPutStrToRequest(){
ServletActionContext.getRequest().setAttribute("request_aaa", "request_aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
} /**
* 把一个字符串放入到application域中
*/
public String testPutStrToApplication(){
ServletActionContext.getServletContext().setAttribute("application_aaa", "application_aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
} /**
* 把一个字符串放入到map栈中
*/
public String testPutStrToMap(){
ActionContext.getContext().put("aaa", "aaa");
ValueStack valueStack = ActionContext.getContext().getValueStack();
return SUCCESS;
}
}

值栈操作action

Property标签(重要)

介绍

输出标签

value  指定要输出的内容

如果在对象栈中,直接指定属性

也可以直接调用方法

如果在map栈中,用#指定

如果value属性不写,则默认输出栈顶的元素

把一个对象放入到对象栈中,可以利用s:prototype标签的value属性直接访问

该对象的属性。如果对象栈中出现两个相同的属性,则prototype标签的value属性会

从栈顶往下查找,直到找到为止。赋值的为第一个。

把一个对象放入到map中,再把map放入到对象栈中,在页面上可以利用

可以利用方法来访问利用该标签访问map栈中的元素

terator标签(重要)

1、  用途:主要用于迭代,可以迭代List,Set,Map,Array

2、  案例

1、  把集合放入到对象栈中

2、把list放入到map中

即使在map中,当前在迭代的对象会放在栈顶

3、  把list放入到request域中

总结:

1、  如果要迭代一个集合,当前迭代的元素在栈顶

2、  如果要迭代一个map,则当前迭代的元素是entry

3、  Iterator标签中有一个属性status

Ui标签

1、  struts2提供了一套标签机制,由struts2框架把struts2的标签解析成html标签。

2、  在struts2的配置文件中,增加

在struts2的配置文件中加入如下的内容

<constant name="struts.ui.theme" value="simple"></constant>

由struts2容器翻译过程来的html代码和struts2标签的代码就能保持一致。

<constant name="struts.devMode" value="true"></constant>    xml配置文件改动后 立即生效  开发用

Select标签

1.静态资源

<td><s:select list="{'山西省','河南省','四川省'}" value="{'山西省'}"></s:select></td>
<td><s:select list="#{1:'山西省',2:'河南省',3:'四川省'}" value="#{2:'河南省'}"></s:select></td>

2.动态资源, 从map栈中取

<td><s:select list="#provinces" listKey="pid" listValue="name"/></td>
<!--
listKey 为option元素的value属性的值
listValue option元素的文本内容
name
该属性的值用来获取选中的元素
用于回显
-->

checkbox

回显:  在jsp中显示栈值中的数据(ogal表达式)

如果要回显的内容在map栈中,不能根据name属性进行回显,必须用value属性进行回显<td><s:textfield name="username" value="%{#user.username}"></s:textfield></td>
如果把要回显的对象放入到对象栈中,则页面上可以根据name进行回显<s:textfield name="username"></s:textfield>

一般情况下,如果要回显一个对象,则把该对象放入到对象栈中

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
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 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<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:form action="">
<table>
<tr>
<td>用户名</td>
<!--
s:select s:checkboxlist
这些标签中的list属性的值可以直接跟ognl表达式
一般情况下,表单中的元素的value属性都不能直接跟ognl表达式
可以使用%{ognl表达式}
如果要回显的内容在map栈中,不能根据name属性进行回显,必须用value属性进行回显
<td><s:textfield name="username" value="%{#user.username}"></s:textfield></td>
如果把要回显的对象放入到对象栈中,则页面上可以根据name进行回显
<s:textfield name="username"></s:textfield>
一般情况下,如果要回显一个对象,则把该对象放入到对象栈中
-->
<td><s:textfield name="username"></s:textfield></td>
</tr>
<tr>
<td>爱好</td>
<!--
用name进行回显
-->
<td><s:checkboxlist list="#hobbies" listKey="hid" listValue="name" name="hids"/></td>
</tr>
</table>
</s:form>
</body>
</html>

回显

1、  如果把要回显的数据放入到map栈中,则必须根据value进行回显

Value=”%{ognl表达式}”

2、  一般情况下,应该把回显的数据放入到对象栈中,因为页面上可以直接根据name进行回显

3、  因为当前请求的action在对象栈中,所以可以利用action中的属性进行回显,action中的属性必须有get方法。

4、  Checkbox的回显

struts2(二)值栈 threadlocal ogal ui的更多相关文章

  1. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  2. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  3. Struts2的值栈和对象栈

    ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContex ...

  4. Struts2向值栈中压入属性的方式

    Struts2在初始化Action的时候会先向值栈中压入一个action对象,里面包含了各个属性,这些属性是怎么被压进去的?或者说是根据什么来压入的?直到2016年5月5日才理解,原来是在初始化act ...

  5. Struts2 的 值栈和ActionContext

    1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...

  6. Struts2 之值栈

    值栈(ValueStack) http://www.cnblogs.com/bgzyy/p/8639893.html 这是我的有关 struts2 的第一篇文章,对于里面我们说到的一个 struts2 ...

  7. 【struts2】值栈(后篇)

    在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...

  8. 【struts2】值栈(前篇)

    1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...

  9. struts2框架值栈的概述之问题一:什么是值栈?

    1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...

随机推荐

  1. 验证码 kaptcha 参数详解

    Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and optio ...

  2. [POJ3378]Crazy Thairs

    Problem 给你一个数列,让你求由五个元素组成的顺序对的个数. Solution DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数 则DP[i][j]=sum{DP[k][j-1]} ...

  3. 归并排序(Merging Sort)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. Scrapy结构

    http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html scrapy 使用Twisted 这个异步网络库来处理网络通信,使用pyt ...

  5. mybatis学习(三)----优化Mybatis配置文件中的配置

    一.把连接数据库的配置单独放在一个properties文件中 前面我们是把数据库的连接信息放在了mybatis-config.xml中,如下: <?xml version="1.0&q ...

  6. <Codis><JedisPool><DeadLock>

    Overview Background: I start a thread [call thread A below]in Spark driver to handle opening files i ...

  7. VOOKI:一款免费的Web应用漏洞扫描工具

    Vooki是一款免费且用户界面友好的Web应用漏扫工具,它可以轻松地为你扫描任何Web应用并查找漏洞.Vooki主要包括三个部分,Web应用扫描器,Rest API扫描器以及报告.Web应用扫描器​V ...

  8. 联想 Lenovo PWR-G60 无线掌中宝拆机

    从朋友那里弄了台Lenovo PWR-G60,现在已经停产了,淘宝上某店卖的国产WIFI Pineapple貌似就是拿这个刷的,打算出篇DIY教程 现在人在外地,编程器.热风枪.烙铁工具啥的都没有,更 ...

  9. java学习笔记19(Arrays类)

    Arrays类: 此类包含用来操作数组的各种方法(比如升序和搜索): import java.util.Arrays; public class Demo { public static void m ...

  10. php发送邮件(TP5)

    先百度搜索phpmailer  下载phpmailer函数包 放到/vendor/下,这是tp5扩展类库目录 然后你需要一个已经开启了SMTP服务的邮箱,作为发送者邮箱,QQ邮箱163邮箱是需要自己开 ...