ssh框架的學習已經有一段時間了,從一開始的略略牴觸,到現在的樂意主動去研究,經歷了很有趣的過程。從開始的先去接受,到逐漸的、一點點的開始理解機制,過程很享受。
對struts2的機制的研究已略略有了小的成果,分享給大家。
我們只負責
action
和jsp
頁面的編寫,資料的準備及其他工作都是由
struts
2內部給我們做好了處理。
頁面乙個請求傳送過來,依次經過
一系列***
(處理公共部分
,如:往資料中心(值棧
)填充資料,所處理工作與業務無關),
介紹其中的兩個***:
modeldriven
、params;
——乙個請求過來,首先
建立乙個值棧物件
,初始化,然後
在map
和物件棧中放入一些資料
中:request=…,
session=…,,
attr=…,
parameters=…;
物件棧中:action
物件,…
——初始化完之後,還會經過很多***,其中乙個***
modeldriven
(封裝
model
,把model放入物件棧的棧頂)
,乙個***
params
(
引數封裝,放入引數
);action
中實現modeldriven<>
,並實現它的方法:
public class roleactionextends actionsupport implements modeldriven
}modeldriven的作用:把
model
物件放入物件棧棧頂
(原來棧頂是
action,
現在棧頂是
model了)
params***的作用:封裝引數。
如何封裝?——做了兩件事:第一,先到物件棧中封裝;第二,再到
map中封裝;
例子:假如,現在物件棧中有
model
物件在(
含有id
、name屬性)
在棧頂,
action物件(
含有id
、age屬性)
xx.action?id=3&name=ab&age=20&xx=00;
經過params
***時,它如何將引數封裝?
——先從棧頂開始找,依次找到id
、name
、age
屬性,通過各自的
set方法依次設值
id=3,name=ab,age=20(
注:雖然物件棧中有兩個
id屬性,但是由於
model
物件的id
屬性在棧頂,所以找到此
id屬性就設值,不會繼續往下找
),但是物件棧中沒有
xx屬性,於是戰中就沒有這個引數了,通過物件棧就無法得到
xx引數,但是
map中有
parameters
,可以把所有引數放入
parameters
中,無論在物件棧中有沒有寫屬性,在
parameters
中都能得到;
——經過一系列***之後,此時資料中心就有了資料,那我們就可以從中獲取資料
(action
、jsp
中均可從中獲取並使用);
——乙個請求。因為每傳送乙個請求過來,都要經過這樣一系列過程:***
(往值棧中壓入資料)——
>action
——>request ——
actioncontext
.getcontext()
.put(k,v);//map中放入資料
.get(k);//map中獲取資料
或:actioncontext.getcontext.getvaluestack()
.put(k,v);//map中放入資料
.get(k);//map中獲取資料
——actioncontext
.getcontext().getvaluestack()
.push(obj);//物件棧中放入資料
.pop();map中獲取資料
——通過
actioncontext
()操作
map,操作物件棧
——通過
ognl
表示式獲取
表示式的格式和語法:
格式:(1)
在struts
.xml
中的格式為:$;
(2)在
jsp中的格式為:%;
(注:只能寫在
struts2
的自定義標籤的屬性中)
語法:user
=findvalue("user");//
從棧中獲取
user屬性
#user = map.get("user"); //
從map
中獲取user物件
#user.name=map.get("user").getname();//
從map
中獲取user
物件的name屬性
(findvalue(expr))
的查詢順序:
(1),從物件棧中查詢指定名稱的屬性,從棧頂開始向下找,找到後就返回;
(2)如果從物件棧中沒有找到屬性,則從
map中查詢對應的
key值,找到後就返回。
例子:
通過此篇部落格,我們需要了解什麼?
(1)頁面乙個請求過來,struts2中依次經過了哪幾個過程?
—— 一系列***——>action——>request;
——modeldriven和params***分別的主要作用;
(2)值棧的概念?
——值棧的結構:物件棧、map;
——物件棧、map分別存放什麼資料;
(3)(1)和(2)是如何結合在一起的?
——請求過來,一開始經過***,初始化並建立物件棧,經過modeldriven和params***時,分別往值棧中封裝物件和封裝引數,分別封裝到相應的地方;此時資料中心中有就有了資料。
以上均是***為我們做的工作,我們只需寫action(通過
actioncontext
()操作
map,操作物件棧)和jsp(通過
ognl
表示式獲取棧中資料)即可。
struts2執行流程
struts 2框架本身大致可以分為3個部分 核心控制器 filterdispatcher 業務控制器 action和使用者實現的企業業務邏輯元件。核心控制器filterdispatcher是struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器action和業務邏輯元件是需要使...
struts2 流程分析
在struts2框架中的處理大概分為以下幾個步驟 1 客戶端初始化乙個指向servlet容器 例如tomcat 的請求 2 這個請求經過一系列的過濾器 filter 這些過濾器中有乙個叫做actioncontextcleanup的可選過濾器,這個過濾器對於struts2和其他框架的整合很有幫助,例如...
Struts2請求流程
1 客戶端傳送請求 2 請求先通過actioncontextcleanup filterdispatcher 6 actionproxy建立乙個actioninvocation的例項 7 actioninvocation呼叫真正的action,當然這涉及到相關 的呼叫 8 action執行完畢,ac...