struts2 day03

本节内容:

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";
    }
}
View Code

存储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";
    }
}
View Code

七、从值栈中获取数据

使用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>
    <%--&lt;%&ndash;value中就写OGNL表达式&ndash;%&gt;--%>
   <%--<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>
    <%--&lt;%&ndash;value中就写OGNL表达式&ndash;%&gt;--%>
   <%--<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>
    <%--&lt;%&ndash;value中就写OGNL表达式&ndash;%&gt;--%>
   <%--<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也可以获取到值栈中的数据

原文地址:https://www.cnblogs.com/wuzhilong/p/9924189.html