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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值