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>
|