1. 程式人生 > >OGNL表達式&值棧&攔截器

OGNL表達式&值棧&攔截器

template 我們 pre 區域 返回 tor content created list集合

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

後面的標簽庫明天更新

OGNL表達式&值棧&攔截器