zoukankan      html  css  js  c++  java
  • struts2 contextMap

    一、contextMap中的数据操作

                               

    root根:List

    元素1

    元素2

    元素3

    元素4

    元素5

    contextMap:Map

    key

    value

    application

    Map

    key

    value

    name

    test

    session

    Map

    request

    Map

    attr

    Map

          1、存数据:

                       需要熟悉ActionContext和valueStack的API。框架为我们存数据。

               1.1、利用ActionContext存数据

                  

     1 /**
     2  * 利用ActionContext存数据
     3  * @author zhy
     4  *
     5  */
     6 public class Demo1Action extends ActionSupport {
     7 
     8     public String execute(){
     9         //1.得到ActionContext对象
    10         ActionContext context = ActionContext.getContext();//这是从当前线程的局部变量中获取引用
    11         //2.往map中存入数据
    12         context.put("contextMap", "hello contextMap");//把数据直接存到了大Map中
    13         
    14         //往session中存数据
    15         //第一种方式:获取key为session的map
    16         Map<String,Object> sessionAttribute = context.getSession();//得到key值为session的小map
    17         sessionAttribute.put("sessionMap", "hello sessionMap");
    18         //第二种方式:直接使用原始的HttpSession对象
    19         HttpSession session = ServletActionContext.getRequest().getSession();
    20         session.setAttribute("sessionMap1", "hello sessionMap1");
    21         
    22         //往ServletContext域中存数据
    23         //第一种方式:获取key值为application的map
    24         Map<String,Object> applicationAttribute = context.getApplication();
    25         applicationAttribute.put("applicationMap", "hello applicationMap");
    26         //第二种方式:获取原始ServletContext对象
    27         ServletContext application = ServletActionContext.getServletContext();
    28         application.setAttribute("applicationMap1", "hello applicationMap1");
    29         
    30         
    31         
    32         
    33         return SUCCESS;
    34     }
    35 }
    DemoAction1

               1.2、利用ValueStack存数据

                                         a、如何获取ValueStack:

                        

     1 /**
     2  * 利用VauleStack存数据
     3  * @author zhy
     4  *
     5  */
     6 public class Demo2Action extends ActionSupport {
     7 
     8     private String name = "泰斯特2";
     9     
    10     public String execute(){
    11         //获取ValueStack对象的引用
    12         //第一种方式:获取HttpServletRequest对象,通过对象的getAttribute方法,从域中取
    13         //1.获取request对象
    14         HttpServletRequest request = ServletActionContext.getRequest();
    15         //2.根据key获取ValueStack对象的引用
    16               ValueStack vs1 = (ValueStack)request.getAttribute("struts.valueStack");
    17         System.out.println(vs1.hashCode());
    18         
    19         //第二种方式:先获取ActionContext对象,再取出requestMap,然后通过map的get方法获取
    20         //1.获取ActionContext对象
    21         ActionContext context = ActionContext.getContext();
    22         //2.获取requestMap
    23         Map<String,Object> requestAttribute = (Map<String,Object>)context.get("request");
    24         //3.根据key获取对象的引用
    25         ValueStack vs2 = (ValueStack)requestAttribute.get("struts.valueStack");
    26         System.out.println(vs2.hashCode());
    27         
    28         
    29         //第三种方式:使用ActionContext对象的方法,直接获取ValueStack对象的引用
    30         ValueStack vs3 = context.getValueStack();
    31         System.out.println(vs3.hashCode());
    32         
    33 }
    DemoAction2

                                         b、ValueStack中的getRoot()方法:

                               

                                  c、CompoundRoot是什么:

                               

                                  d、栈操作:

                               压栈操作                 

    1     //栈的操作
    2         ActionContext context = ActionContext.getContext();
    3         ValueStack vs = context.getValueStack();
    4         //压栈操作
    5         vs.push(new Student("泰斯特",21));
    压栈

          2、取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)

                                使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。

               2.1、使用s:property取数据

                                   a、取contextMap中的数据,需使用#

                                               

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="/struts-tags" prefix="s" %>
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>
     6     <title>取ActionContext数据</title>
     7   </head>
     8   <body>
     9       <s:debug/>
    10       <%--使用s:property来获取ActionContext中的数据。
    11           value属性的取值是一个OGNL表达式。--%>
    12       <br/>---------获取大Map中的数据-------------<br/>
    13       <%--获取大Map中的数据,在取的时候是#key名称--%>
    14       <s:property value="#contextMap"/>
    15       <br/>---------获取小Map中的数据-------------<br/>
    16       <%--获取大Map中小Map的数据 ,使用#大Map的key.小Map的key--%>
    17       <s:property value="#session.sessionMap1"/>
    18       <s:property value="#application.applicationMap1"/>
    19   </body>
    20 </html>
    Map.jsp

                                  b、取contextMap里面ValueStack中对象的属性:直接写属性名

                   

     1 <%@page import="com.opensymphony.xwork2.ActionContext"%>
     2 <%@page import="com.opensymphony.xwork2.util.ValueStack"%>
     3 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     4 <%@ taglib uri="/struts-tags" prefix="s" %>
     5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     6 <html>
     7   <head>
     8     <title>取ValueStack中的数据</title>
     9   </head>
    10   <body>
    11     <%--使用s:property标签,获取ValueStack中的元素。
    12         value属性的取值是一个OGNL表达式。它只能获取元素中的属性。
    13         注意:
    14             取ValueStack中的对象属性时,不使用#。
    15         它是从栈顶逐个对象查找指定的属性名称。只要找到了,就不再继续查找。
    16     --%>
    17     <s:property value="name"/><br/>
    18     <%--获取ValueStack中指定位置的属性 :
    19         详情请见解释图
    20     --%>
    21    0-name <s:property value="[0].name" /><br/>
    22    1-name <s:property value="[1].name" /><br/>
    23    2-name <s:property value="[2].name" /><br/>
    24    3-name <s:property value="[3].name" /><br/>
    25    4-name <s:property value="[4].name" /><br/>
    26     <%--去栈顶map中的元素 --%>
    27     <s:property value="s1.name" /><br/>
    28     
    29     <%--当s:property什么都不写:
    30         默认取栈顶元素
    31      --%>
    32     <s:property />
    33     <%//模拟原理:其实全是ValueStack的findValue和findString
    34       ValueStack vs = ActionContext.getContext().getValueStack();
    35       Object obj = vs.findValue("[1].name");
    36       out.print("<br/>-------------------------<br/>");
    37       out.print(obj);
    38     %>
    39       <s:debug/>
    40   </body>
    41 </html>
    valueStack.jsp

                                       如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置

                见上面代码

                                       特殊说明:当s:property不给定value属性时,默认取栈顶对象。

                        见上面代码

                                OGNL的使用总结:

                                       1.取根中对象的属性,不使用#

                                       2.contextMapkey的值,要使用#

                  2.2、ValueStack的其他方法:

                                asetValue方法

                                      

     1     /*
     2          * ValueStack的其他方法
     3          * setValue(String expr, Object value);
     4          *         String expr:它是一个OGNL表达式
     5          *         Object value:我们要操作的数据
     6          *  把数据存到哪里去?
     7          *      看expr是否使用了#
     8          *      如果使用了#,操作的就是ContextMap中
     9          *      如果没使用#,操作的就是ValueStack
    10          */
    11         vs.setValue("#name", "张三");//把数据放到ContextMap中。 key是name    valeu=张三
    12         vs.setValue("name", "李四");//把ValueStack中第一个name属性的值换成李四。如果没有一个name属性的对应的setName方法,会报错。
    setValue方法

                                       在Jsp页面上获取【李四】

                                bset方法

                                      

     1     /*
     2          *set(String key, Object o);
     3          *  String key : Map的key
     4          *  Object o : map的value
     5          *  如果栈顶是一个Map元素,直接把key作为map的key,把Object作为map的value存入。存入的是栈顶。
     6          *  如果栈顶不是一个Map元素,创建一个Map对象,把key作为map的key,把Object作为map的value,压入栈顶。
     7          */
     8         vs.set("s1", new Student("王五",18));
     9         vs.push(new Student("test",23));
    10         vs.set("s2", new Student("aaa",28));
    set方法

                                       细节问题:

                                              当按照如下方式,往根中存放数据时,根中元素是什么顺序?

                                             

                                              使用<s:debug/>标签查看:

                                             

                                cfindValue:我们在Jsp上调用的都是findValue

                                        

    1    <s:property />
    2     <%//模拟原理:其实全是ValueStack的findValue和findString
    3       ValueStack vs = ActionContext.getContext().getValueStack();
    4       Object obj = vs.findValue("[1].name");
    5       out.print("<br/>-------------------------<br/>");
    6       out.print(obj);
    7     %>
    模拟
  • 相关阅读:
    正则表达式复习 (?<=) (?=)
    HTML 30分钟入门教程
    C# 多线程详解
    C# List
    C# 枚举
    C# 线程数
    C# 泛型2
    C# 泛型
    C# 结构体
    不用Google Adsense的84个赚钱方法
  • 原文地址:https://www.cnblogs.com/soficircle/p/7062315.html
Copyright © 2011-2022 走看看