Struts2--OGNL表达式

本文介绍了OGNL表达式的基本概念及在Struts2框架中的应用。详细解释了如何使用OGNL表达式来访问不同作用域的对象,包括创建并访问列表、数组及Map等集合类型,同时展示了逻辑判断和数据筛选等高级功能。

       OGNLObject-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

 

OGNL有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图



 

访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application#session

 

另外OGNL会设定一个根对象root对象),在Struts2中根对象就是ValueStack(值栈)。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。

 

struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象。

root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。

 

注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:

<s:property value="name"/>

  

由于ValueStack(值栈)Struts 2OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:

${foo} //获得值栈中某个对象的foo属性

 

如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。

application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContextgetAttribute("username")

session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")

request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName") 

parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")

attr对象:用于按page->request->session->application顺序访问其属性。

 

下面是OGNL表达式的简单例子:

<%@ 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>OGNL表达式入门</title>
</head>
<body>
	<%
		request.setAttribute("request", "request scope");
		request.getSession().setAttribute("session", "session scope");
		request.getSession().getServletContext()
				.setAttribute("application", "application scope");
	%>

	1.通过ognl表达式获取 属性范围中的值
	<br>
	<s:property value="#request.request" />
	<br />
	<s:property value="#session.session" />
	<br />
	<s:property value="#application.application" />
	<br /> 
	<br />
	
	2.通过ognl表达式创建list 集合 ,并且遍历出集合中的值
	<br />
	<s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}" />
	<s:iterator value="#list" var="o">
		<!-- ${o }<br/> -->
		<s:property />
		<br />
	</s:iterator>
	<br />
	
	3.通过ognl表达式创建数组 ,并且遍历出集合中的值
	<br />
	<s:set name="array" value="new int[] { 1, 2, 3 }" />
	<s:iterator value="#array" var="o">
		<!-- ${o }<br/> -->
		<s:property />
		<br />
	</s:iterator>
	<br />
	
	4.通过ognl表达式创建Map集合 ,并且遍历出集合中的值
	<br>
	<s:set name="map"
		value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}" />
	<s:iterator value="#map" var="o">
		<!--      ${o.key }->${o.value }<br/>   -->
		<!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/>   -->
		<s:property value="key" />-><s:property value="value" />
		<br />
	</s:iterator>
	<br />
	
	5.通过ognl表达式 进行逻辑判断
	<br>
	<s:if test="'aa' in {'aaa','bbb'}">   
    	aa 在集合{'aaa','bbb'}中;   
    </s:if>
	<s:else>   
    	aa 不在集合{'aaa','bbb'}中;   
    </s:else>
	<br />

	<s:if test="#request.request not in #list">   
    	request.request 不在集合list中;   
    </s:if>
	<s:else>   
        request.request 在集合list中;   
    </s:else>
	<br />
	<br />
	
	6.通过ognl表达式的投影功能进行数据筛选
	<!-- 
		?:获得所有符合逻辑的元素。
		^:获得符合逻辑的第一个元素。
		$:获得符合逻辑的最后一个元素。
	 -->
	<br>
	<s:set name="list" value="{1,2,3,4,5}"></s:set>
	<s:iterator value="#list.{?#this>2}" var="o">
		<!-- #list.{?#this>2}:在list集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->   
            ${o }<br />
	</s:iterator>
	<br />
	
	7.通过ognl表达式访问某个类的静态方法和值   
    <br>   
    <s:property value="@java.lang.Math@floor(32.56)" />  
</body>
</html>

 

以下为运行结果:

 

 

 
### 创建基于Maven构建的Spring Boot项目 #### 使用VSCode创建Spring Boot Maven项目 为了在Visual Studio Code (VSCode) 中创建一个新的Spring Boot Maven项目,需遵循一系列配置操作。确保已安装Java Development Kit (JDK),设置好环境变量以便命令行工具能够识别`java`和`mvn`命令。 安装必要的扩展来支持Java开发以及Maven项目管理,在VSCode市场中搜索安装以下两个官方推荐插件: - **Extension Pack for Java**: 提供完整的Java语言支持。 - **Maven for Java**: 增强对Maven项目的编辑体验。 完成上述准备之后,按照下面的方法启动新项目创建工作[^1]。 #### 初始化新的Maven项目 通过终端执行如下指令快速搭建基础框架: ```bash mkdir my-springboot-app && cd $_ mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=my-springboot-app \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false ``` 这段脚本会利用Maven Archetype机制自动生成标准目录结构与初始文件集。注意替换`com.example`为实际的应用程序包名,调整`my-springboot-app`以匹配期望的工程名称。 #### 添加Spring Boot依赖项 打开生成的`pom.xml`文件,向其中加入Spring Boot Starter Parent作为父POM,引入所需的Starters模块,比如Web服务支持等。修改后的XML片段可能看起来像这样: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 保存更改后,VSCode中的Maven插件将会自动下载相应的库资源解析路径。 #### 配置运行参数 对于希望直接从IDE内部调试或测试应用的情况,可以在`.vscode/launch.json`内定义特定于Spring Boot应用程序的任务配置。例如: ```json { "version": "0.2.0", "configurations": [ { "type": "java", "name": "Launch MyApplication", "request": "launch", "mainClass": "com.example.MyApplication" } ] } ``` 这里假设主类名为`MyApplication.java`且位于指定包下;如果实际情况不同,则应相应地更新此字段值。 最后一步是在根目录下的`src/main/java/com/example/`位置新建一个简单的入口点实现——即包含`public static void main(String[] args)`方法的类文件,用于触发整个系统的初始化过程。 至此,已经成功建立了一个基本可用的Spring Boot Maven项目模板,可以直接编译、打包甚至部署至容器环境中进一步探索其功能特性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值