(Struts2)值栈(二)

本文详细介绍了在Struts2框架中如何利用值栈进行数据的存储与获取,包括使用push与set方法的区别,以及如何从请求、会话等不同域对象中获取数据。并通过多个示例展示了如何在JSP页面上展示这些数据。

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>

下一篇:OGNL表达式的特殊符号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值