本节内容:
1.ognl概述
2.ognl入门案例
3.值栈
4.如何获取值栈对象
5.值栈内部结构
6.往值栈中存储数据
7.取值值栈中的数据
一、OGNL概述:
1.在web阶段我们学习过EL表达式,EL表达式,在jsp中获取域对象中的值。
2.OGNL是一种表达式,这个表达式功能更强大。
OGNL在Struts2中操作值栈数据
一般OGNl和Struts2的标签一起使用操作值栈数据
OGNL不是Struts2的一部分,他是一个单独的项目,经常和Struts2一起使用
使用OGNL:首先导入jar包,但是Struts2提供了jar包
二、OGNL入门案例:
使用OGNL+struts2标签实现计算字符串长度
OGNL支持对象方法调用
操作步骤:我们需要在jsp页面引入struts2的标签
<%@ taglib prefix="s" uri="/struts-tags" %>
ognl与struts2中的一个标签:property
<%--value中就写OGNL表达式--%> <s:property value="'hello'.length()"></s:property>
三、值栈:
什么是值栈
1.在我们学习web的时候,我们通常使用域对象在servlet中进行数据的保存,在jsp使用el表达式来取值
2.在struts2中提供的一种存储机制,类似于域对象,是值栈,可以存值与取值
我们在action中把数据存储到值栈中,在页面中获取值栈数据
3.servlet与Action的区别:
1.Servlet:默认在第一次访问时创建,只创建一次
2.Action:访问时创建,每次访问action时候,都会创建action对象,创建多次,是多实例的
值栈存储位置:
(1).每次访问action时候,都会创建一个action对象,
(2).在每个action对象中都会存在一个值栈对象。
四、获取值栈对象
1.获取值栈对象的方式:
常用方式: 使用ActionContext类里面的方法得到值栈对象
// 获取值栈对象 // 获取ActionContext对象 ActionContext actionContext = ActionContext.getContext (); //值栈对象 ValueStack valueStack = actionContext.getValueStack ();
五、值栈的内部结构:
值栈分为2部分:
第一部分root :结构是list 一般都是操作root中的数据
第二部分context:结构是map
六、向值栈存储数据
值栈存储数据的方式:
1.获取值栈对象,调用值栈对象里面的set方法
//获取值栈对象 // 获取ActionContext对象 ActionContext actionContext = ActionContext.getContext (); //值栈对象 ValueStack valueStack = actionContext.getValueStack (); valueStack.set ("key","value");
2.获取值栈对象,调用值栈对象里面的push方法
valueStack.push ("value");
3.在action中定义变量生成变量的get方法。(重点)
package com.struts.action; public class ValueStackAction { //定义变量 private String name; //生成变量的get方法 public String getName() { return name; } public String show()throws Exception{ //在action方法中向变量设置值 name="value"; return "success"; } }
存储对象
步骤:1.定义对象变量
2.生成get方法
3.向对象设置值
package com.struts.action; public class ValueStackActionObject { //定义对象 private User user = new User (); //生成get方法 public User getUser() { return user; } public String show(){ user.setUsername ("小明"); user.setAge (12); user.setPwd ("123456"); return "success"; } }
存储list集合
定义list集合的变量
生成变量的get方法
设置集合的值
package com.struts.action; import java.util.ArrayList; import java.util.List; public class ValueStackActionList { //定义对象 private List<User> list = new ArrayList<User> (); //生成get方法 public List<User> getList() { return list; } public String show(){ User user = new User (); user.setUsername ("小明"); user.setAge (12); user.setPwd ("123456"); User user1 = new User (); user1.setUsername ("小王"); user1.setAge (13); user1.setPwd ("1234567"); list.add (user); list.add (user1); return "success"; } }
七、从值栈中获取数据
使用struts2标签+ognl表达式获取值栈数据
<s:property value="ognl表达式"></s:property>
获取字符串数据
package com.struts.action; public class ValueStackAction { private String username; //生成变量的get方法 public String getUsername() { return username; } public String show()throws Exception{ //在action方法中向变量设置值 username="小王"; return "success"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>$Title$</title> </head> <body> <%--<%–value中就写OGNL表达式–%>--%> <%--<s:property value="'hello'.length()"></s:property>--%> <s:property value="username"></s:property> </body> </html>
获取对象
package com.struts.action; public class ValueStackActionObject { //定义对象 private User user = new User (); //生成get方法 public User getUser() { return user; } public String show(){ user.setUsername ("小明"); user.setAge (12); user.setPwd ("123456"); return "success"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>$Title$</title> </head> <body> <%--<%–value中就写OGNL表达式–%>--%> <%--<s:property value="'hello'.length()"></s:property>--%> <%--获取字符串--%> <s:property value="username"></s:property> <%--获取对象 对象.属性--%> <s:property value="user.username"></s:property> </body> </html>
获取list集合
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>$Title$</title> </head> <body> <%--<%–value中就写OGNL表达式–%>--%> <%--<s:property value="'hello'.length()"></s:property>--%> <%--获取字符串--%> <s:property value="username"></s:property> <%--获取对象 对象.属性--%> <s:property value="user.username"></s:property> <%--获取集合list中的数据--%> <%--第一种方式--%> <s:property value="list[0].username"></s:property> <s:property value="list[1].username"></s:property> <%--第二种方式 使用struts2中的迭代标签--%> <s:iterator value="list"> <s:property value="username"></s:property> </s:iterator> <%--第三中方式 遍历list集合,得到每个user对象 把每次遍历出来的user对象放到context里面获取context里面数据的特点 写ognl表达式:使用特殊符号:#--%> <s:iterator value="list" var="user"> <s:property value="#user.username"></s:property> </s:iterator> </body> </html>
获取set向值栈添加的数据
ActionContext actionContext = ActionContext.getContext ();
//值栈对象
ValueStack valueStack = actionContext.getValueStack ();
valueStack.set ("key","value");
<%--set方式存储的数据获取 根据名字取值--%> <s:property value="key"></s:property>
获取push向值栈中添加的数据
valueStack.push ("value");
使用push方法设置值,没有名称,只有设置的值
向值栈放数据,把向值栈的数据存到数组中,数组的名称top根据数组获取
<%--push方式存储的数据获取 根据数组获取--%> <s:property value="[0].top"></s:property>
EL表达式与JSTL也可以获取到值栈中的数据