美文网首页Java学习笔记Structs2
Struts2 | 详解如何在jsp页面中获取值栈中的数据

Struts2 | 详解如何在jsp页面中获取值栈中的数据

作者: 小胖0_0 | 来源:发表于2017-01-23 00:57 被阅读2985次

    上一篇文章我们已经了解了如何在struts2的值栈中存数据,那么这篇文章我们就一起来了解一下如何在jsp页面中获取值栈中的数据

    1 获取使用set方法存入值栈中的值

    在上一篇文章中我们已经了解到,使用set方法向值栈中存值,使用的是map方式,那么就有key和value,取值时我们只需根据key来取就可以了。

    代码演示如下:

    首先我们使用set方法向值栈中存入一个值,关键代码:

    //1 获取值栈对象
    ActionContext context = ActionContext.getContext();
    ValueStack stack = context.getValueStack();
    
    //2 调用值栈对象中的set方法
    stack.set("demo", "DemoData");        
    return "success";
    

    然后我们在jsp页面中使用struts标签获取值栈中的这条数据,关键代码:

    <!--导入struts标签库-->
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!-- 获取set方法设置的值  根据名称获取值-->
    <s:property value="demo"/>
    

    2 获取使用push方式存入值栈中的值

    由上一篇文章可知,push方式存值是没有map结构的,那么没有key,我们如何取值呢?事实上struts2中将push方法存入值栈中的值都放在一个名为top的集合中,那么我们只需利用这个集合便可获取到其中的值

    代码示例:

    首先我们还是先用push方法将数据放入到值栈中去,关键代码:

     //1 获取值栈对象
    ActionContext context = ActionContext.getContext();
    ValueStack stack = context.getValueStack();
    
    //2 调用值栈对象中的push方法
    stack.push("abcd");    
    return "success";
    

    然后在jsp页面中获取值栈中的值,关键代码:

    <!--导入struts标签库-->
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!-- 获取push方法设置的值 -->
    <s:property value="[0].top"/>
    

    这里需要特别注意jsp页面中使用ognl表达式获取list集合中元素的写法,不是 top[0] 而是 [0].top ,和我们在java代码中取list集合元素的写法是有区别的。

    3 获取使用变量的get方法存入值栈中的值

    这是往值栈中存值最常用的方法,这里我们将其分为取字符串,取对象和取list集合三种方式分别演示。

    1 获取get方式存入值栈中的字符串

    首先我们先使用变量方法存入一个字符串到值栈中,关键代码:

    private String username;
    public String getUsername(){
      return username;
    }
    
    public String execute() throws Exception {
      username = "demo";
      retrun "success";
    }
    

    然后我们在jsp页面中获取这个字符串的值,关键代码:

    <!--导入struts标签库-->
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!--使用s标签获取username的值-->
    <s:property value="username" />
    

    2 获取get方式存入值栈中的对象

    首先将对象存入到值栈中去,关键代码:

    private User user = new User();
    public User getUser(){
      return user;
    }
    
    public String execute() throws Exception {
      user.setUsername("demo");
      user.setPassword(123456);
      user.setAddress("beijing");
    
      return "success";
    }
    

    然后在jsp页面中获取这个对象,关键代码:

    <!--导入struts标签库-->
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!--使用struts2标签获取对象的数据-->
    <s:property value="user.username"/>
    <s:property value="user.password"/>
    <s:property value="user.address"/>
    

    3 获取get方式存入值栈中的list集合

    首先将list集合存入值栈,关键代码:

        private List<User> list = new ArrayList<User>();
        public List<User> getList() {
            return list;
        }
    
        public String execute() throws Exception {
            User user1 = new User();
            user1.setUsername("小奥");
            user1.setPassword("123");
            user1.setAddress("美国");
            
            User user2 = new User();
            user2.setUsername("小王");
            user2.setPassword("250");
            user2.setAddress("越南");
            
            list.add(user1);
            list.add(user2);
            
            return "success";
        }
    

    然后在jsp页面中获取list中的数据,在jsp中获取值栈中的list有三种方式,下面我们分别演示,关键代码:

            <!--导入struts标签库-->
            <%@ taglib uri="/struts-tags" prefix="s"%>
    
        <! 获取值栈list集合数据 -->
    
        获取list的值第一种方式:
            <br/>
        <s:property value="list[0].username"/>
        <s:property value="list[0].password"/>
        <s:property value="list[0].address"/>
        <br/>
        <s:property value="list[1].username"/>
        <s:property value="list[1].password"/>
        <s:property value="list[1].address"/>
    
        获取list的值第二种方式:
        <br/>
        <!-- 使用struts2标签 类似jstl的foreach标签
            s:iterator:遍历值栈的list集合
         -->
         <s:iterator value="list">
            <!-- 遍历list得到list里面每个user对象 -->
            <s:property value="username"/>
            <s:property value="password"/>
            <s:property value="address"/>
            <br/>
         </s:iterator>
    
        获取list的值第三种方式:
        <br/>
        <s:iterator value="list" var="user">
            <!-- 
                遍历值栈list集合,得到每个user对象
                机制: 把每次遍历出来的user对象放到 context里面
                获取context里面数据特点:写ognl表达式,需要
                使用特殊符号 #
             -->
            <s:property value="#user.username"/>
            <s:property value="#user.password"/>
            <s:property value="#user.address"/>
            <br/>
        </s:iterator>
    

    这里第一和第二种方法都比较好理解,第三种方法需要注意的地方在:在s:iterator 标签时如果使用了var属性,那么struts2会在值栈的context部分新开辟一个临时空间,并将遍历出来的list集合中的元素放到这个临时空间中,那么这时候再使用ognl表达式获取数据要使用#号,否则无法取出数据。

    这样可以避免浪费root部分的空间,加快检索的速度,因为我们通常操作数据都是操作root部分。


    总结:

    以上就是在jsp页面中取出值栈中值的几种办法,其中以第三中方法最常用,每种方法最好都要掌握,灵活运用即可。

    相关文章

      网友评论

        本文标题:Struts2 | 详解如何在jsp页面中获取值栈中的数据

        本文链接:https://www.haomeiwen.com/subject/xlaobttx.html