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

后面的标签库明天更新

原文地址:https://www.cnblogs.com/bao6/p/10375382.html

时间: 2024-10-29 12:02:13

OGNL表达式&值栈&拦截器的相关文章

Ognl表达式 值栈对象ValueStack

ValueStack值栈主要包含另个部分: 1.map栈(非根元素) context:主要存储域对象. 2.list栈(根元素) root:主要存储 (1)通过值栈的push()方法存放的对象 (2)Map对象(通过值栈的set()方法存放的数据) (3)Action对象 (4)其他代理对象. 测试类OgnlDemo2 <span style="font-size:14px;"><span style="font-family:Courier New;&qu

Struts2.x教程(二) OGNL和值栈

一.OGNL是什么 OGNL(Object Graph Nvigation Language,对象图导航语言)是一个开源的表达式引擎.通过使用OGNL的表达式语法可以存取Java对象树的任意属性和调用Java对象树的方法等. 我们通过一个示例来了解OGNL. 分别创建三个实体类(全部省略了getter.setter方法): //学生类 public class Student { private String name; private Integer age; private Grade gr

框架学习之Struts2(三)---OGNL和值栈

一.OGNL概述 1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型的转化功能.他使用相同的表达式去存取对象的属性.如果吧表达式看作一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与java对象之间沟通的桥梁. 1.2OGNL的要素 表达式:表达式是整个OGNL的核心,OGNL会根据表达式去对

OGNL与值栈

一.OGNL入门 1.什么是OGNL OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言.使用这种表达式语言,可以通过使用某种表达式语言,来存取Java对象的任意属性,调用Java的方法,同时能够自动实现必要的数据类型转换, 2.OGNL的作用 Struts2默认的表达式语言就是ognl表达式语言,该语句具有以下的特点 支持对象方法的调用.例如:objectName.methodName(). 支持静态方法调用和值

Struts2 (三) — OGNL与值栈

一.OGNL表达式 1.概述 1.1什么是OGNL ? OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. ? Eg: hibernate 查询方式 : 对象导航查询. ? 其实就是查询出来了一个对象之后,通过对象里面的getXXX() 来获取关联的对象. ? 它是一个开源项目,并不是struts发明

Struts工作机制图+OGNL+EL+值栈(Map,对象栈)

struts 值栈  通过get set方法 方便的获取,设置属性值      比如从jsp页面传来的參数...从Action设置jsp所要回显的内容 注意EL表达式,struts2对request进行了封装,所以它的查找顺序 多了一个findvalue() 如上图 再看以下的代码: public class UserAction { private String username; //查看用户的具体信息 public String detail(){ username = "张三"

关于Struts2中的值栈与OGNL表达式

1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语言. OGNL相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSpecial(): 2.支持类静态的方法调用和值访问,表达式的格式: @[类全名(包括包路径)]@[方法名 |  值名],例如: @[email prot

Struts2拦截器、拦截器栈(Interceptor Stack)、全局拦截器与方法拦截器

Struts2拦截器原理 Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截.在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化相应的拦截器对象. Struts2拦截器配置 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Found

【struts2】值栈(后篇)

在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在不能获取到ActionInvocation的地方,可以直接使用ActionContext一个静态的getContext方法,就可以访问到当前的ActionContext了,示例如下: ActionContext ctx = ActionContext.getContext(); 如果在能获取到Act