概述
一、OGNL概述:
是一种表达式,功能比EL表达式更为强大,一般和struts2标签一起使用操作值栈数据。ONGL不是struts2的一部分,只是经常和struts2标签一起使用。
使用时,需要导入jar包。并且在jsp页面需要引入标签库
<%@ taglib uri="/struts-tags" prefix="s" %>
二、什么是值栈
在之前的web阶段,在servlet里面进行操作,把数据放到域对象中,在页面中使用El表达式获取其中的值,域对象,在一定范围内,进行存值取值。
在struts2中,本身提供了一种存储机制,类似于域对象,是值栈,可以进行存值和取值。在Action中把数据存储到值栈中,在页面进行获取。
Servlet和值栈的区别:
Servlet默认是在第一次访问的时候创建,只创建一次,是单实例对象
Action是每次访问都会创建对象,是多实例对象
值栈的存储位置
每次访问的时候都会创建Action对象,每个Action对象中都有一个值栈对象(只有一个),两次获取值栈对象,输出地址,会发现他们的地址一样。
三、获取值栈(有很多种方式)
常用方式:使用ActionContext类中的方法得到值栈对象。
public class ActionStack extends ActionSupport {
@Override
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
return NONE;
}
}
栈:元素先进后出,放下一个元素叫压栈,最上面的元素叫栈顶元素。
值栈分为两部分:一是root部分,是list结构,二是context部分,是Map结构。
一般操作的都是root里面的数据
context部分中key的值一般都是固定的,如request,session等,value是其对应的引用。
struts2里面标签 s:debug,使用这个标签可以查看值栈结构和存储值
(1)访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签
(2)点击这个连接,即可看到其结构。
在Action中没有进行任何操作的时候,栈顶就是Action的引用。
Action对象中有值栈对象,值栈对象中有Action的引用
四、向值栈中添加数据
(1)、最常用:在Action中定义变量,然后生成变量的get方法。
public class ActionStack extends ActionSupport {
private String name;
public String getName() {
return name;
}
public String execute() throws Exception {
name="123456";
return "OK";
}
}
(2)、获取值栈对象,调用对象中的set方法
(3)、获取值栈对象,调用对象中的push方法
向值栈中添加对象(使用上面的第一种方式)
实现:定义变量对象,生成变量对象的get方法,在执行的方法里面向对象设置值。此时对象也是放在Action中,不会在栈中开辟新的空间
向值栈中放list也是一样。
五、从值栈中获取数据
1 使用struts2的标签+ognl表达式获取值栈数据
<s:property value="ognl表达式"/>
(1)、从值栈中去字符串
<s:property value="name"></s:property>
(2)、获取对象的值
User
<s:property value="user.username"></s:property>
(3)、获取list集合中的数据
list<User>
不灵活
<s:property value="list[0].username"></s:property>
注意<!--
-->不能够注释struts2标签,需要使用<%-- --%>注解
<s:iterator value="list">
<!-- 这里得到的就是每一个User对象,所以直接输出他的属性值即可 -->
<s:property value="username"></s:property>
</s:iterator>
最常用的是下,面这种方式
最常用
<s:iterator value="list" var="user">
<!-- 这里得到是每次遍历出来的user
机制:把每次遍历出来的user都放到context里面,
会在context的map结构下临时加一个key-value键值对
key:user,value:user对象的引用
获取context里面的数据有一个特点,
使用ONGL的使用需要使用一个特殊的符号:#
-->
<s:property value="#user.username"></s:property>
</s:iterator>
EL表达式为什么能够取到值栈数据?
EL表达式取的是域对象中的值,
能够取值栈中的值的原理是:底层增强了request对象中的getAttribute方法,El表达式取值的时候,首先从request域中取值,如果取得到,就返回,如果取不到,就把值栈中的值获取出来,放到request域中。但是不建议使用EL表达式进行取值,这样的性能很低。
ONGL表达式
#
获取context中的值,context是map结构,里面的key是固定的,所以可以用来去放在request中的值
%:主要是在struts2标签中去使用。
<s:textfield name="username" value="%{#request.username}"></s:textfield>
最后
以上就是刻苦乐曲为你收集整理的Struts2第二天:值栈以及数据存取的全部内容,希望文章能够帮你解决Struts2第二天:值栈以及数据存取所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复