zoukankan      html  css  js  c++  java
  • 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

    后面的标签库明天更新

  • 相关阅读:
    Base64
    HBase搭建
    解决Zookeeper无法启动的问题
    docker基础知识之挂载本地目录
    VMware升级到15版本虚拟机黑屏的解决方法
    docker端口映射或启动容器时报错Error response from daemon: driver failed programming external connectivity on endpoint
    MQTT 入门介绍
    OpeTSDB的Configuration配置
    js中ES6的Set的基本用法
    Review-JVM
  • 原文地址:https://www.cnblogs.com/bao6/p/10375382.html
Copyright © 2011-2022 走看看