详解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日

相关文章

  • MyBatis复杂Sql查询实现示例介绍

    下面我来为您详细讲解“MyBatis复杂Sql查询实现示例介绍”的攻略。 一、什么是MyBatis复杂Sql查询? MyBatis是一种基于Java的持久层框架,它的目的主要是简化数据库访问过程,允许用户通过XML或注解的方式来配置SQL语句,使得编写和维护数据库访问相关的代码变得更加容易。MyBatis复杂Sql查询是指在查询数据库时,使用MyBatis框…

    Java 2023年5月19日
    00
  • java哈希算法HashMap经典面试题目汇总解析

    Java哈希算法HashMap经典面试题目汇总解析 简介 哈希表是一种常用的数据结构,它可以快速地进行插入、查找和删除操作。HashMap是Java中常用的一种哈希表实现。 在面试中,经常会被问到关于HashMap的问题,这些问题往往涉及到其内部实现原理、时间复杂度等方面。 本文将为大家汇总一些经典的HashMap面试题目,并提供详细的解析,方便大家在面试中…

    Java 2023年5月19日
    00
  • Java正则表达式之split()方法实例详解

    Java正则表达式之split()方法实例详解 简介 Java中的正则表达式是一种常见的字符串处理方式,可以使用它们来匹配、查找、替换或拆分字符串。其中,split()方法是一个非常常用的字符串拆分方法。本文将详细介绍split()方法及其应用。 split()方法参数 split()方法是String类的一个成员方法,用于将字符串根据传入的正则表达式拆分成…

    Java 2023年5月27日
    00
  • Spring mvc Json处理实现流程代码实例

    下面我就详细讲解一下“Spring mvc Json处理实现流程代码实例”的完整攻略。 1. 什么是Spring MVC Json处理 Spring MVC Json处理是指在Spring MVC框架中处理请求和响应时,将数据以Json格式进行解析和转换,从而实现数据的传输和交互。 通常情况下,我们在使用Spring MVC框架时,会将请求数据转换成特定的J…

    Java 2023年6月15日
    00
  • 详解JSONObject和JSONArray区别及基本用法

    详解JSONObject和JSONArray区别及基本用法 1. JSONObject和JSONArray是什么? 在Java中,JSONObject和JSONArray都是JSON格式数据的提供者。 JSONObject对象表示一个JSON对象,即类似于{ “name”: “张三”, “age”: 18, “gender”: “male” }这样的数据结构…

    Java 2023年5月26日
    00
  • java 文件名截取方法

    当我们在Java程序中获取到一个文件的完整路径之后,有时候我们需要从该路径中截取出文件名,以便进行后续的一些操作。下面就来讲一下Java中如何进行文件名截取。 方法一:使用File类的getName()方法 File类是Java中提供的一个用于操作文件和目录的类,其中getName()方法可以返回文件名(不包含路径名)。 示例代码: File file = …

    Java 2023年5月19日
    00
  • Java中的对称加密详解

    Java中的对称加密详解 本文将详细讲解Java中对称加密的原理及实现方式。对称加密是一种加密方式,使用同一个密钥进行加密和解密,是数据安全传输中常用的一种方式。 对称加密的原理 对称加密使用同一把密钥进行加密和解密,一般分为如下三个步骤: 明文加密 密文传输 密文解密 使用一把密钥可以实现两个相同结构的模块进行数据通信时进行加解密操作。对称加密的优点是速度…

    Java 2023年5月19日
    00
  • 基于javaweb+jsp实现学生宿舍管理系统

    下面是基于javaweb+jsp实现学生宿舍管理系统的完整攻略。 一、前期准备 学习Java语言和Web开发知识,熟悉JSP和Servlet等技术; 了解MySQL等数据库的基本操作; 确定需求,设计数据库表结构等。 二、搭建开发环境 安装Java开发工具和Web服务器; 配置开发环境,包括环境变量、路径等; 创建工程并配置Web服务器相关信息。 三、实现功…

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