3.3 值栈

valueStack对象的使用

是一个工具类,list结构
含有pop、peek、push方法操作list,值栈
先进后出,每次只能控制栈顶对象

Demo2Action.java

package com.itheima.web.action;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.itheima.domain.Student;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

/*
 * ActionContext数据存取
 * */

public class Demo2Action extends ActionSupport {
    
    /*
     * 获取ValueStack对象,并且压栈操作
     * */
    public String demo2() {
        //获取ActionContext对象
        ActionContext context = ActionContext.getContext();//从当前线程上获取
        //获取ValueStack对象
        ValueStack vs = context.getValueStack();
        //压栈操作
        Student student = new Student("张三",18,"male");
        vs.push(student);
        
        return SUCCESS;
    }
}

demo2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%--设置浏览器的页面编码 --%>
    <%--设置JSP编译成Servlet时使用的编码,可以只写这一句 --%>
    
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<%--规定 HTML 文档的字符编码 --%>

<meta charset="UTF-8">
<title>ValueStack的数据存取</title>
</head>
<body>
<%--
--%>



<hr>
<%--借助struts2的标签库查看ContextMap中的内容 --%>
<s:debug></s:debug>

</body>
</html>

Student.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%--设置浏览器的页面编码 --%>
    <%--设置JSP编译成Servlet时使用的编码,可以只写这一句 --%>
    
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<%--规定 HTML 文档的字符编码 --%>

<meta charset="UTF-8">
<title>ValueStack的数据存取</title>
</head>
<body>
<%--
--%>



<hr>
<%--借助struts2的标签库查看ContextMap中的内容 --%>
<s:debug></s:debug>

</body>
</html>

左侧为值栈中的对象,右侧为值栈中对象的数据
PropertyName显示的都是getXXX方法后面的部分,并且要把首字母改小写

获取值

%--
获取值栈中的数据也需要借助struts2的标签库
使用
    s:property  获取
    获取值栈的数据,是直接写属性名称,得到的就是属性的值
    
    OGNL表达式的找法,是从栈顶逐个属性名称开始查找,只要找到之后,就不再继续查找,而是返回结果
--%>
姓名<s:property value="name"/>
年龄<s:property value="age"/>
性别<s:property value="gender"/>

把一个变量放入值栈,简单的操作:定义一个类的成员,并且生成它的get方法就可以了

    
    private String name = "test";
    
    public String getName() {
        return name;
    }

获取指定位置得属性

<%--获取指定位置的属性 --%>
获取第一个name:<s:property value="[0].name"/>
获取第二个name:<s:property value="[1].name"/>
<%--如果使用property没有写value属性,取得是栈顶对象
如果没有操作值栈时,默认得栈顶对象时当前执行得Action对象
--%>

压入List

List<Student> list = new ArrayList<Student>();
        list.add(student);
        vs.push(list);

不好取

是否使用EL表达式

仍然要使用EL表达式,当使用了struts2之后,它对reqest进行了增强,改变了EL表达式得搜索顺序

%:把OGNL表达式转成普通字符串%{""}
把字符串转成OGNL表达式%{}
#:获取ContextMap中的数据#key
在页面中可以创建Map集合#{}
$:EL表达式使用
可以在struts2得配置中使用OGNL表达式,(配置可以是文件,也可以是注解)

page、request、ValueStack、ActionContext、session、application

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容