1. OGNL表达式语言概述
OGNL(Object-Graph Navigation Language)作为Apache Struts2框架的核心表达式语言,其设计初衷是为了解决Java Web开发中对象属性访问和操作的问题。在传统的JSP开发中,我们经常需要通过繁琐的Java代码来获取和设置对象属性,而OGNL通过简洁的表达式语法极大地简化了这一过程。
我第一次接触OGNL是在2013年参与一个电商后台管理系统开发时。当时项目需要频繁地从值栈(ValueStack)中获取数据并在页面上展示,OGNL的链式属性访问特性让原本需要多行Java代码才能实现的功能,现在只需要一个简单的表达式就能完成。比如要获取用户地址的城市名称,传统方式需要user.getAddress().getCity(),而OGNL只需user.address.city。
技术细节:OGNL表达式在Struts2中的解析过程实际上经历了多个步骤。当请求到达Struts2框架时,拦截器会构建ActionContext和值栈,然后OGNL引擎会根据表达式从这些上下文中查找和计算值。这个过程涉及到复杂的类型转换和方法调用机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. $符号的核心作用解析
2.1 国际化资源中的动态插值
在Struts2的国际化(i18n)资源文件中,$符号最常见的用途就是实现消息文本的动态插值。这种机制特别适合需要根据运行时状态显示不同内容的场景。
假设我们有一个多语言资源文件messages.properties,其中定义:
properties复制welcome.message=Hello, ${username}! Your last login was ${lastLogin}
在JSP页面中使用<s:text>标签引用这个资源时:
jsp复制<s:text name="welcome.message"/>
Struts2会自动用值栈中username和lastLogin变量的实际值替换表达式。这种动态替换发生在运行时,使得相同的资源键可以显示不同的内容,大大增强了国际化的灵活性。
实战经验:在使用这种动态插值时,一定要确保被引用的变量在值栈中存在。我曾经遇到过因为变量名拼写错误导致页面显示
${username}原样输
