struts2 contextMap
一、contextMap中的数据操作
root根:List
|
||||||||||||||
contextMap: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 }
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 }
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>
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>
如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置
见上面代码
特殊说明:当s:property不给定value属性时,默认取栈顶对象。
见上面代码
OGNL的使用总结:
1.取根中对象的属性,不使用#。
2.取contextMap中key的值,要使用#。
2.2、ValueStack的其他方法:
a、setValue方法
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方法,会报错。
在Jsp页面上获取【李四】
b、set方法
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));
细节问题:
当按照如下方式,往根中存放数据时,根中元素是什么顺序?
使用<s:debug/>标签查看:
c、findValue:我们在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 %>