struts2-值栈/ngol语句/s标签

值栈
ValueStack:接口 我们使用的是他的实现类:OgnlValueStack
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,
Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶
把他称之为struts的临时数据中转站.当请求来的时候,struts框架会为每一次请求创建一个valuestack,
把请求中的数据(请求参数,域中的数据)获取,放入值栈.我们若向获取请求的参数可以找request拿,
也可以找ValueStack拿;
我们若向往域中放入数据,可以先找到相应的域对象,然后操作;也可以通过值栈操作域中的数据.
当响应生成的时候,值栈就销毁了.
可以看成值栈的声明周期与request相同
valueStrack是对request的增强,在原本的request中添加新的值域

获取值栈:
ActionContext.getContext().getValueStack();

值栈的组成部分:
root
本身是一个arraylist---类似与栈,先进后出
root中默认保存的是当前动作类的对象(默认是0的位置),所以在该类中添加成员属性,会添加到root区域的当前action类的对象中

获取root对象
ActionContext.getContext().getValueStack().getRoot()
root对象中的方法
获取第一个对象:
root对象.peek()
删除第一个对象:
root对象.pop()
添加第一个对象:
root对象.push()

往root值栈中存数据:
方式1:值栈的api
push(Object obj):将对象压栈到list集合中
set(String key,Object value):底层创建了一个hashmap,将key/value作为map的键值对,让后将map放入root中
添加新的对象会占用集合0的位置
方式2:通过Action的成员属性
在action中添加私有属性,并提供get/set方法,因为root有当前类的对象,所以该对象中就有该属性。
获取时:
<s:property value="[当前action类对象索引].成员属性名.属性名"/>
如果当前索引值为0(即在栈的最上面,也就是最后加入的),可以不写
context
本身是一个map key:string value:Object
主要存放的是:
key                value
request            request域中的数据(map)
session            session域中的数据(map)
application        application域中的数据(map)
attr            四个域中的数据(map)
parameters        请求的参数(map)
还有自己本身的对象

context中放数据
源码中,struts将值栈的context放入到了ActionContext中,只需要操作ActionContext就可以值栈的context了
ActionContext.put(key,value) 相当于往request域中放入数据
getSession().put(key,value)
getApplication.put(key,value)

ActionContext和ValueStack的关系
ActionContext看成是一个工具类

请求来的时候,struts会在核心过滤器中为每一次请求创建一个ActionContext,也会创建一个ValueStack

将请求的参数和域中的数据放入ValueStack中.然后将ValueStack放入ActionContext中.

ActionContext会绑定到当前线程(ThreadLocal).能在自己的action中获取到所有的数据.

OGNL
是一种功能强大的表达式语言
struts2把它作为了默认的表达式语言(导入jar包)

作用:
可以调用对象的方法、
调用对象的方法:<s:property value="'hello'.length()"/>
可以访问类的静态属性
<!-- @全限定名@属性名称 -->
访问类的静态属性:<s:property value="@java.lang.Math@PI"/><br>
可以访问类的静态方法
<!-- @全限定名@方法名称() 前提:允许ognl访问类的静态方法,struts.xml中配置常量-->
访问类的静态方法:<s:property value="@java.lang.Math@random()"/>
获取值栈中的数据

ognl的三个特殊符号

#:
作用:
1.获取context中的数据
2.手动构建一个map集合
eg:
<s:iterator value="#{'aa':'11','bb':'22'}" var="en">
<s:property value="key"/>--<s:property value="value"/><br>
<s:property value="#en.key"/>~~<s:property value="#en.value"/><br>
</s:iterator>
%:
主要作用:
强制将字符串作为ognl表达式使用
eg:
<s:textfield value="%{#request.username}" name="username"/>
将#request.username 这个字符串当作一个ognl标签使用    

$:
主要作用:
在配置文件(xml和properties)中获取值栈中的值
eg:
文件下载:
web中:设置两个头一个流
response.setContentType(文件类型)
response.setHeader("content-disposition","attachment;filename="+filename);

struts:纯struts的方式
action中需要提供文件名称属性
String filename;
在action的某个方法中 将filename赋值
配置文件:   
<action name="download" class="..">
<result type="stream">
<param name="content-disposition">attachment;filename=${filename}</param>
</result>
<action>
从值栈中获取数据

获取root中的数据,ognl表达式直接写属性名称即可
<s:property value="ognl表达式"/>
先找root中的数据,找不到继续查找context(大map)中的数据,找不到返回""(空字符串)
获取root中指定的对象属性值:
<s:property value="[索引值].top" />



获取context中数据,ognl表达式需要加"#"
<s:property value="#ognl表达式"/>
获取context中指定的对象属性值:
<s:property value="#[key].属性名" />

el也可以获取值栈中所有的数据

不使用框架时el的查找顺序
依次从pageContext,request,session,application中查找数据,找到之后立即返回,找不到返回""(空字符串)
底层调用的是: pageContext.findAttribute("username")

在struts中el 查找顺序
pageContext -- request -- root -- context(大map) -- session  -- application
在核心过滤器中增强了request.getAttribute(..)
底层调用了值栈的findValue方法:先查root,root中没有的话继续找context(大map)

S标签

获取值:
<S:property value="ognl表达式/el表达式" />
遍历:
遍历 奇数
<s:iterator begin="1" end="10" step="2" var="i" status="vs">
<%-- <s:property/> --%>
<s:property value="#i"/>--<s:property value="#vs.count"/><br>
</s:iterator>
遍历 集合
<s:iterator value="list集合">
<s:property/>
</s:iterator>
判断:
<s:if test="3>4">3大于4</s:if>
<s:else>3不大于4</s:else>
<s:elseif test=""></s:elseif >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值