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>