SSH框架学习之Struts2day03 值栈和ognl表达式

1、OGNL表达式

1.1 简介

之前在web阶段学习过EL表达式,应用在JSP页面中获取域对象内容

用于struts2里面操作值栈数据,可以结合struts2里面的标签一起使用值栈

注意:ognl不属于struts2的一部分,他是单独存在的。struts2提供了ognl的jar包

1.2 ognl入门实例

第一步:导入jar包,然后引入标签库

之前在使用jstl的时候需要引入标签库,现在也一样,第一步是引入标签库
在这里插入图片描述

第二步:结合struts的标签

在这里插入图片描述

2、值栈(struts2提供的存放数据的区域)

我们之前把东西放到作用域中,现在可以用struts2提供值栈来存取数据。

2.1 servlet和action的区别

  1. servlet只在第一次访问的时候创建,创建一次,单实例
  2. action每次访问的时候,创建action

2.2 值栈存储位置

每次访问都会创建action,每个action对象拥有独立的一个值栈

2.3 获取值栈对象

用ActionContext对象获取值栈对象
在这里插入图片描述

2.4 值栈内部结构

第一部分:root,结构是list集合
一般操作都是root里面数据
在这里插入图片描述
第二部分: context,结构是map,存放一些固定的键值对
在这里插入图片描述

2.5 向值栈中放数据

s:debug标签(调试用)

访问action,执行action的方法,把方法的返回值配置到jsp页面中,在jsp里使用这个标签。
先有acton、再有值栈
通过debug,可以看到值栈的结构

2.5.1 放数据

方法1: 使用值栈对象里面的set方法

ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.set("username","laowang");

效果:栈顶多了个map
在这里插入图片描述
方法2:调用值栈里面的push方法

ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.push("abcd");

效果:栈顶多了String
在这里插入图片描述
方法3:在action定义变量,生成变量的get方法。(不需要创建值栈对象)
在这里插入图片描述
效果:在action中添加了name ,数据分配在action中,不需要map等开销
在这里插入图片描述

2.5、 值栈中取数据

步骤: 使用struts2的标签+ognl表达式获取值栈数据
<s:property value=“ognl表达式”/>

前戏:放入数据(使用第三种放法)

(1)String username;
(2) User user;
(3) List<> list;

核心步骤:在jsp中取出数据

(1) <s:property value=“username”/>

(2) <s:property value=“user.username”/>
<s:property value=“user.passowrd”/>

(3) 对于list,由三种方式可以取数据

第一种方式 在这里插入图片描述
第二种方式:迭代器迭代
在这里插入图片描述
第三种方式:
类似foreach,遍历list集合,item:user

<s:iterator value="list" var="user">
	<s:property value="#user.username"/>
</s:iterator>

解释#号:在这种机制下,帮我们从root中得到的值var存入context中
在这里插入图片描述因此我们取值就要到context中取, 因此加上#表示context

使用set、push放数据时的取法

1、 set
前戏(action中):用set放数据
stack.set(“username”,“laowang”);

核心(jsp中):
<s:property value=“username”)/>

2、push(会把数据放到名称为top的数组,我们根据数组取值)

存:stack.push(“abcd”)
取:在这里插入图片描述
至此,我们可以在struts2里面传递数据了

3、OGNL的# % 的使用

3.1 #号,用于取context域对象值

(1) 向request中放值

HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("name","laowang");

(2)用ognl取值
(域对象通常用EL表达式就行,这里只是演示)

<s:proper value="#request.name"/>

3.1 %号,用于表单展示数据

如果直接在表单标签里面使用ognl表达式,会不识别,只有加%才能识别

写法:%{ognl表达式}

 <s:textfield name="username" value="%{#request.username}></s:textfileld>

效果
在这里插入图片描述

4、实战,传递数据使用值栈

action中:使用第三种方式存入值栈
在这里插入图片描述
在这里插入图片描述
jsp中:

1、引入标签库

2、在单元格处使用表达式

在这里插入图片描述
这么写也是可以

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37591656/article/details/84726908