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
後面的標簽庫明天更新
OGNL表達式&值棧&攔截器