Struts2(15)_Struts2 的 ognl 表达式

本系列博客汇总在这里:Struts2 汇总


源码工程文件为:struts2_17

一、什么是 ognl 表达式

  • OGNL 是 Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2 框架使用 OGNL 作为默认的表达式语言。
  • 作用:取值,获取 javaBean 中的属性,获取 List 或者数组元素,获得 map 的键值对,还可以执行逻辑运算。
  • 要求:我们必须把 ognl 表达式写在 struts 的标签中。

二、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>Insert title here</title>
</head>
<body>

<%-- 	
	在<s:properties >的value属性中""内部是ognl表达式,如果要输出字符串要加''
--%>
<s:property value="'weiyuxaun'"/>

<%-- 	
	在<s:properties >的value属性中""内部是ognl表达式,可以使用java的api
--%>
<s:property value="'weiyuxaun'.toUpperCase()"/>
</body>
</html>

在这里插入图片描述

三、ognl 对静态变量和静态方法的调用

静态变量和静态方法的调用都要使用:@类的全路径@[静态变量或静态方法],但是如果是静态方法的调用必须要先开启。

<!-- 开启ognl对静态方法的调用 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<%@ 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>Insert title here</title>
</head>
<body>
	<s:property value="@java.lang.Integer@MAX_VALUE"/>
	<s:property value="@java.lang.Math@abs(-100)"/>
</body>
</html>

在这里插入图片描述

四、ActionContext

context map:是每次请求访问时存储数据的对象,每一次请求都会创建 context map,我们可以把数据来存放到map 中。
在这里插入图片描述
在这里插入图片描述
每一个请求访问时都会创建一个 contextMap 的对象,ValueStack 和 contextmap 的数据是关联的可以相互转化。
我们的数据采用两个存储的结构来存储一个 valueStack(set(map)),contextMap(map)。

1、在 context map 中存取数据

  • 在请求范围内存储数据。

    @Override
    public String execute() throws Exception 
    {
    	System.out.println(username);
    	//获得动作类的上下文ActionContext包含了contextmap和valuestack
    	ActionContext ac = ServletActionContext.getContext();
    	//在contextmap中存储数据,默认的相当于request,因为ActionContext的生命周期和request一样都是一次请求
    	ac.put("name", "weiyuxuan");
    	return super.execute();
    }
    

    在 contextmap 中取数据要使用 #

    <s:property value="#name"/>
    	<s:debug></s:debug>
    

    在这里插入图片描述

  • 在会话范围存储数据

    @Override
    public String execute() throws Exception 
    {
    	System.out.println(username);
    	//获得动作类的上下文ActionContext包含了contextmap和valuestack
    	ActionContext ac = ServletActionContext.getContext();
    	//在contextmap中存储数据,默认的相当于request,因为ActionContext的生命周期和request一样都是一次请求
    	ac.put("name", "weiyuxuan");
    	//把数据存储在会话范围
    	ac.getSession().put("user", "魏宇轩是一个好人!");
    	return super.execute();
    }
    

    取值时语法

    <s:property value="#session.user"/>
    	<s:debug></s:debug>
    

    在这里插入图片描述

  • 在应用级别的存储数据

    @Override
    public String execute() throws Exception 
    {
    	System.out.println(username);
    	//获得动作类的上下文ActionContext包含了contextmap和valuestack
    	ActionContext ac = ServletActionContext.getContext();
    	//在contextmap中存储数据,默认的相当于request,因为ActionContext的生命周期和request一样都是一次请求
    	ac.put("name", "weiyuxuan");
    	//把数据存储在会话范围
    	ac.getSession().put("user", "魏宇轩是一个好人!");
    	//在应用范围内存数据
    	ac.getApplication().put("pv", 12345);
    	return super.execute();
    }
    

    取数据

    <s:property value="#application.pv"/>
    	<s:debug></s:debug>
    

    在这里插入图片描述

2、在值栈中存取数据

会把请求传递的参数存储在值栈中,同时把 Action 对象也压入栈中,属性对象在上面 Action 在下面,对象的值既可以从栈顶取,也可以从 Action 的 person 属性中来取。
在这里插入图片描述
在这里插入图片描述
从值栈中取数据 ognl 表达式不需要 #

<h3>从栈顶取Action对象中的model的值</h3>
	<s:property value="username"/>
	<s:property value="person.personId"/>
	<s:property value="person.personName"/>
	<s:property value="person.gender"/>

手动通过栈放入的数据也会放入栈顶,但是在 Action 对象中不会存储在相应属性数据
在这里插入图片描述

如有错误,欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值