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

后面的标签库明天更新

猜你喜欢

转载自www.cnblogs.com/bao6/p/10375382.html