struts2之ognl中符号#,@,%,$
1 OGNL中符号介绍
1.1 #符号
#
符号的用途一般有三种:
1.1.1 访问OGNL上下文和Action上下文
访问OGNL
上下文和Action
上下文#
相当于ActionContext.getContext();
下表有几个ActionContext
中有用的属性:
parameters
包含当前HTTP
请求参数的Map #parameters.id[0]
作用相当于request.getParameter ("id")
request
包含当前HttpServletRequest
的属性(attribute
)的Map
#request.userName
相当于request.getAttribute("userName")
session
包含当前HttpSession
的属性(attribute
)的Map #session.userName
相当于session.getAttribute("userName")
application
包含当前应用的ServletContext
的属性(attribute
)的Map #application.userName
相当于application.getAttribute("userName")
attr
用于按request > session > application
顺序访问其属性(attribute
) #attr.userName
相当于按顺序在以上三个范围(scope
)内读取userName
属性,直到找到为止
1.1.2 过滤和投影集合
过滤和投影(projecting
)集合,如示例中的persons.{?#this.age>20}
1.1.3 构造map
用来构造Map
,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}
1.2 %符号
%
符号的用途是在标志的属性为字符串类型时,转换为计算OGNL
表达式的值。如下面的代码所示:
构造Map
<s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />
The value of key “foo1″ is <s:property value=”#foobar['foo1']” />
不使用%:<s:url value=”#foobar['foo1']” />
使用%:<s:url value=”%{#foobar['foo1']}” />
1.3 $符号
$
符号主要有两个方面的用途
1.3.1 引用OGNL
在国际化资源文件中,引用OGNL
表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间
在Struts 2
框架的配置文件中引用OGNL
表达式,例如下面的代码片断所示:
<validators>
<field name=”intb”>
<field-validator type=”int”>
<param name=”min”>10</param>
<param name=”max”>100</param>
<message>BAction-test校验:数字必须为${min}为${max}之间!</message>
</field-validator>
</field>
</validators>
1.3.2 动态的结果集
动态的结果集(dynamic result
)
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
</struts>
注:${}
:作用是用于在配置文件中从Value stack
(值栈)中取值。
例如:${r}
表示从Value stack
(值栈)中取Action
的(成员属性)的值。注意这个成员属性必需存在
注:此处的${}
不是el
表达式。
get/set
方法。
Action
类中指定了r的值。这样就动态确定了Result
的值
public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
1.4 @符号
package com. wjt276.struts2.ognl;
public class S {
public static String STR = "STATIC STRING";
public static String s() {
return "static method";
}
}
<li>
访问静态方法:<s:property value="@com.wjt276.struts2.ognl.S@s()"/></li>
<li>
访问静态属性:<s:property value="@com.wjt276.struts2.ognl.S@STR"/></li>
<li>
访问Math
类的静态方法:<s:property value="@@max(2,3)" /></li>
// 两个@符号
1.5 小结
struts2各个符号总结
$
用于i18n
和Struts
配置文件#
取得ActionContext
的值%
将原本的文本属性解析为ognl
,对于本来就是ognl
的属性不起作用@
用于静态方法或属性的调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了