Struts之值栈

1.ognl表达式

支持 “对象.方法”形式。

ognl.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>

	<s:property value="'小小的太阳'.length()"/><br>
	<s:property value="'xxdty'.toUpperCase()"/> 

</body>
</html>


2.值栈简介

每次访问,都会创建一个Action对象,每个Action对象中有且只有一个值栈,值栈中含有其所属的Action的引用。

案例:访问ValueStackAction.action,转发到valueStack.jsp,valueStack.jsp里含有<s:debug>,用于查看值栈结构。

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport{

	public String execute(){
		/**
		 * 每个Action对象中,有且只有一个值栈,栈顶元素是所属的Action的引用
		 * 值栈中有:root 和 context
		 * root 实际是一个List集合
		 * context实际是一个Map集合,其内部存在几个重要的键值对,分别如下:
		 * key  		-  value
		 * request  	-  request对象的引用
		 * session  	-  session对象的引用
		 * application  -  ServletContext对象的引用
		 */
		
		ActionContext actionContext = ActionContext.getContext();
		// 获取值栈
		ValueStack valueStack1 = actionContext.getValueStack();
		ValueStack valueStack2 = actionContext.getValueStack();
		
		System.out.println(valueStack1);
		System.out.println(valueStack2);
		System.out.println(valueStack1==valueStack2);
		
//		com.opensymphony.xwork2.ognl.OgnlValueStack@50c4d47
//		com.opensymphony.xwork2.ognl.OgnlValueStack@50c4d47
//		true
		
		return SUCCESS;
	}
	
}

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>

	<constant name="struts.i18n.encoding" value="UTF-8"></constant>
	
	<package name="demo1" namespace="/" extends="struts-default">
		<action name="valueStackAction" class="zh.action.demo.ValueStackAction">
			<result name="success">/valueStack.jsp</result>
		</action>
	</package>
	
</struts>

valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>

	<!-- 此标签可查看值栈的结构以及存储的数据,显示在页面 -->
	<s:debug></s:debug>

</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
 <!--  配置Struts的拦截器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

3.向值栈中存数据的三种方式

第一种方式:ValueStack.set(key,value)

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport{

	public String execute(){
	
		ActionContext actionContext = ActionContext.getContext();
		// 获取值栈
		ValueStack valueStack = actionContext.getValueStack();
		// 向值栈中存数据
		valueStack.set("person1", "乔峰");
		valueStack.set("person2", "虚竹");
		valueStack.set("person3", "段誉");
		return SUCCESS;
		
	}
	
}

valueStack.jsp显示


第二种方式:ValueStack.push(value)

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport{

	public String execute(){
	
		ActionContext actionContext = ActionContext.getContext();
		// 获取值栈
		ValueStack valueStack = actionContext.getValueStack();
		// 向值栈中存数据
		valueStack.push("逍遥派");
		valueStack.push("灵鹫宫");
		return SUCCESS;
		
	}
	
}

valueStack.jsp显示


第三种方式:在Action中创建属性,生成getXXX()

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 向值栈存数据,最常用的方法
 * @author ZH
 *
 */
public class ValueStackAction extends ActionSupport{
	
	/**
	 * 创建属性,删除get方法,然后在此Action中为其赋值,
	 * 这样,该属性及其值就已经存入值栈中了,
	 * 更具体地,是存入到值栈的Action引用中了,而不是栈顶。
	 */
	private String name = "王语嫣";// 如果此处未赋值,那么可以在方法中为name赋值
	public String getName() {
		return name;
	}

	public String execute(){
		// name = "王语嫣";
		return SUCCESS;
	}
	
}

valueStack.jsp显示


4.向值栈中存字符串/对象/List/Map

User.java

package zh.action.demo;

public class User {

	private String name;
	private String resume;

	public User() {

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getResume() {
		return resume;
	}

	public void setResume(String resume) {
		this.resume = resume;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", resume=" + resume + "]";
	}

}

valueStackAction.java

package zh.action.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 向值栈存数据,最常用的方法
 * @author ZH
 */
public class ValueStackAction extends ActionSupport{
	
	// 声明字符串
	private String book;
	public String getBook() {
		return book;
	}
	
	// 声明对象
	private User user;
	public User getUser() {
		return user;
	}
	
	// 声明List
	private List<User> userList;
	public List<User> getUserList() {
		return userList;
	}

	// 声明Map
	private Map<String,User> userMap;
	public Map<String, User> getUserMap() {
		return userMap;
	}
	
	public String execute(){
		// 为字符串赋值
		book = "天龙八部";
		
		// 为对象赋值
		user  = new User();
		user.setName("萧峰");
		user.setResume("我乃契丹人,再也不是你们丐帮帮主了");
		
		// 为List集合赋值
		userList = new ArrayList<User>();// 也可以在声明的同时创建此List集合
		User user1 = new User();
		user1.setName("王语嫣");
		user1.setResume("我熟读各家武学");
		User user2 = new User();
		user2.setName("段誉");
		user2.setResume("我会六脉神剑哟");
		userList.add(user1);
		userList.add(user2);
		
		// 为Map集合赋值
		userMap = new HashMap<String, User>();// 也可以在声明的同时创建此Map集合
		userMap.put("神仙姐姐", user1);
		userMap.put("大理世子", user2);
		
		return SUCCESS;
	}
	
}

valueStack.jsp显示


5.从值栈中取字符串/对象/List/Map

ValueStackAction.java

package zh.action.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 向值栈存数据,最常用的方法
 * @author ZH
 *
 */
public class ValueStackAction extends ActionSupport{
	
	// 声明字符串
	private String book;
	public String getBook() {
		return book;
	}
	
	// 声明对象
	private User user;
	public User getUser() {
		return user;
	}
	
	// 声明List
	private List<User> userList;
	public List<User> getUserList() {
		return userList;
	}

	// 声明Map
	private Map<String,User> userMap;
	public Map<String, User> getUserMap() {
		return userMap;
	}
	
	public String execute(){
		// 为字符串赋值
		book = "天龙八部";
		
		// 为对象赋值
		user  = new User();
		user.setName("萧峰");
		user.setResume("我乃契丹人,再也不是你们丐帮帮主了");
		
		// 为List集合赋值
		userList = new ArrayList<User>();
		User user1 = new User();
		user1.setName("王语嫣");
		user1.setResume("我熟读各家武学");
		User user2 = new User();
		user2.setName("段誉");
		user2.setResume("我会六脉神剑哟");
		userList.add(user1);
		userList.add(user2);
		
		// 为Map集合赋值
		userMap = new HashMap<String, User>();
		userMap.put("神仙姐姐", user1);
		userMap.put("大理世子", user2);
		
		return SUCCESS;
	}
	
}

valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
	<p>从值栈中取出 通过第三种方式存入的数据,
	第三种方式:创建属性,生成get方法</p>

	<h3>取字符串</h3>
	<s:property value="book"/>
	<hr>
	
	<h3>取对象</h3>
	<s:property value="user.name"/>,<s:property value="user.resume"/>
	<hr>
	
	<h3>取List</h3>
	第一种方式<br>
	<s:property value="userList[0].name"/>,<s:property value="userList[0].resume"/><br>
	<s:property value="userList[1].name"/>,<s:property value="userList[1].resume"/><br>
	<hr>
	第二种方式<br>
	<s:iterator value="userList">
		<!-- 默认自动遍历List里面的每一个User,因此这里直接写属性名称 -->
		<s:property value="name"/>,<s:property value="resume"/><br>
	</s:iterator>
	<hr>
	第三种方式<br>
	<s:iterator value="userList" var="user">
		<!-- 使用var属性,会把user放到context中,取context中数据,要在ognl表达式前加# -->
		<s:property value="#user.name"/>,<s:property value="#user.resume"/><br>
	</s:iterator>
	<hr>
	
	<h3>取Map</h3>
	<s:property value="userMap['神仙姐姐'].name"/>,<s:property value="userMap['神仙姐姐'].resume"/><br>
	<s:property value="userMap['大理世子'].name"/>,<s:property value="userMap['大理世子'].resume"/><br>
	<hr>

</body>
</html>

6.获取set方法存入的数据

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport {

	public String execute() {

		ActionContext actionContext = ActionContext.getContext();
		ValueStack valueStack = actionContext.getValueStack();
		
		valueStack.set("username", "契丹人");

		User user = new User();
		user.setName("萧峰");
		user.setResume("我是契丹人萧峰");
		valueStack.set("description", user);
		
		return SUCCESS;
	}

}

valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
	
	<s:property value="username"/><br>
	
	<s:property value="description.name"/>,<s:property value="description.resume"/>
	
</body>
</html>

7.获取push方法存入的数据

ValueStackAction.java

package zh.action.demo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport {

	public String execute() {

		/**
		 * push方法向值栈中存入数据,会放到一个叫top数
		 */
		
		ActionContext actionContext = ActionContext.getContext();
		ValueStack valueStack = actionContext.getValueStack();
		
		valueStack.push("契丹人");// top[1]
		
		User user  = new User();// top[0],后存入的数据,其索引为0
		user.setName("萧远山");
		user.setResume("我是萧峰的老子");
		valueStack.push(user);
		
		return SUCCESS;
	}

}

valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
	
	<s:property value="[0].top.name"/>,<s:property value="[0].top.resume"/>
	<hr>
	<s:property value="[1].top"/>
	
</body>
</html>

8.在页面获取域对象中数据

ValueStackAction.java

package zh.action.demo;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ValueStackAction extends ActionSupport {

	public String execute() {

		ActionContext actionContext = ActionContext.getContext();

		// 向request session servletContext 域中存入数据
		actionContext.put("request_name1", "request_value1");
		actionContext.getSession().put("session_name1", "session_value1");
		actionContext.getApplication().put("application_name1",
				"application_value1");

		// 或者
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("request_name2", "request_value2");
		request.getSession().setAttribute("session_name2", "session_value2");
		ServletActionContext.getServletContext().setAttribute(
				"application_name2", "application_value2");

		return SUCCESS;
	}

}

valuestack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
	
	<p>获取request、session、ServletContext域中的数据,ognl表达式前要加#,
	因为,这些域对象都存在context中,key固定,value是它们各自的引用</p>
	
	<s:property value="#request.request_name1"/>, <s:property value="#request.request_name2"/><br>
	
	<s:property value="#session.session_name1"/>, <s:property value="#session.session_name2"/><br>
	
	<s:property value="#application.application_name1"/>, <s:property value="#application.application_name2"/><br>
	
</body>
</html>

9.%号使用

直接在struts2表单标签里面使用ognl表达式,不会被不识别,只有在加“%”后才会被识别。

ValueStackAction.java

package zh.action.demo;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ValueStackAction extends ActionSupport {

	public String execute() {

		ActionContext actionContext = ActionContext.getContext();

		// 向 request 域中存入数据
		actionContext.put("request_name1", "request_value1");
	
		// 或者
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("request_name2", "request_value2");

		return SUCCESS;
	}

}

valueStack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
	
	<p>直接在struts2表单标签里面使用ognl表达式,不会被不识别,只有在加“%”后才会被识别</p>
	
	<s:textarea value="%{#request.request_name1}"></s:textarea>
	<s:textarea value="%{#request.request_name2}"></s:textarea>
	
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_41706150/article/details/80978693