【Struts2五】ValueStack以及ognl表达式一(概述)

来源:互联网 发布:nat穿透软件 编辑:程序博客网 时间:2024/06/05 04:21
1.ValueStack概述:
在传统的servlet中,往jsp页面传递数据是靠request域,session域以及ServletContext域中存数据,然后再jsp页面通过el表达式将数据显示出来!

valueStack是Struts2的存储数据的结构!
ognl是在页面上读取valueStack的值并显示出来!类似于el表达式!

ValueStack是接口,OgnlValueStack是实现方式!
valueStack的生命周期是一次请求!因为放在request域中!

valueStack的内存结构:



map栈就是OgnlContext中的_values(是一个HashMap()),使用put方法放入元素!
对象栈就是valueStack中的root(是一个ArrayList),使用push方法放入元素!
传统的servlet中的各大作用域放在map栈中!



2.获取valueStack的三种方式:     
  
     /**
      * 获取valueStack的途径
      * @return
      */
     public String valueStackMethod(){
           ActionContext. getContext().getSession().put("aaa", "afdsadsf");
          ValueStack valueStack = ActionContext.getContext().getValueStack();//常用方法
           ValueStack valueStack2 = ServletActionContext.getValueStack(ServletActionContext. getRequest());
           ValueStack valueStack3 = (ValueStack)ServletActionContext. getRequest().getAttribute("struts.valueStack");//在request域中,所以valueStack的生命周期就是一次请求!
          System. out.println(valueStack);
          System. out.println(valueStack2);
          System. out.println(valueStack3);
           return null ;
     }



3.将数据放入到ValueStack中:

     /**
      * 将数据放入域中,#request.msg_request,#session.msg_request,...来取数据;
      * @return
      */
     public String putDataToDomain(){
          ValueStack valueStack = ActionContext.getContext().getValueStack();
          ServletActionContext. getRequest().setAttribute("msg_request", "msg_request");
          ServletActionContext. getServletContext().setAttribute("msg_application", "msg_application");
          ActionContext. getContext().getSession().put("msg_session", "msg_session");
           return "domain" ;
     }
     
     /**
      * 将数据放入map栈中;#map
      * @return
      */
     public String putDataToMap(){
          ActionContext. getContext().put("map", "map_value");
           return "map" ;
     }
     
     /**
      * 将map放入到request域中,#request.map.name
      * @return
      */
     public String putMapToRequest(){
          Map<String, String> map = new HashMap<String, String>();
          map.put( "name", "zhangsan" );
          ServletActionContext. getRequest().setAttribute("map", map);
           return "request_map" ;
     }
     /**
      * 将map放入到map栈中;#map.name
      * @return
      */
     public String putMapToMap(){
          Map<String, String> map = new HashMap<String, String>();
          map.put( "name", "lisi" );
          ActionContext. getContext().put("map", map);
           return "map_map" ;
     }

 
     /**
      * 把数据存放到对象栈
      */
     public String putDataToObjectStack(){
          ValueStack valueStack = ActionContext.getContext().getValueStack();
           /**
           * 可以把数据存放在对象栈的尾部
           */
           valueStack.getRoot().add("aaaaa");
           //栈顶
           valueStack.getRoot().add(0,"adsf");
           //栈顶
          valueStack.push( "rtrt");
           /**
           * 把" aaasdf"和"asfd"封装成了一个map,把map放入到栈顶
           */
          valueStack.set( "aaasdf", "asfd" );
          
           /**
           * 怎么样获取栈顶的元素
           */
          valueStack.peek();
          valueStack.getRoot().get(0);
           /**
           * 弹出栈顶元素
           */
          valueStack.getRoot().remove(0);
          valueStack.pop();
           return null ;
     }



     /**
      * 将bean防到对象栈中,直接使用属性的名字即可,<s:property value=" username"/>
      * @return
      */
     public String putObjToObjStack(){
          User user = new User();
          user.setPassword( "123");
          user.setUsername( "zhangsan");
          ActionContext. getContext().getValueStack().push(user);
           return "obj_objstack" ;
     }
     /**
      * 将字符串直接放到对象栈中,<s:property />获取的是对象站栈栈顶的内容
      * @return
      */
     public String putStringToObjStack(){
          ActionContext. getContext().getValueStack().push("strdata");
           return "str_objstack" ;
     }
     
     /**
      * 将map放到对象栈中,使用<s:property value="key"/>获取值
      * @return
      */
     public String putMapToObjStack(){
          Map<String, String> map = new HashMap<String, String>();
          map.put( "key", "value" );
          ActionContext. getContext().getValueStack().push(map);
           return "map_objstack" ;
     }
          /**
      * 在对象栈中存放几个对象,在这几个对象有相同的属性,<s:property value="username"/>  ,从栈顶开始找,找到就不往下找了。
      *    * @return
      */
     public String putSameFiledToObjStack(){
          User user = new User();
          user.setUsername( "user");
          user.setPassword( "afd");
          
          Person person =  new Person();
          person.setUsername( "person");
          person.setPid( "1");
          
           this.username = "ognlAction" ;
          
          ActionContext. getContext().getValueStack().push(user);
          ActionContext. getContext().getValueStack().push(person);
           return "samefiled_objstack" ;
     }
     
     /**
      * 在对象栈中存放map和一个bean,map中的key值和bean中的属性值保持一致,怎么办?  也是从栈顶开始找,找到就不找了。
      */
     public String putMapAndBeanToObjStack(){
          Map<String, String> map = new HashMap<String, String>();
          map.put( "username", "zhangsan" );
          
          Person person = new Person();
          person.setUsername( "lisi");
          
          ActionContext. getContext().getValueStack().push(person);
          ActionContext. getContext().getValueStack().push(map);
          
           return "map_bean_objstack" ;
     }




4.在jsp页面获取数据:

<%@ page language="java" import= "java.util.*" pageEncoding="UTF-8" %>
<%@ taglib uri="/struts-tags" prefix= "s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body >
    This is my JSP page. <br>
    <s:debug ></s:debug>< br/>
    1.访问request,session,application域中的内容: <br/>
    <!--
     s:property是一个输出标签,value的值就是 ognl表达式的值
     -->
    request:<s:property value="#request.msg_request" /><br/>
    session:<s:property value="#session.msg_session" /><br/>
    session['']:<s:property value="#session['msg_session']" /><br/>
    application:<s:property value="#application.msg_application" /><br/>
    attr:< s:property value ="#attr.msg_request"/>< br/>
   
   2. 把数据存放在map中,提取 <br/>
    <s:property value="#map"/>< br/>
   
   3.在request域中存放一个 map: <br/>
    <s:property value="#request.map.afds"/>< br/>
   
   4. 在map栈中存放一个map <br/>
    <s:property value="#map.afds"/>< br/>
   
   5. 在对象栈中有一个对象user: <br/>
     <!--
          把一个对象放入到对象栈中,其属性可以直接访问
      -->
     usrename:< s:property value ="username"/>< br/>
     password:<s:property value="password"/>< br/>
    
   6.在对象栈中有一个对象String: <br/>
     <!--
          如果property标签value属性不写,默认输出栈顶的元素
      -->
     <s:property /><br/>
     
   7.在对象栈中有一个对象为map: <br/>
     <s:property value="afds"/>< br/>
     
   8.在对象栈中有几个对象,这几个对象有相同的属性,获取哪个? <br/>
     <!--
          如果在对象栈中出现了几次相同的属性,则struts2内部会从栈顶依次查找,找到为止,输出
      -->
     <s:property value="username"/>< br/>
 
  9.在对象栈中有两个对象,一个是map,一个是bean,map中的key和bean中的一个属性的名称是一致的? <br/>
     <s:property value="username"/>
     </body >
</html>

0 0
原创粉丝点击