struts2学习三(OGNL和ValueStack值栈)

Struts2中关于ValueStack的一些操作 关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存、取对象数据,而且还可以直接访问类的静态数据,调用静态方法。 3、 WebWork的ValueStack底层有第三方开源项目OGNL实现。所以EL也都遵循OGNL的规范。我们在开发中,几乎不需要知道OGNL的细节。 4、 WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:Action对象、Model对象等)放到ValueStack中。再将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据。 下面我们用一个雇员类为例,使用Junit框架(单元测试框架)来展示ValueStack的功能。 ...... 立即下载

1、OGNL

OGNL(Object-Graph Navigation Language),它是一种功能强大的表达式语言,比EL更强大的表达式语言(开源)。struts整合OGNL表达式。使用OGNL作为默认的表达式语言。

主要功能:
1、存取对象的属性,调用对象的方法
2、操作集合
3、直接new对象
4、访问OGNL上下文(OGNL context和ActionContext);

1、在root中的示例

public class TestOGNL {

    @Test
    public void test1() throws OgnlException {
        // 1、执行对象的方法
        Object o = Ognl.getValue("'abc'.toUpperCase()", null);
        System.out.println(o);
        // 输出结果:ABC
    }
    @Test
    public void test2() throws OgnlException {
        // 2、静态资源的访问
        Ognl.getValue("@System@out.println(@Math@PI)", new HashMap(),
                new Object());
        System.out.println(Math.PI);
        // 输出结果:3.141592653589793
    }
    @Test
    public void test3() throws OgnlException{
        //1、获取root属性值,直接使用对象的名称获取
        User user =new User("abc","123");
        Object o=Ognl.getValue("username", new HashMap(),user);
        System.out.println(o);
        //输出结果:abc  
    }   
    @Test
    public void test4() throws OgnlException{
        //2、获取root属性值,如果存放的是map,直接通过key获取
        Map<String,String> map =new HashMap<String,String>();
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("c", "ccccc");
        Object o=Ognl.getValue("a",new HashMap(),map);
        System.out.println(o);
        //运行结果:aaaaa
    }

2、在context中的操作

    @Test
    public void test1() throws OgnlException {
        //1、获取contxt中的值
       Map<String,String> map=new HashMap<String,String>();
       map.put("a", "aaa");
       Object o=Ognl.getValue("#a", map,new Object());
       System.out.println(o);
       //运行结果:aaa    
    }

3、赋值

    @Test
    public void test2() throws OgnlException {
        // 赋值
        User user = new User();
        Ognl.getValue("username='tom'", new HashMap(), user);
        System.out.println(user);
        //运行结果:User [username=tom, password=null]
    }

4、投影(过滤)

OGNL中的投影说的通俗一点就是过滤,目的就是在结果中选择满族条件的结果显示出来

@Test
    public void demo4() throws OgnlException{
        // #12过滤:对集合,进一步的操作,可以给遍历的集合添加过滤条件
        // 语法:集合.{符号 过滤表达式}
        // 符号:? 所有, ^ 第一个 , $ 最后一个
        List<User> list = new ArrayList<User>();
        list.add(new User("jack","1"));
        list.add(new User("rose","2"));
        list.add(new User("tom","3"));
        list.add(new User("cat","4"));

        // 当前对象
        Object val = Ognl.getValue("#this", new HashMap(), list);
        System.out.println(val);
        // 当前对象 -- 第一个
        Object val2 = Ognl.getValue("#this.{^#this}", new HashMap(), list);
        System.out.println(val2);

        // 当前对象 -- 所有内容,添加条件
        Object val3 = Ognl.getValue("#this.{?#this.userPwd > 2}", new HashMap(), list);
        System.out.println(val3);
    }

2、ValueStack值栈

这里写图片描述
1、struts在action中存放数据,在jsp中显示数据。struts有两个地方存储数据:root和context;

root:底层是ArrayList,用于存放没有名称的数据。也称为值栈
context:底层是Map,给存放在map中每一个对象进行命名。

2、ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象,每次请求都会创建一个Action类)。请求完成后ValueStack与request将一起消失。
ValueStack相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象.

3、ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础

Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中
ServletActionContext类中提供了一个常量
public static final String STRUTS_VALUESTACK_KEY = “struts.valueStack”;

4、在 ValueStack 对象的内部有两个逻辑部分:
ObjectStack: Struts 把动作和相关对象压入 ObjectStack中,底层实现对象为CompoundRoot, CompoundRoot是一个ArrayList
ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中。底层为Map
对值栈的操作,默认都是Root对象的操作,访问数据时不需要使用#号

源码如下:

public class CompoundRoot extends ArrayList {

    public CompoundRoot() {
    }

    public CompoundRoot(List list) {
        super(list);
    }


    public CompoundRoot cutStack(int index) {
        return new CompoundRoot(subList(index, size()));
    }

    public Object peek() {
        return get(0);
    }

    public Object pop() {
        return remove(0);
    }

    public void push(Object o) {
        add(0, o);
    }
}

5、Struts 会把下面这些映射压入 ContextMap 中,获取时间是需要使用#号
parameters: 该 Map 中包含当前请求的请求参数
request: 该 Map 中包含当前 request 对象中的所有属性
session: 该 Map 中包含当前 session 对象中的所有属性
application:该 Map 中包含当前 application 对象中的所有属性
attr: 该 Map 按如下顺序来检索某个属性: request, session, application

demo1
1、bean类和action类

package com.example.stack;

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public User() {
        // TODO Auto-generated constructor stub
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }

}

action类

package com.example.stack;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ActionValueStack1 extends ActionSupport {

    @Override
    public String execute() throws Exception {

        // 1 获得值栈(root)
        // 方式1: 从request作用域获得
        ValueStack valueStack = (ValueStack) ServletActionContext.getRequest()
                .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
        // 方式2:通过context获得
        ValueStack valueStack2 = ActionContext.getContext().getValueStack();
        valueStack2.getContext();

        // 2 获得context
        ActionContext actionContext = ActionContext.getContext();
        // 3 root操作
        // 3将指定的数据压入到栈顶,注意:一般情压入的javabean对象。jsp页面通过“属性”获得
        valueStack2.push(new User("tom", "1234"));

        return SUCCESS;
    }
}

2、struts.xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 开发模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- 包 -->
    <package name="day03" namespace="/" extends="struts-default">   
        <action name="actionValueStack1" class="com.example.stack.ActionValueStack1">
            <result name="success">/a/success.jsp</result>
        </action>

    </package>

</struts>

3、访问form.jsp和success.jsp

 <body>
  <a href="${pageContext.request.contextPath}/actionValueStack1">使用值栈</a><br/>
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:property value="username"/>
</body>
</html>

4、struts中的#,$,%

“#”:表示从context中获取灵气
%{}:表示使用ONGL解析
%{”}不使用ONGL解析,只是普通字符串

Abaqus梁模型仿真中的常见陷阱与优化策略 本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。 阅读详情

相关推荐

磁悬浮轴承控制策略设计及性能对比

摘要:针对高速磁悬浮转子控制问题,本文提出多方案对比分析。建立含陀螺效应的5自由度动力学模型,分析陀螺耦合、质量不平衡等关键挑战。对比四种控制策略:基础PID解耦、交叉反馈+自适应陷波、H∞鲁棒+前馈补偿、滑模控制+观测器,从实时性、鲁棒性等维度评估优劣。推荐采用交叉反馈+H∞+自适应陷波的混合方案,通过内环电流环与外环位置环协同,实现陀螺效应动态解耦和扰动抑制。实施步骤包括系统辨识、控制器设计、硬件部署等,需配合实验验证与参数整定。该方案综合性能最优,适用于高转速、强扰动场景。

技术工作者 1773

Struts2的值栈(ValueStack),详解+图解

值栈的概述 1、什么是值栈 Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。 ValueStack实际上就是一个容器。 它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。 ValueStack是Struts的一一个接口,字面意义为值栈,OgnIValueStack 是ValueStack 的实现类,客 户端发起一个请求struts2 架构会创建一个action 实例

程序员猫爪 2017

SAP 系统中的数字签名解决方案及应用案例分析

在当前企业信息化及数字化转型的大背景下,数据安全与身份认证显得尤为重要。数字签名技术作为保障数据真实性和完整性的重要手段,在 SAP 系统中得到了广泛应用。本文将详细探讨 SAP 系统中部分应用场景如何利用数字签名技术满足业务需求,涵盖 SAP Single Sign-On、质量管理、过程工业生产计划以及 SAP ArchiveLink 内容服务器等方面,力求通过深入解读,帮助读者更好地理解和应用这一关键技术。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 526

Struts2中的ValueStack详解

Struts2中的ValueStack详解 2017年02月08日 18:05:09707人阅读 评论(0) 收藏 举报  分类: JAVAEE框架(16)  版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/qq_28663043/article/details/54926516 目录(

evilcry2012的专栏 517

1.2 Spring AI V1.1.2版本 架构全景:模块拆解与设计哲学

Override// 检查请求的 Token 数量throw new TokenLimitExceededException("请求超出 Token 限制");@Override// 记录实际消耗的 Token@Override// 最先执行// 接口// 不同实现// 使用方无需改变定义抽象,保证可移植性提供 Fluent API,提升开发体验Advisor 机制提供扩展点,支持灵活定制模块化设计让你只引入需要的依赖自动配置。

小林夕程的博客 219

华为OD最新机试真题-池化资源共享

摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。

面试高手的博客 324

Struts2框架进阶(五)

这是Struts2框架进阶五,本文将详细讲解OGNL表达式语言。OGNL表达式语言简介OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。相对EL表达式,它提供了平时我们需要的一些功能,如: 支持对象方法调用,如xxx.sayHello(); 支持类静态的方法调用和值访问,表达式

李阿昀的博客 1354

Unity 面试篇|(三)设计模式篇 【全面总结 | 持续更新 | 建议收藏】

设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。模式并不是一段特定的代码, 而是解决特定问题的一般性概念。你可以根据模式来实现符合自己程序实际所需的解决方案。常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。同一模式在两个不同程序中的实现代码可能会不一样。单例模式。

游戏开发小Y的博客 12万+

深度解析Struts2中ValueStack

对于每一个action的调用,Struts在执行相应的动作方法之前会先创建一个名为ValueStack的对象

不能说的秘密的博客 1万+

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2011

零基础实战:用 Docker 和 vLLM 本地部署 bge-reranker-v2-m3 重排序模型

本文介绍了如何利用Docker容器和vLLM推理框架在本地部署BAAI开发的bge-reranker-v2-m3文本排序模型。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5971

关于Struts2 中OGNL/值栈ValueStack的学习

1. OGNL OGNL(Object-Graph Navigation Language,对象图导航语言)是一种强大的表达式语言,用于引用和操作值栈上的数据,还可用于数据传输和类型转换,使用它可以存取任意属性,调用对象中的方法。其作用的就是为了简化访问对象中的属性值。OGNL非常类似于JSP表达式语言。OGNL表达式的解析都是围绕OGNL上下文进行的,OGNL表达式是一个map对象,其中包含多...

jcs1992的博客 278

PyTorch 最新安装教程(2021-07-27)

PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 23万+

Struts2中的值栈和OGNL

struts2中的OGNL与值栈的主要知识点

ssqtom的博客 1910

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Struts2入门第八讲——值栈(ValueStack)

值栈的概述 什么是值栈(ValueStack)? ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求,Struts2框架会创建一个Action实例,同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action的生命周期,Struts2中使用OGNL将请求Action的参...

李阿昀的博客 977

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Struts2--值栈(ValueStack)

值栈 值栈(ValueStack)就是 OGNL 表达式存取数据的地方。在一个值栈中,封装了一次请求所需要的所有数据。 在使用 Struts2 的项目中,Struts2 会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的关系,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。 1.值栈的作用: 值栈可以作为一个数据中转站在前台与后台之间传递数据,最常见的就是将 S...

吴声子夜歌的博客 599

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

03 Struts2中的OGNL和值栈ValueStack

一、OGNL 1、什么是OGNL 是一种功能强大的表达式语言,通过他可以获取对象的任意属性和方法,同时能实现必要的类型转换,比EL表达式更加的强大,可以应用在页面,Action以及配置文件中 2、OGNL的作用 对象方法调用 类静态方法调用 赋值操作和表达式串联 访问OGNL上下文 操作集合对象 3、OGNL的要素 表达式 跟对象root context对象 二、值栈的概述 1、什么是值栈...

一个成长中的程序员,期待用技术的眼光生活 315

浅析Struts2中的OGNL和ValueStack

当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,并且将Action类的对象实例压入ValueStack对象中(实际上,ValueStack对象相当于一个栈),而ValueStack类的setValue和findValue方法可以设置和获得Action对象的属性值。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

2301_77783312的博客 648

java struts2值栈ognl_Struts2-值栈与OGNL

OGNL表示式使用 和 值栈OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。* xwork 提供 OGNL表达式* ognl-3.0.5.jarOGNL 是一种比EL 强大很多倍的语言OGNL 提供五大类功能1、支持对象方法调用,如xxx.doSomeSpecial();...

weixin_30857403的博客 219

Struts2学习笔记 | 值栈和OGNL

1.值栈(ValueStack) 引入值栈 在部署第一个Struts2时,Struts2学习笔记 | 部署第一个Struts2项目及其项目解析(IDEA版) Demo里面用${productName}读取productName值时,实际上该属性并不在request等域对象中,而是从值栈中获取的。 值栈的概述 贯穿整个Action的生命周期(每个Actio...

小白菜的博客 182

struts2的值栈(ValueStack)是什么?

值栈(ValueStack)就是 OGNL 表达式存取数据的地方。在一个值栈中,封装了一次请求所需要的所有数据。 在使用Struts2的项目中,Struts2 会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的关系,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。 1. 值栈的作用 值栈可以作为一个数据中转站在前台与后台之间传递数据,最常见的就是将 St...

cherry_vicent的专栏 422

Strust2 ognl 和 valueStack详解

Struts ognl 和 valueStack详解OGNLOGNL简介EL和OGNL的区别IGNL两大方法OGNL三要素Context 上下文对象值栈 ValueStack值栈的数据结构值栈findValue方法获取值的套路valueStack的赋值套路 OGNL OGNL简介 OGNL(ObjectGraphic Navigation Language)对象图导航语言,它是一个开源项目。 S...

qq_43059674的博客 378

Struts2框架基本学习(三) -- OGNL和值栈

一、OGNL 1、OGNL概述 (1) OGNL的概念 对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。 –百度百科 OGNL:对象图导航语言,比EL表达式...

sun_shine_szc的博客 232

struts2中的值栈ValueStack

一、什么是值栈? 我们在JSP中使用的request是经struts2包装后了的对象其值在值栈中保存。通过了解值栈,方便我们使用值栈中的对象和属性进行软件开发。 ValueStack对象有两个逻辑部分 第一个部分ContextMap:Struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap中,实际上就是对ActionContext的一个引用。Struts会把下

li286487166的博客 1163

Struts2 OGNL表达式、ValueStack

OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性,不能调用对象的方法。 OGNL可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图。 OGNL是可以单独使用的。OGNL并不属于Struts2,只不过S...

weixin_30895603的博客 188
上一篇: Struts2学习二(Struts2的常用功能)
下一篇: mybatis学习二
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值