Struts2学习笔记--(3)

第七章:OGNL表达式入门

- 7.1 OGNL概述

OGNL表达式全称为对象图导航语言(Object Graph Navigation Language),为开源的表达式语言,类似于EL(Expression Language)表达式语言。与EL表达式不同的是,OGNL表达式可以对Java对象的任意属性进行存取操作,亦可以调用Java对象的方法,而EL表达式仅仅支持取操作。
使用OGNL表达式,必须引入Struts2标签库:

<%--导入标签库--%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
struts2:	<s:textfield name="username" lable="用户名"/>

- 7.2 OGNL使用方法

  • 7.2.1 借助<s:property/>标签输出内容到页面

<%–要想使用OGNL表达式,需要借助struts2的标签–%>

	<s:property value="OGNLExpression"/>

<s:property/>标签可以将value值对应的内容输出到页面中,对应的内容从ognl上下文中寻找,而value的值为OGNL表达式,而非是字符串。
如何将一个字符串看成OGNL表达式,又如何将OGNL表达式表示成字符串呢?此时需要特殊的struts2的语法格式:
将OGNL表达式转换成字符串:
%{“表达式”}或者%{‘表达式’}
抑或可以简化为:
“表达式”或者‘表达式’。具体使用双引号还是单引号根据内容情况而定。如:

<s:property value="%{'OGNLExpression'}"/> 
<s:property value='%{"OGNLExpression1"}'/>

将字符串转换成OGNL表达式:
%{字符串}

  • 7.2.2 OGNL表达式调用java对象普通方法

OGNL表达式的强大之处在于可以调用Java对象的方法。例如:

长度:<s:property value="'OGNLExpression'.length()"/><br/>
转大写:<s:property value="'OGNLExpression'.toUpperCase()"/><br/>
分隔:<s:property value="'OGNLExpression'.split('E')"/><br/>
  • 7.2.3 OGNL表达式调用静态属性静态方法

    OGNL表达式支持调用静态成员,包括但是必须按照指定的格式来写,格式为:@包名.包名…类名.静态属性
    struts2框架默认不支持对静态成员的调用,需要struts.xml文件中开启支持:

<constant name=”struts.ognl.allowStaticMethodAccess” value=”true”></constant>
int的最大值:<s:property value="@java.lang.Integer@MAX_VALUE"/>
随机数:<s:property value="@java.lang.Math@random()"/>
  • 7.2.4 OGNL表达式创建集合

list集合使用{‘obj1’,‘obj2’}方式创建
map集合使用#{‘key1’:‘value1’,}方式创建
例如:
radio是单选按钮标签,list的属性取值就是ognl表达式;

<s:radio name="gender" list="{'男','女'}" label="性别"/>
<s:radio name="gender" list="#{'male':'男','female':'女'}" label="性别"/>

第八章:OGNL上下文

  • 8.1 ContextMap

    ContextMap是OGNL上下文对象,是struts2中封装数据最大的对象,我们一次请求中所有用到的信息都可以从里面找到。ContextMap是map结构,key为String类型,value为Object类型。
    在页面中可以借助struts2的<s:debug></s:debug>标签来进行查看ContextMap中的数据。
    ContextMap包含application(应用域数据),request(请求域数据),session(会话域数据),valueStack(值栈)等。
    在这里插入图片描述

  • 8.2 ActionContext

  • 8.2.1 ActionContext简介

    ActionContext是struts2提供的进行OGNL上下文对象操作的工具类,可以看做是对ContextMap的近一步封装。它在浏览器发送请求后,Struts2对请求进行过滤时(struts核心过滤器的doFilter方法)创建,且每个线程都拥有自己的ActionContext,且ActionContext创建后会与当前线程进行绑定,所以是线程安全的。
    8.2 如何存取OGNL上下文里面的数据
    查看OGNL上下文数据可以通过debug标签进行查询,查询结果为ContextMap中所有的数据集合。
    另外,对于具体数据的存取调用,可以通过Servlet API和ActionContext静态方法的方式进行调用。
    在这里插入图片描述


/**
 * 对ContextMap
 * 	和
 * 	三大域(ServletContext,HttpSession,ServletRequest)
 * 	的存值操作
 */
public class Demo1Action extends ActionSupport {

	/**
	 * Map部分的存值操作
	 * @return
	 */
	public String demo1(){
		//1.获取ActionContext对象		他就是一个Map结构
		ActionContext context = ActionContext.getContext();//从当前线程上获取ActionContext对象
		//2.往Map存入数据
		context.put("contextMap", "hello context map");
		
		//3.获取key为application的Map对象
		//第一种方式:使用map操作,叫解耦的方式,不依赖原始ServletAPI对象
		Map<String,Object> applicationMap = context.getApplication();//(Map<String, Object>) context.get("application");
		applicationMap.put("applicationMap", "hello application map");
		//第二种方式:使用原始ServletAPI对象操作,方便的方式。
		ServletContext application = ServletActionContext.getServletContext();
		application.setAttribute("applicationAttr", "hello application attr");
//4.会话域存入数据method1 : Servelt API
	HttpSession session = ServeltActionContext.getRequest().getSession();
	session.setAttribute("session","hellosession");
	//方法2 使用ognl上下文对象,通过session域的key对其value进行操作
	ActionContext context = ActionContext.getContext();
	Map<String,Object> sessionMap = context.getSession();
	sessionMap.put(“session”,”hellosession”);
		return SUCCESS;
	}
}

在页面中使用OGNL表达式获取:

<%--2、使用OGNL表达式获取Map中的数据 需要借助s:property
获取map的数据:都是根据Key获取value,所以我们要提供的是key。
如何表示key:使用#,后面的内容就表示key
写法:
	#key
--%>
获取ContextMap中的数据:<s:property value="#contextMap"/>
<hr/>
<%--3、使用OGNL表达式获取三大域中的数据
也需要使用s:property标签
写法就是
	#key.key
 --%>
获取key为application的map中的数据
<s:property value="#application.applicationMap"/><br/>
<s:property value="#application.applicationAttr"/>
  • 8.3 ValueStack(值栈)对象

  • 8.3.1 ValueStack概述

    ValueStack是Struts2的一个接口,ognlValueStack是其实现类。客户端发送一个请求,struts2创建一个action实例的同时创建一个ognlValueStack值栈实例。值栈是contextMap的一部分,List结构,可以看做是快速访问数据的容器。实现了栈结构(先进后出)。
    8.3.2 值栈数据的存取
    存储:一般可以通过ActionContext对象的getValueStack()方法获得值栈实例,通过push()方法可以进行对值栈进行存储操作。
    在这里插入图片描述
    值栈结构:
    在这里插入图片描述
    默认栈顶对象为当前动作类对象,即上图的action对象。当我们把实体类student压入值栈,对象属性的name取名为其属性的get方法的后缀名。
    取值:一般页面取值,可以通过property标签进行取值

<%--1、获取值栈中的数据  需要借助struts2的标签s:property
明确的事情:
	1、获取值栈中的数据,我们只能根据值栈中对象的property name获取property value。
	2、获取值栈中的数据,都是直接写属性名称,获取的就是值,并不需要使用任何符号。
它是把value属性的取值作为值栈中对象的property name,在值栈中从栈顶逐个查找,只要找到了就返回结果,并且不再继续查找。
--%>
<s:property value="name"/><br/>
<s:property value="age"/>
<hr/>
<%--2、默认的栈顶对象是:当前执行的动作类 
获取栈顶对象的方式:
	使用s:property标签,不要写value属性
--%>
<s:property/>
<hr/>
<%--3、获取指定位置的对象中的属性值 --%>
<s:property value="[0].name"/><br/>
<s:property value="[1].name"/>

OGNL表达式执行时调用的方法:

<%--4、ValueStack中的findValue方法 --%>
<%
ActionContext context = ActionContext.getContext();
ValueStack vs = context.getValueStack();
//其实之前的所有OGNL的操作,最终调用的方法都是findValue.  
//Object value = valueStack.findValue(String expression);
Object o1 = vs.findValue("name");
out.print("findValue方法输出的:"+o1+"<br/>");

Object o2 = vs.findValue("[1].name");
out.print("findValue方法输出的:"+o2+"<br/>");

Object o3 = vs.findValue("#application.applicationMap");
out.print("findValue方法输出的:"+o3+"<br/>");
%>

第九章:Struts2中使用EL表达式

  • 9.1 EL表达式回顾

    EL(expression language)表达式写法:${el};
    el表达式通过ContextPage类的fandValue()方法顺序从四大域中寻找匹配数据,匹配完成则查询结束。

  • 9.2 Struts2对EL表达式的改变

    Struts2框架改变了EL的搜索顺序,同时对request对象进行封装,并增强了getAttribute()方法。
    EL表达式原本的搜索顺序:page Scope->request Scope->session Scope->application Scope
    Struts2中EL表达式搜索顺序:page Scope->request Scope->valueStack->contextMap->session Scope->application Scope
    因为struts2对el表达式进行了增强,覆盖了ognl表达式的搜索域,加之el表达式行文方便,所以不能被ognl取代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值