天天看点

[Java web]-- struts2(4)

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);
 }
 }