1.Action:生命周期  请求到来时创建,请求结束后销毁
:每个请求都拥有自己独有的Action实例对象,即:
:每个请求到来时,struts2都会重新创建一个Action实例,分配给当前请求。
:如此,Action中才可以通过成员变量接收请求参数
===============================================================================================
2.值栈(ValueStack)
:本质: ValueStack
:每个请求都拥有自己的ValueStack对象
:ValueStack的内部组成-->context区域和root区域
*context区域:是struts2范畴内Ognl的上下文
:本质-->Map
key value
"request" Mapr 等价于请求作用域的底层的Map。
"session" Maps 等价于session作用域底层的Map。
"application" Mapa 等价于application(ServletContext)作用域底层的Map.
"parameters" Mapp 存储请求参数,存储规格如下:
url?id=35&name=c35&hobby=fb&hobby=vb
{"id":["35"],"name":["c35"],"hobby":["fb","vb"]}
#parameters.id[0]
#parameters.name[0]
#parameters.hobby[0]
#parameters.hobby[1]


*注意:如上【等价】:Mapr中存储的所有数据,会同步到请求作用域中,同样
请求作用域中存储的数据,也会同步到Mapr中
*值栈context区域应用点:集成了servlet规范中的三大作用域,加以管理。
*root区域:其内部的元素是struts2范畴内Ongl的根对象
:extends ArrayList (具有栈特点)
:存储当前请求中的Action实例对象 ---> ognl的根对象
: 将存储在Action中的数据,通过Ognl取出来,即,
:可以以Action实例为媒介进行有Action向JSP的数据传递
:且由于Action本身的生命周期为一个请求,所以Action可以作为媒介
:在一个请求内部进行Action-->JSP的数据传递
=============================================================================================
3.值栈的相关操作:
*获取当前请求的值栈对象:
ValueStack vs=ActionContext.getContext().getValueStack();
*从值栈中取值
vs.findValue("ognl");//从值栈的context区域和root区域取值
vs.setValue("ognl",Object);//向值栈的context区域和root区域存入值
vs.findValue("#request");//获取Mapr
vs.findValue("#session");//获取Maps
vs.findValue("#application");//获取Mapa
*情景1:
已知有:request.setAttribute("name","c35");==>Mapr:{"name":"c35"}
则如何通过ValueStack将c35取出?
答:vs.findValue("#request.name");
*情景2:
已知有:vs.setValue("#session.name","c35")==>Maps:{"name":"c35"}
则如何通过session作用域取出c35?
答:session.getAttribute("name");
*情景3:
已知访问的Action,有属性name,age,
则如何通过ognl取出name和age的值,ognl表达式如何定义?
答:1>"name"
2>"age"
=============================================================================================
4.struts2标签库:<s:xxxx
:作用-->在jsp中获取数据,展示数据
:导入标签库:<%@ taglib uri="/struts-tags" prefix="s"%>
*取单值:<s:property value="ognl"/>
<s:property value="#session.user35.id"/>
<s:property value="user35.id"/>
:可使用位置
:位置1:html标签体中
<p>
name:<s:property value="name"/><br/>
user:<s:property value="user.id"/>--<s:property value="user.name"/>--<s:property value="user.age"/>
</p>
:位置2:html标签属性中
<input type="text" value='<s:property value="name"/>'/>
:位置3:javascript中
<script type="text/javascript">
//注意:务必要将s标签定义在字符串中
var name='<s:property value="name"/>';
alert("name:"+name);
</script>
*流程判断:<s:if
<s:elseif
<s:else
<s:if test="(user.id+5)>4 && (1>2)">
<p>id>4</p>
</s:if>
<s:elseif test="name==\"c36\"">
<p>name==c36</p>
</s:elseif>
<s:else>
<p>id !> 4</p>
</s:else>
*遍历:<s:iterator
1>简单循环
<s:iterator begin="2" end="11" var="a">
<a href="#"><s:property value="#a"/></a>
</s:iterator>
*则循环范围[2-11] 循环10此 其中通过a可以获得当此循环的循环变量
2>遍历集合
<!-- value="ognl" 定义要遍历的数据
细节:遍历过程中每次遍历到达数据,会被压入ValueStack的root中,成为ognl的根对象
:遍历结束之后所有的数据项,从root中清除。
-->
<s:iterator value="users">
<s:property value="id"/>--
<s:property value="name"/>--
<s:property value="age"/><br/>
</s:iterator>
<!--
status="a" 循环状态记录
#a.count 循环次数
#a.index 循环索引
#a.even 循环次数是否为偶数
#a.odd 循环次数是否为奇数
-->
<s:iterator value="users" status="a">
<s:if test="#a.even">
<div style="background-color:red">
count:<s:property value="#a.count"/>
index:<s:property value="#a.index"/>
even:<s:property value="#a.even"/>
odd:<s:property value="#a.odd"/>
<s:property value="id"/>--
<s:property value="name"/>--
<s:property value="age"/><br/>
</div>
</s:if>
</s:iterator>
============================================================================================
作业:
ems中数据处理机制更新成struts2的数据处理机制

Action:
*ActionContext.getContext().getValueStack().setValue("#session.name","c35");
*this.xxx=业务结果
JSP:
<s: + OGNL












=============================================================================================
request.setAttribute("name","c35") ;
request.getAttribute("name");


Map




class MyRequset{

private Map map;
........
public void setAttribute(String a,Object o){
map.put(a,o);
}
}