6、在JSP中获取值栈的数据
* 注意:
> 访问root中的数据,不需要 #
> 访问context其他对象数据 加 #
> 如果向root中存入对象的话,优先使用push方法
> 如果向root中存入集合的话,优先使用set方法
* 在OgnlContext中获取数据
> 在Action中向域对象存入值
> request: <s:property value="#request.username" />
> session: <s:property value="#session.username" />
> application:<s:property value="#application.username"/>
> attr : <s:property value="#attr.username" />
> parameters:<s:property value="#parameters.cid" />
struts.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo1" namespace="/" extends="struts-default">
<!-- 使用值栈: 压栈和取值 -->
<action name="save" class="com.itheima.demo2.ValueStack1Action" method="save">
<result name="success">/demo2/vs.jsp</result>
</action>
</package>
</struts>
例1:
Action类:
/**
* 演示值栈对象的目录结构
* @author Administrator
*/
public class ValueStack1Action extends ActionSupport{
/**
* 演示从值栈中获取值
*/
public String save() {
// 获取值栈对象
ValueStack vs = ActionContext.getContext().getValueStack();
// 压栈
vs.push("美美");
vs.set("msg", "小凤");
return SUCCESS;
}
}
vs.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
// 压栈:vs.push("美美");
// 获取到栈顶的值
<s:property value="[0].top" />
// 栈顶是map集合,通过key获取值
// vs.set("msg","小凤");
<s:property value="[0].top.msg" />
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
例2:
Action类:
/**
* 演示值栈对象的目录结构
* @author Administrator
*/
public class ValueStack1Action extends ActionSupport{
/**
* 演示从值栈中获取值
*/
public String save() {
// 获取值栈对象
ValueStack vs = ActionContext.getContext().getValueStack();
// 创建User对象
User user = new User("小苍","1234");
// 压栈
vs.push(user);
// 使用set压栈
vs.set("user", user);
return SUCCESS;
}
}
JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
<!-- push取值的方式 -->
<s:property value="username"/>
<!-- set取值的方式 -->
<s:property value="[0].top.user.username" />
<s:property value="[0].top.user.password" />
<!-- 省略关键字
<s:property value="user.username"/>
<s:property value="user.password"/>
-->
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
例3:
Action类:
/**
* 演示值栈对象的目录结构
* @author Administrator
*/
public class ValueStack1Action extends ActionSupport{
/**
* 演示从值栈中获取值
*/
public String save() {
// 获取值栈对象
ValueStack vs = ActionContext.getContext().getValueStack();
List<User> ulist = new ArrayList<User>();
ulist.add(new User("熊大","123"));
ulist.add(new User("熊二","456"));
ulist.add(new User("熊三","789"));
// 把ulist集合压栈
vs.push(ulist);
vs.set("ulist", ulist);
return SUCCESS;
}
}
JSP1:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
<!-- push方式的取值 -->
<s:property value="[0].top[0].username"/>
<s:property value="[0].top[0].password"/>
<s:property value="[0].top[1].username"/>
<s:property value="[0].top[1].password"/>
<s:property value="[0].top[2].username"/>
<s:property value="[0].top[2].password"/>
<!-- set方式取值 -->
<s:property value="[0].top.ulist[0].username" />
<s:property value="ulist[0].username" />
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
JSP2:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
<!--
迭代的标签
属性:
* value 要迭代的集合,需要从值栈中获取
* var 迭代过程中,遍历的对象
* var编写的话, 把迭代产生的对象默认压入到context栈中, 从context栈取值,加#
* var不编写,默认把迭代产生的对象压入到root栈中
for(User user:ulist)
-->
// 编写var的属性
<s:iterator value="[0].top.ulist" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
</s:iterator>
// 没有编写var属性,[0].top都是可以省略的
<s:iterator value="[0].top.ulist">
<s:property value="username"/>
<s:property value="password"/>
</s:iterator>
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
例4:
Action类:
/**
* 演示值栈对象的目录结构
* @author Administrator
*/
public class ValueStack1Action extends ActionSupport{
/**
* 演示从值栈中获取值
*/
public String save() {
// 获取值栈对象
ValueStack vs = ActionContext.getContext().getValueStack();
// 从context栈中获取值, 底层已经封装request session 对象, 操作的就是map集合
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("msg", "美美");
request.getSession().setAttribute("msg", "小凤");
return SUCCESS;
}
}
vs.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
<!-- 从context栈中获取值, 加#号 -->
<s:property value="#request.msg"/>
<s:property value="#session.msg"/>
<s:property value="#parameters.id"/>
<s:property value="#attr.msg"/>
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
7、EL表达式也会获取到值栈中的数据
* StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(request);
> 对Request对象进行了包装,StrutsRequestWrapper
> 增强了request的getAttribute
Object attribute = super.getAttribute(key);
if( attribute == null){
attribute = stack.findValue(key);
}
> 访问request范围的数据时,如果数据找不到,就会去值栈中找
> request对象具备访问值栈数据的能力 (查找root的数据)
Action类:
/**
* 演示值栈对象的目录结构
* @author Administrator
*/
public class ValueStack1Action extends ActionSupport{
/**
* 演示从值栈中获取值
*/
public String save() {
// 获取值栈对象
ValueStack vs = ActionContext.getContext().getValueStack();
List<User> ulist = new ArrayList<User>();
ulist.add(new User("熊大","123"));
ulist.add(new User("熊二","456"));
ulist.add(new User("熊三","789"));
// 把ulist集合压栈
vs.set("ulist", ulist);
return SUCCESS;
}
}JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>从值栈中获取值</h3>
<!--
在JSP页面上可以使用EL和JSTL标签库来取值
-->
<c:forEach items="${ ulist }" var="user">
${ user.username } -- ${ user.password }
</c:forEach>
<!-- 在JSP页面上,查看值栈的内部结构 -->
<s:debug></s:debug>
</body>
</html>
本文详细介绍了在Struts2框架中如何利用值栈进行数据的存储与获取,包括使用push与set方法的区别,以及如何从请求、会话等不同域对象中获取数据。并通过多个示例展示了如何在JSP页面上展示这些数据。
642

被折叠的 条评论
为什么被折叠?



