Struts2中的OGNL

struts2ognl <!-- ognl表达式,配合struts2标签使用 <s:property/>类似jsp的表达式(),将值输出到浏览器上 value:设置的字符串默认为一个ognl表达式,应该根据该表达式去获得值 如果将值按字符串形式输出,加单引号括起来 --> <s:property value="OGNL-Expression"/> <s:property value="abc"/> <s:property value="'OGNL-xyz 阅读详情

什么是OGNL


OGNL 英文Object-Graph Navigation Language(对象导航语言),听着挺悬乎,其实就是一种表达式语言,OGNL是一种强大的技术,它被集成在Struts2中,用来帮助数据转移和类型转换。

  我们使用OGNL表达式将java端的数据属性和基于文本的视图层中的字符串绑定起来,这通常出现在表单输入字段的name属性或者struts2标签的各种属性中,
在通常的使用情况中,表达式语言的简单性,规范性使得学习的曲线非常低,这对于我们学习及应用,以至于实际开发当中都是非常有利。
<s:property value="name">
OGNL表达式语言是value属性双引号之间的片段,这个struts2 property标签从某个java对象的一个属性值中取值,之后将写入到HTML中代替这个标签,这是表达式语言的要点。
        本人是一个EL(Expression Language,以下译为表达式语言)的支持者。因为我对<% %>写法极为反感,忘记了在那本书上看到的一句话——“使用标志(Tag)的一个目的就是避免在JSP页面中出现过多的<%%>的语句,使页面与后台代码分离。”

表达式语言主要有以下几大好处:

         1.避免 (MyType) request.getAttribute()和 myBean.getMyProperty()之类的语句,使页面更简洁;

          2.支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;

          3.简单明了地表达代码逻辑,使用代码更可读与便于维护。


 

OGNL如何融入框架

数据进入,当请求进入框架时,它作为一个HttpServletRequest对象公开给java语言,像我们之前知道的Struts建立在servlet api上,请求参数被作为名、值对存储,名字和值都是string类型。接下来框架开始出来来源这些请求参数的的数据的转移及类型的转换。OGNL自动将数据转移到ValueStack的对象上,我们把user对象作为动作组件javabean属性公开出来,将动作对象放到valuestack上,我们已经准备好让OGNL做导航型的工作。

     从拦截器的学习知道,param拦截器将会把请求的数据转移到valuestack上,这个工作微妙的地方就是将参数映射到valuestack上的一个真实属性,从图中国可以看出,你期望表达式会更像myAction.user.name,而实际只有user.name是必要的。


Struts 2中的表达式语言

Struts 2支持以下几种表达式语言:

  1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
  2. JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
  3. Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
  4. Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。

Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

  1. 支持对象方法调用,如xxx.doSomeSpecial();
  2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 |  值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
  3. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
  4. 访问OGNL上下文(OGNL context)和ActionContext;
  5. 操作集合对象。

OGNL的用法

   大家经常遇到的问题是#、%和$这三个符号的使用。下面我想通过例子讲述这个问题:

         首先新建名为Struts2_OGNL的Web工程,配置开发环境。之前很多朋友在使用Struts 2的过程中都遇到乱码问题。当然乱码问题由来已久,而且涉及多方面的知识,所以并非三言两语可以说明白,而且互联网上也已经有很多这方便的文章,大家可以 Google一下。不过,如果你在开发的过程,多注意一下,避免乱码问题也不难。乱码多数是由于编码与解码所使用的方式不同造成的,所以我建议大家将编码 方式都设为“utf-8”,如<%@  page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>。另外,在配置web.xml时使用ActionContextCleanUp过滤器(Filter),如下面代码所示:



“#”主要有三种用途:

访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:


  1. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
  2. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2

        下面让我们它们的具体写法,首先是Action类代码:

       

       package tutorial.action;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import tutorial.model.Book;

import com.opensymphony.xwork2.ActionSupport;

publicclass OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware  {
   privatestaticfinallong serialVersionUID =1L;
   
   private HttpServletRequest request;
   private Map<String, String> session;
   private ServletContext application;
   private List<Book> books;
           
   publicvoid setServletRequest(HttpServletRequest request) {
       this.request = request;    
   }


   @SuppressWarnings("unchecked")
   publicvoid setSession(Map session) {
       this.session = session;        
   }


   publicvoid setServletContext(ServletContext application) {
       this.application = application;
   }

   
   public List<Book> getBooks() {
       return books;
   }


   @Override
   public String execute() {
       request.setAttribute("userName", "Max From request");
       session.put("userName", "Max From session");
       application.setAttribute("userName", "Max From application");
       
       books =new LinkedList<Book>();
       books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
       books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));
       books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
       books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
       books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
       
       return SUCCESS;
   }

}



清单2 src/tutorial/action/OgnlAction.java

以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。我还创建了Book对象的列表用于演示“用于过滤和投影(projecting)集合”的功能,至于Book的代码大家可以在我前一文章《在Struts 2中实现CRUD》看到。

下面是Ognl.jsp的代码,内容如下:



清单3 WebContent/Ognl.jsp

以上代码值得注意的是“<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/>”,因为“books.{?#this.title=='Code Complete, Second Edition'}.{price}”返回的值是集合类型,所以要用“[索引]”来访问其值。

最后是Struts 2的配置文件struts.xml,内容如下:




清单4 src/struts.xml

发布运行应用程序,结果如下所示:



清单5 示例运行结果1

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:



清单6 演示%用途的代码片段

刷新页面,结果如下所示:

清单7 示例运行结果2

“$”有两个主要的用途

用于在国际化资源文件中,引用OGNL表达式。

在Struts 2配置文件中,引用OGNL表达式,如









     

SpotBugs实战:10大类Bug检测规则详解与代码优化实例(附避坑清单) 本文深入解析SpotBugs在Java开发中的实战应用,详细讲解10大类Bug检测规则与代码优化实例,包括NPE防御、多线程安全、性能优化等关键问题。通过具体代码示例和避坑清单,帮助开发者提升代码质量,有效集成到CI/CD流程中。 阅读详情

相关推荐

Jetson-nano 编译实时内核并烧录

前言 之前一篇文章介绍了正常的烧录过程,使用的是默认内核,实际工作中需要对内核打补丁升级为实时内核,并对其重编译。 一、准备内容 官网大法好 官方内核下载链接 官方交叉编译器下载链接 官方文档 ubuntu主机一台 根据官网选择下载对应的文件, 1、L4TDriver Package (BSP) source jetson内核文件。 2、官方交叉编译器 因为我们不是在jetson上直接编译,而jetson是arm平台,所以要进行交叉编译。 二、使用步骤 1.解压 内核 tar -xjf public_s

ldl371122的博客 3287

struts2中#,%,$用法区别?

#、%和$符号在OGNL表达式中经常出现 1.#符号的用途一般有三种。 1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSessi

taoleileilei的专栏 691

【Python&RS】哨兵2号(Sentinel2)轨道条带说明+图幅统计(表格+矢量)

今天给大家带来哨兵2号的图幅编号介绍以及全国省、市所需图幅数的统计。网上教程极少,而且结果也不公开。因为每次下载的时候都不知道需要几幅,所以研究后给大家分享一下。

Remote Sensing迷途小书童 1681

关于JSP中#,%,$取值符号的说明

主要分两类: 第一类为在jsp标签中使用的el表达式,${} 第二类为在struts标签中使用的ONGL表达式,%{},#: 第一类举例 直接在action中定义的变量 ${username} 通过request.put()保存的变量 ${requestCode.username} 第二类举例 直接在action中定义的变量 直接在action中定义的变量 通

Linking Haw的专栏 9010

产业大脑+未来工厂:揭秘浙江数字经济系统的5大核心场景搭建指南

本文深入解析了“产业大脑+未来工厂”这一浙江数字经济系统的核心范式,并提供了五大核心场景的实战搭建指南。文章详细阐述了从供应链协同、产能共享到产品创新、质量追溯及绿色低碳等关键场景的构建逻辑与技术架构,旨在帮助企业实现从技术驱动到场景驱动的价值落地,破解数据孤岛难题,提升产业链整体效能。

mac99的博客 667

SolidWorks草图绘制实战:如何用图片参考快速搞定智能小车底板设计

本文详细介绍了在SolidWorks中利用图片参考进行草图绘制的实战方法,以智能小车底板设计为例,帮助设计师快速将概念转化为精准三维模型。通过插入、对齐参考图片并高效描图,结合参数化约束与尺寸驱动,大幅提升设计效率和准确性,尤其适合新手入门与老手优化工作流。

rust6ferris的博客 218

printf(%02hhx)

1.hh :表示以一个char类型一个字节打印 2.h :表示以一个short类型两个字节打印 data :12345678 printf("%02hhx,%02hx,%02x\n",data,data,data); 结果:78,5678,12345678 tip:只读取两位,如果超过两位如实打印,如果不够两位,将补0. %x 是以十六进制打印一个整数(4个字节) 例如: char a = '\xAB'; printf("%02X", a); //FF FF FF A...

w0131的博客 3229

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

一个非常强大的字符串函数sscanf

GIT百度天宫的代码 D:\GKOSON_BACK_GARDEN\repository\BAIDU-SDK-GIT\iot-edge-sdk-samples\ota\esp32_baidu_ota_demo\main\libota 看到一个函数: static void hex_to_decimal(const char *hex_string, unsigned char *arr, s...

GKoSon的博客 1543

【腾讯小龙虾 WorkBuddy 专栏 03】技能(Skills)制作全教程!自定义技能编写、导出分享、导入使用一步到位

🔥腾讯AI智能体WorkBuddy自定义技能全攻略 本文为零基础用户提供WorkBuddy自定义技能的完整教程,涵盖技能概念、编写规范到实操全流程。核心内容包括: 技能本质:标准化任务指令模板,可固化重复操作流程 三大价值:一键执行重复任务/跨设备共享/降低使用门槛 实操演示:以"桌面文档自动分类"为例,分步讲解编写、测试、导出 共享方案:支持单技能/批量导出,通过任意渠道传输分享 导入指南:3秒完成他人技能加载,并提供常见问题解决方案 高阶优化:增加异常处理、版本管理等提升技能普适性

AI人人懂 2966

提示libfakeroot.so或libfakeroot-sysv.so出错处理方法

嵌入式Linux、Buildroot交叉编译出现fakeroot问题处理方法。

阿xin*的嵌入式AI 1443

STRUTS2中的OGNL

[类全名(包括包路经)]@[方法名|值名]例如:访问OGNL上下文(OGNLcontext)和ActionContext操作集合对象类图ValueStackValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,这个类是OgnlValueStack的基础。ValueStack贯穿整个action的生命周期。每一个action实例都拥有一个ValueStack对象。

2501_90251017的博客 966

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

博客介绍了Windows Server中远程桌面服务的理论,实验拓扑以及基于RemoteAPP的RDS安装。博文介绍了如何在Windows Server上部署发布服务器。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6129

struts2 之 OGNL

struts2 之 OGNLOGNLOGNL 简介ValueStackOGNL 的jar包OnglExpression示例讲解Demo1DemoAction OGNL OGNL 简介 OGNL 的全称是Object Graph Navigation Language(对象图导航语言), 它是一种强大的表达式语言 OgnlContext( ognl上下文 ) 其实就是Map(教室、老师、学生) m...

qq_44641053的博客 283

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

struts2之ognl

本文章给大家介绍下struts2框架的子控制器类的赋值操作及原理 目录 OGNL ValueStack ActionContext OGNL在页面中获取后台数据格式 OGNL OGNL(Object-Graph Navigation Language的简称),对象图导航语言,它是一门表达式语言,除了用来设置和获取Java对象的属性之外,另外提供诸如集合的投影和过滤以及lambda表达式等 接下来给大家展示两个JavaBean类,整个OGNL的介绍,将围绕着这两个类展开 ...

鑫709的博客 1066

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

struts2 中的ognl

OGNL是Object Graphic Navigation Language(对象导航图语言)的缩写,它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言

快乐小编的专栏 735

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

struts2中的Ognl

struts2中的Ognl

博客 2772

Struts2中的OGNL详解

一、OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。 二、OGNL的基础知识: 1. OGNL表达式的计算是围绕OGNL上下文进行的 OGNL上下文实际上...

297

Struts2之ognl

Struts2之ognl基础OGNL什么是OGNLOGNL上下文ValueStack值栈什么是值栈值栈的存储位置总结 OGNL 什么是OGNL OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言。 OGNL上下文 OgnlContext(OGNL上下文)其实就是Map集合 OgnlContext由根对象(1个)+非根对象(N个)组成 root 非根对象要通过"#key"访问,根对象可以省略"#key"(因为根对象只有一个,加不加#

m0_46699799的博客 279

Struts2中的ognl标签

1、ValueStack与<s:debug>标签 Struts 2框架使用OGNL作为默认的表达式语言,先用<s:property> 标签体验一下ognl表达式和调动学习热情,例如,显示Action中的一个属性和显示一个请求参数。 OGNL表达式就是针对一个称为OGNL...

chenqiaodezhi57164的博客 151

Struts2之OGNL

Struts2之OGNL简介案列说明 简介 1 OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言 2 OgnlContext(ongl上下文)其实就是Map OgnlContext=根对象(1)+非根对象(N) 非根对象要通过"#key"访问,根对象可以省略"#key" 注:context:英文原意上下文,环境/容器 重点...

qq_44847231的博客 175

struts2 ognl_Struts2 OGNL

struts2 ognlStruts2 OGNL is the expression language where OGNL stands for Object-Graph Navigation Language. OGNL is tightly coupled in Struts2 and used to store form parameters as java bean variables ...

从零开始的教程世界 228

struts2中的ognl

Struts 2框架使用OGNL作为默认的表达式语言,先用<s:property> 标签体验一下ognl表达式和调动学习热情,例如,显示Action中的一个属性和显示一个请求参数。 OGNL表达式就是针对一个称为OGNL Context的Map对象和一个称之为OGNL根对象进行操...

chenqiaodezhi57164的博客 238
上一篇: plsql 数据列表显示不全原因及解决方法
下一篇: oracle绑定变量
RiceToLife
博客等级 码龄10年 4粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值