Struts - 值栈/OGNL

  • 值栈

    值堆栈是一组几个对象,它按提供的顺序保留以下对象 -
    序号 对象和描述
    1
    Temporary Objects
    在页面执行期间创建了各种临时对象。例如,在 JSP 标记中循环的集合的当前迭代值。
    2
    The Model Object
    如果您在 struts 应用程序中使用模型对象,则当前模型对象放置在值堆栈上的操作之前。
    3
    The Action Object
    这将是正在执行的当前操作对象。
    4
    Named Objects
    这些对象包括#application、#session、#request、#attr 和#parameters,并引用相应的servlet 范围。
    可以通过为 JSP、Velocity 或 Freemarker 提供的标签访问值堆栈。我们将在单独的章节中研究各种标签,用于获取和设置 struts 2.0 值堆栈。您可以在您的操作中获取 valueStack 对象,如下所示 -
    
    ActionContext.getContext().getValueStack()
    
    拥有 ValueStack 对象后,您可以使用以下方法来操作该对象 -
    序号 ValueStack 方法和描述
    1
    Object findValue(String expr)
    通过以默认搜索顺序对堆栈评估给定表达式来查找值。
    2
    CompoundRoot getRoot()
    获取包含推入堆栈的对象的 CompoundRoot。
    3
    Object peek()
    在不改变堆栈的情况下获取堆栈顶部的对象。
    4
    Object pop()
    获取堆栈顶部的对象并将其从堆栈中删除。
    5 void push(Object o)
    把这个对象放到栈顶。
    6
    void set(String key, Object o)
    使用给定的键在堆栈上设置一个对象,以便它可以通过 findValue(key,...)
    7
    void setDefaultType(Class defaultType)
    如果在获取值时未提供类型,则设置要转换为的默认类型。
    8
    void setValue(String expr, Object value)
    尝试使用默认搜索顺序使用给定表达式在堆栈中的 bean 上设置属性。
    9
    int size()
    获取堆栈中的对象数。
  • OGNL

    Object-Graph Navigation Language(OGNL) 是一种强大的表达式语言,用于引用和操作 ValueStack 上的数据。OGNL 还有助于数据传输和类型转换。
    OGNL 与 JSP 表达式语言非常相似。OGNL 基于在上下文中具有根或默认对象的想法。默认或根对象的属性可以使用标记符号引用,即英镑符号。
    如前所述,OGNL 基于上下文,而 Struts 构建了一个 ActionContext 映射以与 OGNL 一起使用。ActionContext 映射包含以下内容 -
    • Application − 应用范围变量
    • Session - 会话范围变量
    • Root / value stack - 您所有的动作变量都存储在这里
    • Request - 请求范围变量
    • Parameters − 请求参数
    • Atributes − 存储在页面、请求、会话和应用范围中的属性
    重要的是要了解 Action 对象在值堆栈中始终可用。因此,因此,如果您的 Action 对象具有属性“x”“y” 有现成的供您使用。
    ActionContext 中的对象使用井号引用,但值堆栈中的对象可以直接引用。
    例如,如果 employee 是一个动作类的属性,那么它可以被引用如下 -
    
    <s:property value = "name"/>
    
    代替
    
    <s:property value = "#name"/>
    
    如果您在会话中有一个名为“登录”的属性,您可以按如下方式检索它 -
    
    <s:property value = "#session.login"/>
    
    OGNL 还支持处理集合——即 Map、List 和 Set。例如,要显示颜色下拉列表,您可以这样做 -
    
    <s:select name = "color" list = "{'red','yellow','green'}" />
    
    OGNL 表达式巧妙地将“红色”、“黄色”、“绿色”解释为颜色并基于此构建列表。
    当我们研究不同的标签时,OGNL 表达式将在下一章中广泛使用。因此,与其孤立地看待它们,不如让我们使用表单标签/控件标签/数据标签和 Ajax 标签部分中的一些示例来查看它。
  • ValueStack/OGNL 示例

    创建动作

    让我们考虑下面的动作类,我们在其中访问 valueStack,然后设置几个键,我们将在视图中使用 OGNL 访问这些键,即 JSP 页面。
    
    package com.jc2182.struts2;
    import java.util.*; 
    import com.opensymphony.xwork2.util.ValueStack;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloWorldAction extends ActionSupport {
       private String name;
       public String execute() throws Exception {
          ValueStack stack = ActionContext.getContext().getValueStack();
          Map<String, Object> context = new HashMap<String, Object>();
          context.put("key1", new String("This is key1")); 
          context.put("key2", new String("This is key2"));
          stack.push(context);
          System.out.println("Size of the valueStack: " + stack.size());
          return "success";
       }  
       public String getName() {
          return name;
       }
       public void setName(String name) {
          this.name = name;
       }
    }
    
    实际上,Struts 2 在执行时会将您的操作添加到 valueStack 的顶部。因此,将内容放入值堆栈的常用方法是将值的 getter/setter 添加到 Action 类,然后使用 <s:property> 标记访问这些值。但是我要向您展示 ActionContext 和 ValueStack 在 struts 中是如何工作的。

    创建视图

    让我们创建下面的jsp文件 HelloWorld.jsp在 eclipse 项目的 WebContent 文件夹中。如果操作返回成功,将显示此视图 -
    
    <%@ page contentType = "text/html; charset = UTF-8" %>
    <%@ taglib prefix = "s" uri = "/struts-tags" %>
    <html>
       <head>
          <title>Hello World</title>
       </head>
       
       <body>
          Entered value : <s:property value = "name"/><br/>
          Value of key 1 : <s:property value = "key1" /><br/>
          Value of key 2 : <s:property value = "key2" /> <br/>
       </body>
    </html>
    
    我们还需要创建 index.jsp 在 WebContent 文件夹中,其内容如下 -
    
    <%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
       pageEncoding = "ISO-8859-1"%>
    <%@ taglib prefix = "s" uri = "/struts-tags"%>
       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Hello World</title>
       </head>
       
       <body>
          <h1>Hello World From Struts2</h1>
          <form action = "hello">
             <label for = "name">Please enter your name</label><br/>
             <input type = "text" name = "name"/>
             <input type = "submit" value = "Say Hello"/>
          </form>
       </body>
    </html>
    

    配置文件

    以下是内容 struts.xml 文件 -
    
    <?xml version = "1.0" Encoding = "UTF-8"?>
    <!DOCTYPE struts PUBLIC
       "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
       "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
       <constant name = "struts.devMode" value = "true" />
       <package name = "helloworld" extends = "struts-default">
          <action name = "hello" 
             class = "com.jc2182.struts2.HelloWorldAction" 
             method = "execute">
             <result name = "success">/HelloWorld.jsp</result>
          </action>
       </package>
    </struts>
    
    以下是内容 web.xml 文件 -
    
    <?xml version = "1.0" Encoding = "UTF-8"?>
    <web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns = "http://java.sun.com/xml/ns/javaee" 
       xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
       id = "WebApp_ID" version = "3.0">
       
       <display-name>Struts 2</display-name>
       
       <welcome-file-list>
          <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
       
       <filter>
          <filter-name>struts2</filter-name>
          <filter-class>
             org.apache.struts2.dispatcher.FilterDispatcher
          </filter-class>
       </filter>
       <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
       </filter-mapping>
    </web-app>
    
    右键单击项目名称,然后单击 Export > WAR File创建一个战争文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。
    最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp. 这将产生以下屏幕
    你好世界 Struts 4
    现在在给定的文本框中输入任何单词,然后单击“Say Hello”按钮以执行定义的操作。现在,如果您检查生成的日志,您会在底部找到以下文本 -
    
    Size of the valueStack: 3
    
    这将显示以下屏幕,其中将显示您将输入的任何值以及我们放在 ValueStack 上的 key1 和 key2 的值​​。