淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝
眾所周知,Strut2的Action類(lèi)通過(guò)屬性可以獲得所有相關(guān)的值,如請(qǐng)求參數(shù)、Action配置參數(shù)、向其他Action傳遞屬性值(通過(guò)chain結(jié)果)等等。要獲得這些參數(shù)值,我們要做的唯一一件事就是在Action類(lèi)中聲明與參數(shù)同名的屬性,在Struts2調(diào)用Action類(lèi)的Action方法(默認(rèn)是execute方法)之前,就會(huì)為相應(yīng)的Action屬性賦值。
要完成這個(gè)功能,有很大程度上,Struts2要依賴(lài)于ValueStack對(duì)象。這個(gè)對(duì)象貫穿整個(gè)Action的生命周期(每個(gè)Action類(lèi)的對(duì)象實(shí)例會(huì)擁有一個(gè)ValueStack對(duì)象)。當(dāng)Struts2接收到一個(gè).action的請(qǐng)求后,會(huì)先建立Action類(lèi)的對(duì)象實(shí)例,但并不會(huì)調(diào)用Action方法,而是先將Action類(lèi)的相應(yīng)屬性放到ValueStack對(duì)象的頂層節(jié)點(diǎn)(ValueStack對(duì)象相當(dāng)于一個(gè)棧)。只是所有的屬性值都是默認(rèn)的值,如String類(lèi)型的屬性值為null,int類(lèi)型的屬性值為0等。
在處理完上述工作后,Struts2就會(huì)調(diào)用攔截器鏈中的攔截器,當(dāng)調(diào)用完所有的攔截器后,最后會(huì)調(diào)用Action類(lèi)的Action方法,在調(diào)用Action方法之前,會(huì)將ValueStack對(duì)象頂層節(jié)點(diǎn)中的屬性值賦給Action類(lèi)中相應(yīng)的屬性。大家要注意,在這里就給我們帶來(lái)了很大的靈活性。也就是說(shuō),在Struts2調(diào)用攔截器的過(guò)程中,可以改變ValueStack對(duì)象中屬性的值,當(dāng)改變某個(gè)屬性值后,Action類(lèi)的相應(yīng)屬性值就會(huì)變成在攔截器中最后改變?cè)搶傩缘倪@個(gè)值。
從上面的描述很容易知道,在Struts2的的Action類(lèi)可以獲得與屬性同名的參數(shù)值就是通過(guò)不同的攔截器來(lái)處理的,如獲得請(qǐng)求參數(shù)的攔截器是params,獲得Action的配置參數(shù)的攔截器是staticParams等。在這些攔截器內(nèi)部讀取相應(yīng)的值,并更新ValueStack對(duì)象頂層節(jié)點(diǎn)的相應(yīng)屬性的值。而ValueStack對(duì)象就象一個(gè)傳送帶,將屬性值從一個(gè)攔截器傳到了另一個(gè)攔截器(當(dāng)然,在這其間,屬性值可能改變),最后會(huì)傳到Action對(duì)象,并將ValueStack對(duì)象中的屬性的值終值賦給Action類(lèi)的相應(yīng)屬性。
當(dāng)我們?cè)陲@示層使用EL表達(dá)式,不僅可以訪問(wèn)到EL表達(dá)式中11個(gè)隱藏對(duì)象里的屬性,也能夠訪問(wèn)到valueStack中的對(duì)象屬性值,是因?yàn)閟truts2對(duì)HttpServletRequest做了進(jìn)一步的封裝.
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
//先從request范圍獲取屬性值
if (ctx != null) {
if (attribute == null) {
//如果從request范圍沒(méi)有找到屬性值,即從ValueStack中查找對(duì)象的屬性值
......
ValueStack stack = ctx.getValueStack();
//獲取valueStack對(duì)象
attribute = stack.findValue(s);
//從valueStack中的對(duì)象中查找指定的屬性值
......
}
}
return attribute;
}
}
總結(jié)
以上就是本文關(guān)于淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
java序列化和serialVersionUID的使用方法實(shí)例
這篇文章主要介紹了java序列化和serialVersionUID的使用方法實(shí)例的相關(guān)資料,這里說(shuō)明很詳細(xì)的使用方法讓你徹底學(xué)會(huì),需要的朋友可以參考下2017-08-08
idea自帶Jacoco/idea自動(dòng)測(cè)試語(yǔ)句覆蓋率方法(使用詳解)
這篇文章主要介紹了idea自帶Jacoco/idea自動(dòng)測(cè)試語(yǔ)句覆蓋率方法,本文給大家分享使用方法,通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Java實(shí)現(xiàn)MySQL數(shù)據(jù)實(shí)時(shí)同步至Elasticsearch的方法詳解
MySQL擅長(zhǎng)事務(wù)處理,而Elasticsearch(ES)則專(zhuān)注于搜索與分析,將MySQL數(shù)據(jù)實(shí)時(shí)同步到ES,可以充分發(fā)揮兩者的優(yōu)勢(shì),下面我們就來(lái)看看如何使用Java實(shí)現(xiàn)這一功能吧2025-03-03
Java異常處理Guava?Throwables類(lèi)使用實(shí)例解析
這篇文章主要為大家介紹了Java異常處理神器Guava?Throwables類(lèi)使用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
mybatis?plus實(shí)現(xiàn)分頁(yè)邏輯刪除
這篇文章主要為大家介紹了mybatis?plus實(shí)現(xiàn)分頁(yè)邏輯刪除的方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
java并發(fā)請(qǐng)求下數(shù)據(jù)插入重復(fù)問(wèn)題的解決方法
現(xiàn)在遇到一個(gè)項(xiàng)目,移動(dòng)設(shè)備存儲(chǔ)數(shù)據(jù),然后一起上傳,那就出現(xiàn)了許多重復(fù)數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java并發(fā)請(qǐng)求下數(shù)據(jù)插入重復(fù)問(wèn)題的解決方法,需要的朋友可以參考下2021-11-11
java本服務(wù)如何調(diào)用本服務(wù)接口
這篇文章主要介紹了java本服務(wù)如何調(diào)用本服務(wù)接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
StreamAPI多次消費(fèi)一個(gè)stream代碼實(shí)例
這篇文章主要介紹了StreamAPI多次消費(fèi)一個(gè)stream代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

