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