struts2_13_OGNL表达式

全称:Object Graphic Navigation Language(对象图导航语言)是一个开源项目,是Struts2框架的默认表达式语言。

相对于EL表达式,它提供了平时我们需要的一些功能,如:

·支持对象方法调用,如method.sayHello();

·支持类静态方法调用和值访问,表达式的格式为@[类全名(包括路径)]@[方法名|值名],例如:@[email protected](‘foo %s’,’bar’)或

@[email protected]_NAME;

·操作集合对象

 

Ognl有一个上下文(Context)概念,用来实现java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext。

下面为ActionContext包含的对象:

·ValueStack(值栈,它是跟对象)

·parameters

·request

·session

·application

·attr

当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action然后把action存放入ValueStack中,所以action的实例变量可以被OGNL访问。

访问上下文(Context)中的对象需要使用#符号标注命名空间,如:#application、#session,另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈),如果要访问根对象的属性,则可以省略#命名空间,直接访问该对象的属性。

在Struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象存放一组对象,在OgnlValueStack类里面有一个List类型的root变量,就是使用它存放一组对象。

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

注意:Struts2中,OGNL表达式需要配合Struts标签才能使用,如:<s:property value=”name”/>

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

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

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

·application对象:用于访问ServletContext方法:#application.userName或#application[‘userName’]

相当于调用ServletContext的   getAttribute(“userName”)。

·session对象:用于访问HttpSession方法:#session.userName或#session[‘userName’]

相当于调用session.getAttribute(“userName”)。

·request对象:用于访问HttpServletrequest属性的Map方法:#request.userName或#request[‘userName’]

相当于调用request.getAttribute(“userName”)。

 

·parameters对象:用于访问Http的请求参数方法:#parameters.userName或#parameters[‘userName’]

相当于调用request.getparameter(“userName”)。

 

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

property标签:

property标签用于输出指定值:

<s:set name=”name” value=”kk”/>
<s:property value=”#naem”/>

default:可选属性,如果需要输出属性的值为null,则显示该属性的值

escape:可选属性,指定是否格式化HTML代码

value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出
ValueStack栈顶的值

id:可选属性,指定该元素的标识

iterate标签:

iterate标签用于对集合进行迭代,这里的集合包含List、Set和数组。

<span style="font-size:12px;"><s:set name=”list” value=”{‘zhao’,’qian’,’sun’}”/>
<s:iterator value=”#list” status=”st”>
<font color=<s:if test=”#st.odd”>red</s:if>
<s:else>blue</s:else>>
<s:property/>
</font><br>
</s:iterator></span>

value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出
ValueStack栈顶的值

status:可选属性,该属性指定迭代时的iterateStatus实例,

该方法有如下几个方法:

int getCount(),返回当前迭代了几个元素

int getIndex(),返回当前迭代元素的索引

boolean isEven(),返回当前被迭代的元素的索引是否是偶数

boolean isOdd(),返回当前被迭代的元素的索引是否是奇数

boolean isFirst(),返回当前被迭代的元素是否为第一个元素

boolean isLast(),返回当前被迭代的元素是否为最后一个

if/elseif/else标签:

<s:set name=”age” value=”33”/>
<s:if test=”#age==33”>
33
</s:if>
<s:elseif test=”#age==22”>
22
</s:elseif>
<s:else>
都不等
</s:else>

url标签:

<span style="font-size:12px;"><s:set name="age" value="33" scope="request" />
<s:url action="hello" namespace="/test">
		<s:param name="personId" value="#request.age"></s:param>
</s:url></span>

输出为:/Ognl/test/hello.action?personId=33

当标签的属性值为字符串类型处理时,”%”符号的用途是计算OGNL表达式的值。

<s:set name="myurl" value="'http://www.hao123.com'" />
<s:url value="%{#myurl}" />
<!-- 使用%{}强制输出url的value值-->

输出为:http://www.hao123.com

表单标签checkBoxList复选框:

如果集合为list:

<struts>
<!--默认的视图主题-->
  	<constant name="struts.ui.theme" value="simple"/>
</struts>

<s:radio name="list" list="{'Java','.Net','Php','Ror'}" value="{'.Net'}" />
<s:checkboxlist name="list" list="{'Java','.Net','Php','Ror'}" value="{'Java','.Net'}" />

防止表单的重复提交:

1)登录界面index.jsp中的代码:

<s:form action="hello" namespace="/test" method="post">
	  	姓名:<s:textfield name="name" />
		<s:token />
		<input type="submit" value="发送" />
</s:form>

2)struts.xml文件中的代码:

<package name="base" namespace="/test"
extends="struts-default">
		<action name="hello" class="struts2.personAction">
		<!-- 加入拦截器,当再一次访问已经访问到的页面时,会跳转到登陆页面 -->
			<interceptor-ref name="defaultStack" />
			<interceptor-ref name="token" />
			<result name="invalid.token">/index.jsp</result>
			<result name="success">/show.jsp</result>
		</action>
	</package>
</struts>

3)personAction中的代码:

public class personAction {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String execute(){
		return "success";
	}
}

4)显示层show.jsp中的代码:

<body>
	<s:property value="name" />
	<br /><%=new Date()%>
	<br>
</body> 

注意:以上配置了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。

时间: 2024-08-27 19:36:26

struts2_13_OGNL表达式的相关文章

.NET深入解析LINQ框架(六:LINQ执行表达式)

阅读目录: 1.LINQ执行表达式 在看本篇文章之前我假设您已经具备我之前分析的一些原理知识,因为这章所要讲的内容是建立在之前的一系列知识点之上的,为了保证您的阅读顺利建议您先阅读本人的LINQ系列文章的前几篇或者您已经具备比较深入的LINQ原理知识体系,防止耽误您的宝贵时间. 到目前为止我们对LINQ的执行原理已经很清楚了,从它的前期构想到它真正为我们所用都有足够的证据,但是似乎问题并没有我们想的那么简单,问题总是在我们使用中频频出现尤其是新技术的使用,当然有问题才能有进步. 一:LINQ执行

Lambda表达式实战视频教程

视频教程地址: https://my.oschina.net/u/3217554/blog/1507456 1:Lambda表达式及函数式接口介绍 2:Lambda表达式详解 3:方法的引用(一) 4:方法的引用(二) 5:Stream API(一) 6:Stream API(二) 7:Lambda表达式.方法的引用.Stream API实战

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低. 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低. 1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大. 1.4.本着 write less  do more

坑爹的EL 表达式。

先说结论: Property 'OrgName0' not found on type EL表达式只与相关类的get方法的有关,就算你没定义变量,get 方法直接返回一个变量,或者常量都可以.这条没问题. EL表达式的大小写规则:当get方法后的字符如果前两个都是大写时,EL表达式需要大写.除此之外均为小写. package com.dobs.codedeploy.domain; public class Image { private String imageName;private Stri

Spring AOP中pointcut expression表达式解析 及匹配多个条件

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中 execution 是用的最多的,其格式为: execution(modifiers-pat

Lambda表达式

import org.junit.Test; import java.util.Comparator; import java.util.function.Consumer; /** * 一.Lambda 表达式基础语法:Java8中引入一个新的操作符"->"该操作符称为箭头操作符或Lambda操作符 * 箭头操作符将Lambda表达式拆分为两部分: * 左侧: Lambda表达式的参数列表 * 右侧: Lambda表达式中所需要执行的功能,即Lambda体 * * 语法格式一:

算法训练 表达式计算

问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.uti

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

正则 常用表达式

说明 正则表达式 网址(URL) [a-zA-z]+://[^\s]* IP地址(IP Address) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 电子邮件(Email) \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* QQ号码 [1-9]\d{4,} HTML标记(包含内容或自闭合) <(.*)(.*)>.*<\/\1>|<(.*) \/>