OGNL表达式&值栈&拦截器
OGNL
什么是ognl
OGNL是Object-Graph Navigation Language的缩写,对象图导航语言。
他并不是Struts2的一部分,他只是经常和Struts2一起使用
ognl有啥作用
- 支持对象方法的调用
- 支持静态方法的调用和值访问
- 来操作值栈中的数据,访问OGNL上下文和ActionContext
- 操作集合对象
ognl的要素
- Root对象
- Context对象
值栈
什么是值栈
Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
ValueStack是struts的一个接口,OgnlValueStack是ValueStack的实现类。
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
valueStack贯穿了整个action的生命周期(有一个action的实例,就有valueStack的实例)
获取值栈的对象
- 通过ActionContext中获取值栈
- 通过request获取值栈
操作值栈
有两种方式:
1.在action中提供属性的get方法的方式
action类
2.使用ValueStack中本身的方法的方式(用第二种方式的人还是多一些)
调用值栈中的方法来实现(这种方式直接到栈顶来了)
push(压栈)放对象 ,set放集合
谁最后一次调用,谁就在最上面
action类
ognl表达式的特殊符号
#号的使用
<%@ page import="com.opensymphony.xwork2.ActionContext" %><%-- Created by IntelliJ IDEA. User: 宝 Date: 2019/2/14 Time: 11:12 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Title</title> </head> <body> <h1>OGNL中#号的用法</h1> <h3>获取context中的数据</h3> <% request.setAttribute("name","花花"); %> <s:property value="#request.name"/><hr/> <h3>构建List集合</h3> <s:iterator var="i" value="{22,33,44,55}"> <%--有这两种取值的方法,root和context区域都有--%> <s:property value="i"/>--<s:property value="#i"/> </s:iterator> <h3>构建map集合</h3> <s:iterator value="#{'name':'花花','age':'18'}" var="o"> <s:property value="o"/> <br> <s:property value="#o.key" />--<s:property value="#o.value"/> </s:iterator><hr/> 性别:<input type="radio" value="男">男 <input type="radio" value="女">女<hr/> <%--struts2提供的radio--%> 性别:<s:radio list="#{'1':'男','2':'女'}" name="sex" /> </body> </html>
%号的使用
<%-- Created by IntelliJ IDEA. User: 宝 Date: 2019/2/14 Time: 12:00 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Title</title> </head> <body> <h1>OGNL中%号的用法:强制解析OGNL</h1> <% request.setAttribute("name","花花"); %> <%--在这里面他是默认不解析OGNL表达式的,我们可以用%强制解析--%> <s:textfield name="name" value="%{#request.name}"/> </body> </html>
Struts2的执行流程
Struts2的执行流程
先贴一张执行流程图
蓝色的部分是Struts2的核心,橘黄色的是ServletFilters,绿色的是Interceptor拦截器.
执行流程
服务器发过来一个请求,走到StrutsPrepareAndExecuteFilter.class,它里面执行了init之后,执行doFilter,执行exexuteAction,再到serviceAction,交给一个代理对象,执行execute,走到他的实现类里面,执行DefaultActionProxy,走invoke 反射,如果有拦截器,就走拦截器的方法,依次递归执行,如果没有了过滤器,走invokeAction,action的返回结果result,跳转页面看,用response相应
先走拦截器,再走action
后面的标签库明天更新