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     %>
模拟
原文地址:https://www.cnblogs.com/soficircle/p/7062315.html