详解Java的Struts框架中栈值和OGNL的使用

一、简介

Struts是一种基于MVC设计模式的Web应用程序框架。它非常适合于面向数据表格、表格链接和适应多个数据库环境的应用程序。而OGNL(Object Graph Navigation Language)是Struts框架中的一种表达式语言,用于表达访问对象图结构的多级路径。

其中,栈是Struts框架下和OGNL表达式密切相关的一个重要组成部分,它被用作存储选定的表单域或Bean对象的键值对。栈值是保存在Struts框架所定义的栈对象中的值,用来传递数据或将其共享到不同的内部结构中。

下面将详细讲解Java的Struts框架中栈值和OGNL的使用,并提供两个示例。

二、使用栈值

使用Struts框架时,我们可以在Java类级别的操作中访问当前HTTP会话的属性。我们可以使用HTTP ServletRequest和使用HTTP会话设定属性名和属性值。这些值在整个请求中都可用,包括在呈现JSP视图时。

示例1:在Struts Action中使用栈值

我们可以在Action中使用栈值来传递参数。例如:

首先,在Action中,定义返回值为SUCCESS和一个数据对象(这里使用了一个JavaBean):

public class HelloWorldAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    private String message;
    private HelloWorldBean helloWorldBean;

    public HelloWorldAction() {
        helloWorldBean = new HelloWorldBean();
    }

    public String execute() throws Exception {
        setMessage(helloWorldBean.sayHello());
        return Action.SUCCESS;
    }

    // getters and setters
}

然后,我们在JSP页面中将它们与栈值进行连接:

<s:form action="helloStruts" method="post">
    <s:textfield name="message" label="Message"/>
    <s:submit value="Say Hello"/>
</s:form>

在这种情况下,执行execute()方法时,栈中的message属性将被填充为表单提交中的参数。我们可以使用传递给setText()的值来更新该属性,例如:

public String execute() throws Exception {
    if (/* 某个条件 */) {
        addActionError("Please enter a valid name!");
    } else {
        setMessage(helloWorldBean.sayHello());
    }
    return Action.SUCCESS;
}

示例2:在自定义拦截器中使用栈值

我们可以使用自定义拦截器提供Struts中缺失的或自己独有的功能。下面是一个简单的自定义拦截器示例,用于记录页面请求的响应时间,并将响应时间添加到页面内容中:

public class ExecutionTimeInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;
    public static final String EXECUTION_TIME_ATTRIBUTE = "execution-time";

    public String intercept(ActionInvocation invocation) throws Exception {
        long startTime = System.currentTimeMillis();
        String result = invocation.invoke();
        long endTime = System.currentTimeMillis();

        Map<String, Object> context = invocation.getInvocationContext().getContextMap();
        HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);

        String content = ((String) context.get(ServletActionContext.HTTP_RESPONSE_BODY)).replaceFirst("</body>", 
                "<div style='position: fixed; top: 0; right: 0; background-color: #d8d8d8; padding: 3px; border: 1px solid #7F7F7F;'>"
                + "Response Time: " + (endTime - startTime) + "ms</div></body>");

        request.setAttribute(EXECUTION_TIME_ATTRIBUTE, (endTime - startTime) + "ms");
        context.put(ServletActionContext.HTTP_RESPONSE_BODY, content);

        return result;
    }

    public void destroy() {
    }

    public void init() {
    }
}

在自定义拦截器ExecutionTimeInterceptor中,我们使用HttpServletRequest对象来访问栈中存储的请求属性。当请求完成时,我们将响应时间添加到页面内容中,并将执行时间存储在请求属性中。

三、使用OGNL

使用OGNL,我们可以轻松地通过引用对象、访问属性、执行方法、访问数组以及在对象图的层次结构中导航数组、属性和方法之间的关系。

示例3:访问Map中的元素

首先,我们需要定义一个返回Map类型对象的JavaBean:

public class MyBean {
    private Map<String, String> map = new HashMap<String, String>();

    public MyBean() {
        map.put("name", "value");
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}

然后,我们可以在JSP中使用OGNL表达式来访问该Map的元素:

<s:property value="#myBean.map['name']"/>

这将输出value

示例4:导航对象图结构

假设我们有一个JavaBean定义为:

public class Person {
    private String name;
    private int age;
    private List<String> children;

    // getters and setters
}

我们可以使用OGNL表达式来访问Person的属性和方法:

<s:property value="name"/>
<s:property value="age"/>

<s:iterator value="children">
    <s:property value="length()"/>
</s:iterator>

使用<s:property>标记,我们可以直接访问Person的属性。使用<s:iterator>标记,我们可以遍历Personchildren属性,其值是一个List。同时,我们可以使用length()方法来访问每个元素的长度。

四、总结

本文介绍了Struts框架中栈和OGNL的基础知识,提供了两个栈值的示例和两个OGNL的示例。在使用Struts框架和Struts标签库时,了解如何使用栈和OGNL表达式非常重要,尤其是希望进一步了解Struts和相关技术的开发人员。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java的Struts框架中栈值和OGNL的使用 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java实现插入排序算法可视化的示例代码

    下面详细讲解Java实现插入排序算法可视化的示例代码的完整攻略。 1. 插入排序算法 插入排序是一种简单的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。插入排序的具体实现方式有两种:直接插入排序和二分插入排序。 以下是Java实现直接插入排序算法的示例代码: public void insertionS…

    Java 2023年5月19日
    00
  • json原理分析及实例介绍

    JSON原理分析及实例介绍 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可读性强,易于阅读和编写。相较于XML,它更加简洁,结构清晰,传输效率更高,被广泛应用于Web前端和后端的数据交互。 JSON数据以键值对的形式组合而成,通过逗号分隔。其中,键必须是字符串类型,而值则可以是字符串、数字、布尔…

    Java 2023年5月26日
    00
  • IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    下面是“IDEA 非常重要的一些设置项”的完整攻略。 1. 自动导入包的设置 开发中,我们需要使用很多的类。在使用类的时候,IDEA 会自动提示我们需要导入的包。但是,如果包的数量很多,我们可能会忘记导入某些包。 为了避免这种情况,我们可以设置 IDEA 在自动提示需要导入的包时,自动导入缺少的包。在 IDEA 的设置中,点击 Editor > Gen…

    Java 2023年5月20日
    00
  • java 反射机制详解及实例代码

    Java反射机制详解 Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。 反射机制的特性 Java反射机制具有以下特性: 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属…

    Java 2023年5月23日
    00
  • 如何使用eclipse搭建maven多module项目(构建父子项目)

    下面是如何使用Eclipse搭建Maven多module项目(构建父子项目)的详细步骤: 1. 创建Maven父项目 在Eclipse中,选择菜单“File” -> “New” -> “Other”,选择“Maven” -> “Maven Project”,点击“Next”。 在“New Maven Project”向导中,选择“Creat…

    Java 2023年5月20日
    00
  • SpringBoot后端数据校验实战操作指南

    下面我为您详细讲解“SpringBoot后端数据校验实战操作指南”的完整攻略。 介绍 Springboot是一款非常流行的轻量级Java Web框架,它提供了很多方便的工具和组件,能够帮助我们快速、高效地开发应用程序。在使用Springboot开发Web应用的过程中,数据校验是一个非常重要的环节。数据校验可以帮助我们减少数据入库前的错误,从而提高程序的可靠性…

    Java 2023年5月20日
    00
  • Java-文件File简单实用方法(分享)

    Java中的File类提供了一组简单实用的方法来操作本地文件系统中的文件和目录。下面是完整的攻略,分为以下几个部分: 1. 创建File对象 File类的构造函数可以接受文件路径或者路径名作为参数来创建File对象。可以按照以下方式创建File对象: File file = new File("D:\\test\\example.txt"…

    Java 2023年5月20日
    00
  • Java 数据结构与算法系列精讲之背包问题

    Java 数据结构与算法系列精讲之背包问题 背包问题简介 背包问题是计算机科学中的经典问题,旨在找到最佳的物品组合,使得其总重量不超过背包容量,同时总价值最大化。背包问题有多个变体,每个变体都采用不同的解决方法。 01背包 01背包指的是背包容量固定,并且每个物品只有一个的情况。对于n个物品和一个容量为V的背包,每个物品有两个属性:体积w和价值v。该问题可以…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部