模型驅動 ModelDriven

2021-09-10 01:15:31 字數 3387 閱讀 3293

modeldriven:模型驅動,對所有action的模型物件進行批處理.

我們在開發中, 在action中一般是用實體物件,然後給實體物件get,set方法。

regaction

然後在jsp頁面中給action中的user屬性繫結值是通過如下方式

這樣都要加上user.因為在值棧中action進入值棧的時候,值棧中儲存的值就是以user.name這種形式存在的,所以ognl搜尋值棧的時候,也要按這個名字來搜尋。

這樣就 比較麻煩,於是就引入了模型驅動。

引入模型驅動後在jsp頁面繫結屬性值的時候就可以不用加上user.  如:

原理是什麼:ognl在搜尋name值的時候,會把模型驅動user壓入棧頂。ognl在值棧掃瞄的時候,會從上往下找,這樣就會搜到user中的name,等等

是模型***把模型壓入棧頂的。

user類

public class user 

public void setname(string name)

public integer getage()

public void setage(integer age)

public integer getid()

public void setid(integer id)

public string tostring()

}

/**

* mdaction:某型驅動

*/public class mdaction extends actionsupport implements modeldriven,preparable

@skipvalidation

public string tore**iew()

public user getmodel()

public string getname()

public void setname(string name)

public user getmodel()

public string edit()

user u = new user();

u.setid(uid);

u.setname("jerry");

u.setage(30);

user = u ;注意,這裡的user並不是棧頂的user,引用已經指向了新物件u

如果要把u物件放到棧頂,可以手動的push

servletactioncontext.getcontext().getvaluestack().push(u) ;//把u物件放到棧頂,那麼執行修改時回顯的就是該物件的資料。

}
上面的方法是手動把u物件壓入棧頂,還有一種方法可以解決這個問題。

模型驅動***的高階應用:

struts在呼叫模型驅動***的之前會呼叫prepare***,prepare***中會呼叫乙個prepare方法,該方法在模型驅動***之前呼叫,也就是在模型驅動

***中的getmodel方法之前執行,getmodel方法返回的就是棧頂的物件,那麼可以在prepare中把getmodel方法中要返回到棧頂的物件給換掉,也就是重新引用。

這樣就不用手動的push到棧頂了。

/**

* mdaction:某型驅動

*/public class mdaction extends actionsupport implements modeldriven,preparable

@skipvalidation

public string tore**iew()

/*** 查詢所有使用者

*/public string findallusers()

return "userlistview";

}public string edit()

//public user getmodel()

public string getname()

public void setname(string name)

public listgetuserlist()

public void setuserlist(listuserlist)

public integer getuid()

public void setuid(integer uid)

/*** 該方法在getmodel之前執行,在modeldriven***之前先執行

*/public void prepareedit() throws exception

public void prepare() throws exception

}

但是由於使用的是預設***棧,prepare***在params***之前執行,這樣在編輯的時候,就無法獲取到id值,因為此時還沒有經過引數params爛機器的處理。

所以這種方法不能使用預設的***棧,struts-default.xml提供了乙個***棧paramsprepareparamsstack,所以要引入該***棧。

/md/reg.jsp

/md/reg.jsp

/md/edit.jsp

/md/userlist.jsp

不能引入預設***棧,要在prepare***之前執行params***

模型驅動的應用:

假設在開發中有很多實體物件,比如使用者類user,訂單類order,部門類department等等

對應的有很多action,如useraction,orderaction,departmentaction等等。

useraction{

user user;

orderaction{

order order;

如果在開發中需要開發乙個處理模型的***

processmodelinterceptor{

if(action instanceof(useraction){

object o=getuser();//得到該實體類的物件

else if(action instanceof(orderaction){

order o=getorder();//得到該實體類的物件

這樣如果有很多的類幾十甚至上百個實體類,都要這麼去判斷,將是十分的麻煩。引入了模型驅動後就解決了這個問題。

引入模型驅動後的做法:模型驅動的好處是對所以的action模型物件進行批處理

processmodelinterceptor{

if(action instanceof(modeldriven){//判斷action是否實現了模型驅動介面

object o=((modeldriven)action).getmodel();//得到action的模型物件

然後用反射獲取action中的資訊

modeldriven 和getModel的作用

所謂modeldriven,意思是直接把實體類當成頁面資料的收集物件。比如,有實體類user如下 packagecn.com.leadfar.struts2.actions public classuser public voidsetusername string username publics...

資料驅動 模型驅動 模型驅動的雲安全

存檔日期 2019年5月15日 首次發布 2011年2月8日 手動將安全策略轉換為技術實施非常困難,昂貴且容易出錯,尤其是在應用程式層實施時。為了在時間和金錢上的投資方面實現更多的成本節省,雲安全工具需要變得更加自動化。還需要這些工具的自動化,以使雲安全管理成為一項更輕鬆的任務,使雲管理員可以專注於...

資料驅動與模型驅動

今天看到一篇大資料gis的文章,文章中講到了資料驅動的空間分析和挖掘。摘自李清泉,李德仁,2014 大資料gis 資料的極大豐富使人們可以逐漸擺脫對模型和假設的依賴。對於大資料時代,谷歌的研究主管peter norvig 有一句名言 all models are wrong,and increasi...