Struts2(三)--OGNL&值栈

WPS文档编辑时空行问题解决方案 本文详细介绍了如何解决WPS文档编辑时空行的问题,从问题描述与分析、解决方案详解到操作示例与注意事项等多个方面进行了全面阐述。通过本文的介绍和指导,用户可以快速定位问题根源并采取有效措施进行解决,从而提升文档编辑效率和美观性。未来,随着WPS软件的不断升级和优化,相信会有更多便捷高效的功能被添加到软件中。同时,用户也需要不断学习和探索新的操作技巧和方法,以适应不断变化的办公需求。希望本文能够为广大WPS用户提供有益的参考和帮助,共同推动办公效率的提升和发展。 阅读详情

一、OGNL

OGNL:OGNL 是 Object-Graph Navigation Language
的缩写,从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 , 它旨在提供一个更高抽象度语法来对 java
对象图进行导航

1.1 OGNL在struts2环境的使用

  • 调用对象的方法

在jsp页面中使用对象的防范,需添加struts2的tags标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>OGNL在struts2环境中的入门</h1>
<h3>调用对象的方法</h3>
<s:property value="'struts'.length()"/>
</body>
</html>

结果如下:
在这里插入图片描述

  • 调用对象的静态方法

@类名@方法名

默认关闭访问静态方法,需开启常量。

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>
	<!-- 配置struts2的常量 -->
	<!-- 开启静态方法访问-->
	<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
</struts>

jsp页面

<h3>调用对象的静态方法</h3>
<s:property value="@java.lang.Math@random()"/>

结果如下:
在这里插入图片描述

二、值栈

2.1 值栈(ValueStack):

在struts2中使用ONGL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性

值栈贯穿整个Action的生命周期。Action一旦创建,框架就会创建一个ValueStack对象。struts2使用OGNL将请求Action的参数封装为对象存储在值栈中,并通过OGNL表达式读取值栈中的对象属性值

2.2 值栈的内部结构

值栈内部有两个区域:

  • root:

真实对象为CompoundRoot,继承ArrayList

root放置的是Object对象

获取root中的数据不需要加#

操作值栈一般为操作root区

  • context:

真实对象为OGNLContext,实现了Map接口

context中存有root的引用,还有request、session、application、parameters、attr的web开发对象引用

获取context中的数据需要加#

内部结构查看:

Action类:

package com.struts2.valuestack.demo01;

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

/*
 * ValueStack的内部结构
 */
public class ValueStackDemo01 extends ActionSupport{

	@SuppressWarnings("unused")
	@Override
	public String execute() throws Exception {
		//获得值栈
		ValueStack valueStack = ActionContext.getContext().getValueStack();
		return SUCCESS;
	}
}

success.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>查看值栈内部结构</h1>
<s:debug></s:debug>
</body>
</html>

结果如下:

在这里插入图片描述
2.3 值栈与ActionContext的关系

创建ActionContext时,创建了ValueStack对象,将ValueStack对象传递给了ActionContext对象,所有可以通过ActionContext获得ValueStack对象

所以在 Struts(二) 可以通过ActionContext对象访问Servlet API,因为在ActionContext内部有值栈,而值栈内部有常见的web开发对象的引用。

2.4 获得值栈

可以通过两种方式,Action初始化时,valueStack也被存入request中一份

package com.struts2.valuestack.demo01;

import org.apache.struts2.ServletActionContext;

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

/**
 * 获取值栈对象
 * @author cf
 *
 */
public class ValueStackDemo02 extends ActionSupport {

	@Override
	public String execute() throws Exception {
		//通过ActionContext获得
		ValueStack valueStack1 = ActionContext.getContext().getValueStack();
		
		//通过request获得
		ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
		
		//判断是否是同一个
		System.out.println(valueStack1 == valueStack2);
		return NONE;
	}
}

结果如下:

在这里插入图片描述
2.5 操作值栈

  • 通过在Action类中的get方法存入数据

默认情况下,Action对象被亚茹值栈,其属性也被压入值栈

Action类:

package com.struts2.valuestack.demo01;

import com.opensymphony.xwork2.ActionSupport;
import com.struts2.domain.Product;

/**
 * 操作ValueStack
 * @author cf
 *
 */
public class ValueStackDemo03 extends ActionSupport{
	private Product product;

	public Product getProduct() {
		return product;
	}

	@Override
	public String execute() throws Exception {
		
		//向ValueStack中存值
		product = new Product("iphoneXR",new Double(4999),"手机数码");
		
		return SUCCESS;
	}
}

结果:
在这里插入图片描述
在jsp中使用property获取值

<s:property value="product.name"/>
<s:property value="product.price"/>
<s:property value="product.category"/>

结果如下:

在这里插入图片描述

  • 通过值栈中的方法存入数据

set后压入值栈,取出的属性只能是最靠近栈顶的属性,因此name属性被覆盖

package com.struts2.valuestack.demo01;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
import com.struts2.domain.Product;

/**
 * 调用值栈中的方法操作值栈
 * @author cf
 *
 */
public class ValueStackDemo04 extends ActionSupport{

		@Override
		public String execute() throws Exception {
			//获得值栈对象 
			ValueStack valueStack = ActionContext.getContext().getValueStack();
			//pusth(Obejct obj);对象   set(String key, Object(obj));集合
			Product product = new Product("iphoneXR",new Double(4999),"手机数码");
			valueStack.push(product);
			
			valueStack.set("name", "iphoneXS");
			
			return SUCCESS;
		}
   }

jsp页面:

<s:property value="name"/>
<s:property value="price"/>
<s:property value="category"/>

结果:
在这里插入图片描述
set压入的map在栈顶
在这里插入图片描述
2.6 获取值栈中的数据

使用OGNL表达式来取值

Action类存值:

package com.struts2.valuestack.demo01;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.domain.Product;

/**
 * 获取值栈的数据
 * @author cf
 *
 */
public class ValueStackDemo05 extends ActionSupport{

	@Override
	public String execute() throws Exception {
		//向值栈中保存对象
		Product product = new Product("iphoneXR",new Double(4999),"手机数码");
		ActionContext.getContext().getValueStack().push(product);
		//向值栈中保存集合
		List<Product> list = new ArrayList<Product>();
		list.add(new Product("iphoneXS",new Double(6999),"手机数码"));
		list.add(new Product("iphoneXS MAX",new Double(8999),"手机数码"));
		list.add(new Product("P30",new Double(3999),"手机数码"));
		ActionContext.getContext().getValueStack().set("list", list);
		//向Context中保存数据,即向作用域中保存数据
		ServletActionContext.getRequest().setAttribute("name", "request中的数据");
		ServletActionContext.getRequest().getSession().setAttribute("name", "session中的数据");
		ServletActionContext.getServletContext().setAttribute("name", "application中的数据");
		
		return SUCCESS;
	}
}

success.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>查看值栈内部数据</h1>
<s:debug></s:debug>

<%-- <s:property value="product.name"/> --%>
<%-- <s:property value="product.price"/> --%>
<%-- <s:property value="product.category"/> --%>

<%-- <s:property value="name"/> --%>
<%-- <s:property value="price"/> --%>
<%-- <s:property value="category"/> --%>

<h3>取对象中的值</h3>
<s:property value="name"/>
<s:property value="price"/>
<s:property value="category"/>

<h3>取list中的值</h3>
<s:property value="list[0].name"/>
<s:property value="list[0].price"/>
<s:property value="list[0].category"/><br>
<s:property value="list[1].name"/>
<s:property value="list[1].price"/>
<s:property value="list[1].category"/><br>
<s:property value="list[2].name"/>
<s:property value="list[2].price"/>
<s:property value="list[2].category"/><br>

<h3>取Context中的值, 需使用#号</h3>
<s:property value="#request.name"/><br>
<s:property value="#session.name"/><br>
<s:property value="#application.name"/><br>

</body>
</html>

结果:

在这里插入图片描述

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

相关推荐

期末求生指南:手把手教你用F12开发者工具绕过百一测评的切屏检测(JavaScript/jQuery实战)

本文详细介绍了如何利用F12开发者工具绕过百一测评的切屏检测,通过分析JavaScript/jQuery中的blur()和focus()事件监听机制,提供实战技巧动态修改代码。文章涵盖事件监听定位、代码修改方法及应对高级检测机制的策略,适合需要临时解决线上考试限制的学生参考。

weixin_30731305的博客 447

struts OGNL学习心得

在Struts2里边的OGNL是基于XWork的。XWork的OGNL和普通意义上的OGNL有一些差别,首先最大的差别就是OGNL的顶级对象是一个Context,它提供了一个根对象ValueStack,这是Struts2的OGNL的默认root。所有的action都保存在这个ValueStack中。XWork提供了自己独特的OGNL PropertyAccessor自动从顶向下的查找Stack

话别深秋 1242

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 353

Struts2详解之参数接收(六)

参数接收的几种方法希望对大家有些帮助    首先建一个bean类User,并设置get和set方法和toString方法            package cn.hd.param; public class User { private String name; private String psd; public String getName() { ...

qq_41934990的博客 439

LLMOps的崛起:如何利用Langfuse和Opik构建高效的模型监控与评估体系

本文探讨了LLMOps的崛起,详细介绍了如何利用Langfuse和Opik构建高效的模型监控与评估体系。通过开源工具Langfuse的全景监控方案和Opik的三层评估体系,帮助AI工程团队实现大语言模型的全生命周期管理,提升模型性能和迭代效率。文章还提供了实战技巧和工具链集成方案,助力企业优化AI应用。

ll5678的博客 680

ADS1293心电图模块实战:从电极贴片到信号采集的全流程指南

本文提供了一份基于TI ADS1293芯片的心电图采集系统全流程实战指南。文章深入探讨了从电极贴片选择与皮肤预处理、ADS1293前端配置(包括PGA、RLD和威尔逊网络),到PCB布局、电源去耦以及固件滤波与运动伪影处理等关键环节,旨在帮助硬件工程师和嵌入式开发者构建稳定可靠的可穿戴心电监测设备。

weixin_29201313的博客 384

Struts2接收参数总结

描述一下在struts2中获取id :action="role_delete?id=%{id}" 这种%{id}获取id值的方式是struts2中独有的获取方式,类似于jstl表达式中的${id} 首先我们来介绍struts2中从界面添加参数,传递至action的情况          第一种是通过基本的参数传递,在action中定义对应的属性名,比如前台定义的form表单中定义的name 属

XiaoqiangNan的博客 862

从零开始:用这些公开数据集搞定电力AI项目(含鸟巢、绝缘子、负荷预测等33个实战资源)

本文系统梳理了电力AI领域33个精选公开数据集,涵盖目标检测、负荷预测等关键场景,如鸟巢检测、绝缘子缺陷识别等。通过实战案例解析数据预处理、模型选型及性能优化策略,帮助工程师快速构建端到端解决方案,解决电力AI项目中的数据获取与处理难题。

weixin_42522552的博客 216

struct 值栈

配置OGNL <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 配置Action <action name="valuestack" class="cn.qyc.staticMethod.StatucMethod"> <result name...

qq_41835813的博客 162

WiFi偏门协议(四):增强的传输机制802.11aa

区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传...

reekyli的专栏 1790

AIGC游戏本地化:用AI实现多语言自动翻译

游戏本地化是游戏全球化战略的关键环节,传统人工翻译方式成本高、周期长。本文旨在探讨如何利用AIGC技术实现高效、准确、低成本的游戏多语言自动翻译解决方案。我们将覆盖从文本翻译到语音合成的完整本地化流程,重点关注AI技术在游戏特定语境下的应用优化。文章首先介绍游戏本地化的核心挑战和AI解决方案,然后深入讲解关键技术原理,接着通过实战项目演示具体实现,最后讨论应用场景和未来趋势。AIGC:人工智能生成内容,指利用AI技术自动生成文本、图像、音频等内容本地化(Localization)

AI 领航者的博客 1338

OGNL表达式&值栈&拦截器

OGNL 什么是ognl OGNL是Object-Graph Navigation Language的缩写,对象图导航语言。 他并不是Struts2的一部分,他只是经常和Struts2一起使用 ognl有啥作用 支持对象方法的调用 支持静态方法的调用和值访问 来操作值栈中的数据,访问OGNL上下文和ActionContext 操作集合对象 ognl的要...

weixin_34198453的博客 123

第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门

vben5 快速入门。 Vben Admin 框架新出的版本V5.5.4,而之前的Vben Admin 2.x 目前已存档,仅进行重大问题修复。之前在2.x版本曾经简单完成了一版专栏文章,当时也是收获了一些好评和建议。本次决定在v5 版本基础上再完成一次前后端的搭建。希望大家继续多多支持。项目精简后,再次启动项目,执行 pnpm run dev点击登录,可以看到接口报错,现在前端请求的后端有报错,下一节处理这部分逻辑。

cuiwin的专栏 7066

Struts2 标签详解

在这里都已infoList这个集合作为示例,以下是Action类中的代码: public class TestAction extends ActionSupport { private List<Info> infoList; public List<Info> getInfoList() { return i...

ak364877的博客 133

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

struts2

查看栈 <%@ taglib prefix ="s" url="/sturts-tags" %> <s:debug></s:debug>   取出 OGNL方法 <s:property value=“[数字].名”> 数字代表开始寻找值的开始位置 action对象默认位于栈顶。 对象map栈 OGNL ...

AAA_1362035315的博客 198

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Struts 2中的OGNL

本人是一个EL(Expression Language,以下译为表达式语言)的支持者。因为我对写法极为反感,忘记了在那本书上看到的一句话——“使用标志(Tag)的一个目的就是避免在JSP页面中出现过多的的语句,使页面与后台代码分离。”表达式语言主要有以下几大好处:避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,

Myself_jgl的专栏 491

WINCC7.3破解文件

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

struts2中ognl的运用

Struts 2中的OGNL 本人是一个EL(Expression Language,以下译为表达式语言)的支持者。因为我对写法极为反感,忘记了在那本书上看到的一句话——“使用标志(Tag)的一个目的就是避免在JSP页面中出现过多的的语句,使页面与后台代码分离。”表达式语言主要有以下几大好处:避免(MyType) request.getAttribute()和myBean.getM

lklinkang的专栏 1701

OGNL在struts2中的应用

  <!-- A.categorylink:link,A.categorylink:visited,A.categorylink:active{COLOR:#999999}A.categorylink:hover{COLOR:#ff9900;}-->

skycliff的专栏 1205

struts1和struts2区别

Action类 Struts 1要求Action类要扩展自一个抽象基类。Struts 1的一个共有的问题是面向抽象类编程而不是面向接口编程。 Struts 2的Action类实现了一个Action接口,连同其他接口一起实现可选择和自定义的服务。Struts 2提供一个名叫ActionSupport的基类实现一般使用的接口。虽然,Action接口不是必须的。任何使用execute方法的POJO对

w20101114的专栏 434

Struts 2中的表达式语言

Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言; JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言; Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的...

FJJJ8的专栏 343

Struts 2中的OGNL用法

 Struts 2支持以下几种表达式语言:OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言; JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言; Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk

sun_zhicheng的专栏 1339

Struts 2中的表达式语言-OGNL

 Struts Struts 2中的表达式语言Struts 2支持以下几种表达式语言:OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言; JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言; Groovy,基于Java平台的动态语言,它具有时下

lulin76827的专栏 455

Struts2 异常错误总结

一、后台不断出现 “警告: Could not find property [struts.valueStack] ”   解决:没有log4j-xxx.jar,下载一个,把它放到lib下面 二、java.lang.NoClassDefFoundError: org/apache/struts2/dojo/views/jsp/ui/HeadTag   解决办法:原因缺少了dojo的JAR包,

w_basketboy的专栏 2188
上一篇: Struts2(二)--Servlet API及数据封装
下一篇: Spring教程(一)--入门&基本配置
Double____C
博客等级 码龄8年 92粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值