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

    后面的标签库明天更新

  • 相关阅读:
    MySql 用户 及权限操作
    MAC 重置MySQL root 密码
    在mac系统安装Apache Tomcat的详细步骤[转]
    Maven:mirror和repository 区别
    ES6 入门系列
    转场动画CALayer (Transition)
    OC 异常处理
    Foundation 框架
    Enum枚举
    Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.
  • 原文地址:https://www.cnblogs.com/bao6/p/10375382.html
Copyright © 2011-2022 走看看