开发手册 欢迎您!
软件开发者资料库

Struts 2 - Value Stack / OGNL

Struts 2 Value Stack / OGNL - 从简单和简单的步骤学习Struts 2,从基本概念到高级概念,包括基本MVC架构,概述,环境设置,架构,示例,配置,操作,拦截器,结果,结果类型,值栈/ OGNL,文件上传,数据库访问,发送电子邮件,验证,本地化,类型转换,主题/模板,执行处理,注释,控制,数据,表单,Ajax标签,Spring,Tiles,Hibernate集成。

值堆栈

值堆栈是一组多个对象,它们按提供的顺序保留以下对象 :

Sr.No对象&说明
1

临时对象

在执行页面期间会创建各种临时对象.例如,在JSP标记中循环的集合的当前迭代值.

2

模型对象

如果您正在使用模型对象struts应用程序,当前模型对象放在值堆栈上的操作之前.

3

动作对象

这将是当前的动作对象正在执行.

4

命名对象

这些对象包括#application,#session,#request,#attr和#parameters,并参考相应的servlet范围.

可以通过为JSP提供的标记访问值栈,Velocity或Freemarker.我们将在单独的章节中学习各种标签,用于获取和设置struts 2.0值栈.您可以在操作中获取valueStack对象,如下所示 :

ActionContext.getContext().getValueStack()

一旦有了一个ValueStack对象,就可以使用以下方法来操作该对象 :

Sr.NoValueStack Methods&说明
1

Object findValue(String expr)

通过在默认搜索顺序中针对堆栈计算给定表达式来查找值.

2

CompoundRoot getRoot()

获取包含被压入堆栈的对象的CompoundRoot.

3

Object peek()

将对象放在堆栈顶部而不更改堆栈.

4

对象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

对象图导航语言(OGNL)是一种强大的表达式语言,用于引用和操作ValueStack上的数据. OGNL还有助于数据传输和类型转换.

OGNL与JSP表达式语言非常相似. OGNL基于在上下文中具有根或默认对象的想法.可以使用标记符号来引用默认或根对象的属性,这是符号符号.

如前所述,OGNL基于上下文,Struts构建了一个ActionContext映射.与OGNL一起使用. ActionContext映射包含以下 :

  • 应用程序 : 应用范围变量

  • 会话 : 会话范围变量

  • 根/值堆栈 : 您的所有操作变量都存储在此处

  • 请求 : 请求范围变量

  • 参数 : 请求参数

  • 属性 : 存储在页面,请求,会话和应用程序范围中的属性

了解Action对象始终可用于值非常重要堆.因此,如果您的Action对象具有属性"x""y",则可以随时使用.

使用井号符号引用ActionContext中的对象,但是,可以直接引用值栈中的对象.

例如,如果 employee 是属性一个动作类,然后可以引用如下 :

而不是

如果您在会话中有一个名为"login"的属性,您可以按以下方式检索它;减去;

OGNL还支持处理集合 - 即Map,List和Set.例如,要显示颜色的下拉列表,您可以执行 :

OGNL表达式巧妙地将"红色","黄色","绿色"解释为颜色,并基于此构建列表.

当我们研究不同的标签时,OGNL表达式将在下一章中广泛使用.因此,不要孤立地查看它们,让我们使用Form Tags/Control Tags/Data Tags和Ajax Tags部分中的一些示例来查看它.

ValueStack/OGNL示例

创建操作

让我们考虑以下操作类,我们访问valueStack,然后在我们的视图中设置几个我们将使用OGNL访问的键,即JSP页面.

package com.it1352.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 context = new HashMap();      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的顶部.因此,将值放入Value Stack的常用方法是将值的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" %>         Hello World               Entered value : 
      Value of key 1 : 
      Value of key 2 :  
   

我们还需要在WebContent文件夹中创建 index.jsp ,其内容如下&&;

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"   pageEncoding = "ISO-8859-1"%><%@ taglib prefix = "s" uri = "/struts-tags"%>            Hello World               

Hello World From Struts2

               Please enter your name
                           

配置文件

以下是 struts.xml 文件的内容 :

                     /HelloWorld.jsp         

以下是 web.xml 文件的内容 :

      Struts 2            index.jsp               struts2               org.apache.struts2.dispatcher.FilterDispatcher                  struts2      /*   

右键单击项目名称,然后单击导出> WAR文件以创建War文件.然后在Tomcat的webapps目录中部署此WAR.

最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp .这将生成以下屏幕

Hello World Struts 4

现在输入在给定文本框中的任何单词,然后单击"Say Hello"按钮以执行定义的操作.现在,如果您将检查生成的日志,您将在底部和底部找到以下文本;

Size of the valueStack: 3

这将显示以下屏幕,它将显示您输入的任何值以及我们在ValueStack上放置的key1和key2的值.