index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>
值栈
<a href="${pageContext.request.contextPath}/valueStackAction">值栈</a>
</body>
</html>
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>
<!-- 1. 局部结果配置-->
<package name="default" extends="struts-default">
<!-- 配置值栈的Action -->
<action name="valueStackAction" class="com.liuyongqi.struts2.action.ValueStackAction">
<result>success.jsp</result>
</action>
</package>
</struts>
ValueStackAction
package com.liuyongqi.struts2.action;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.liuyongqi.struts2.entity.Users;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack;
/**
* 值栈的Action
* @author Administrator
*2018年7月17日下午2:11:51
*/
@SuppressWarnings("serial")
public class ValueStackAction extends ActionSupport{
private String usersname;
private Users user=new Users();
private List<Users> list = new ArrayList<Users>();
public String getUsersname() {
return usersname;
}
public Users getUser() {
return user;
}
public List<Users> getList() {
return list;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//获取值栈对象
System.out.println("sss");
//三.在action中定义变量(或对象、集合),使用相应的get方法(推荐常用)
//Step1:在action定义变量
//Step2:生成变量的get方法
//Step3:在执行方法里面为变量赋值
usersname="admins";
//四.使用上述方法向值栈中存放一个对象
user.setUsername("liuyongqi");
user.setPassword("888888");
//五.使用上述方法向值栈中存放一个List集合
for (int i = 0; i < 10; i++) {
Users users = new Users("zs"+(i+1), "aaaaaaaaa"+(i+1));
list.add(users);
}
//1. 获取ActionContext类的对象
ActionContext actionContext = ActionContext.getContext();
//2. 调用ActionContext中的方法获取值栈对象
ValueStack valueStack = actionContext.getValueStack();
//往Action实例对象的值栈存入数据有三种方式:
// 一.使用值栈对象中的set方法
//Step1:在action中获取值栈对象;
//Step2:调用值栈对象的set方法存值
valueStack.set("name2", "liuyongqis");
//二.使用值栈对象中的push方法
//Step1:在action中获取值栈对象;
//Step2:调用值栈对象的push方法存值。
valueStack.push("aaaa");// 压栈操作,压入栈顶
//ServletActionContext.getRequest().getSession().setAttribute("valueStack", valueStack);
ServletActionContext.getRequest().getSession().setAttribute("name1", "bbbbbb");
Map<String, Object> map = valueStack.getContext();
System.out.println(map.entrySet());
System.out.println("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
CompoundRoot root = valueStack.getRoot();
System.out.println(root);
return SUCCESS;
}
}
成功页面success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>
<h1>值栈</h1>
<s:debug></s:debug>
<br/>
<h1>OGNL的基本操作</h1>
<!-- 可以调方法,测试字符串'haha'的长度 -->
<s:property value="'haha'.length()"/>
<br/>
<h1>OGNL中#、%的使用 </h1>
<!-- 1.#使用:使用 # 来获取context里面的数据-->
#使用:使用 # 来获取context里面的数据<!--格式:#context的key名称.域对象名称-->
<br/>
<s:property value="#session.name1"/>
<br/>
<h1>%使用</h1>
如果直接在struts2表单标签里面使用OGNL表达式Struts2不能识别,需要在OGNL表达式前加%。
<br/>
<!-- 错误的写法-->
<s:textfield name="nam1" value="#session.name1"></s:textfield>错误的写法<br/>
<!-- 正确的写法-->
<s:textfield name="nam1" value="%{#session.name1}"></s:textfield>正确的写法
<!-- OGNL获取值栈中的数据-->
<h1>OGNL获取值栈中的数据</h1>
<h2>获取使用set方法存入值栈中的值</h2>
<s:property value="name2"/><br/>
<!--获取push方法设置的值-->
<h2>获取push方法设置的值</h2>
<s:property value="[0].top"/><br/>
<!--获取使用变量的get方法存入值栈中的值-->
<h2>获取使用变量的get方法存入值栈中的值</h2>
<!-- 获取get方式存入值栈的字符串-->
<h3>获取get方式存入值栈的字符串</h3>
<s:property value="usersname" /><br/>
<!--获取get方式存入值栈的对象-->
<h3>获取get方式存入值栈的对象</h3>
<s:property value="%{user.username}"/>
<s:property value="user.password"/><br/>
<!-- (3)获取get方式存入值栈的集合 -->
<h3>获取get方式存入值栈的集合</h3>
<h4>获取list的值第一种方式</h4>
<s:property value="list[0].username"/>
<s:property value="list[0].password"/>
<br/>
<h4>获取list的值第二种方式</h4>
<!-- 使用struts2标签 类似jstl的foreach标签
s:iterator:遍历值栈的list集合
-->
<s:iterator value="list">
<s:property value="username"/>
<s:property value="password"/>
<br/>
</s:iterator>
<br/>
<h4>获取list的值第三种方式</h4>
<!--
遍历值栈list集合,得到每个user对象
机制: 把每次遍历出来的user对象放到 context里面
获取context里面数据特点:写ognl表达式,需要
使用特殊符号 #
-->
<s:iterator value="list" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<br/>
</s:iterator>
</body>
</html>