更新時(shí)間:2023-01-11 來(lái)源:黑馬程序員 瀏覽量:
在Struts2中,Action還有另外一種方式處理請(qǐng)求參數(shù),稱為模型驅(qū)動(dòng)(ModelDriven)。模型驅(qū)動(dòng)方式要求Action需要通過(guò)實(shí)現(xiàn)ModelDriven接口接收請(qǐng)求參數(shù),并且要重寫getModel()方法。getModel()方法返回的就是Action所使用的數(shù)據(jù)模型對(duì)象。
與屬性驅(qū)動(dòng)中直接使用域?qū)ο笞侄悟?qū)動(dòng)方式的數(shù)據(jù)傳遞類似,模型驅(qū)動(dòng)方式也是通過(guò)JavaBean模型進(jìn)行數(shù)據(jù)傳遞的。只要是普通的JavaBean,就可以充當(dāng)模型部分,并且JavaBean中所封裝的屬性要與表單的屬性一一對(duì)應(yīng),JavaBean就是數(shù)據(jù)傳遞的載體。使用模型驅(qū)動(dòng)方式時(shí),Action類中通過(guò)getModel()方法獲取模型,其示例代碼如下所示:
public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user=new User(); public User getModel() { return user; } public String execute() throws Exception { return "success"; } }
使用模型驅(qū)動(dòng)時(shí),其對(duì)應(yīng)的表單頁(yè)面也要做相應(yīng)的調(diào)整,調(diào)整后的代碼片段如下所示:
<form name="forml" action="LoginAction" method="post"> 用戶名:<input type="text" name="username"><br/> 密碼:<input type="password" name="password"><br/> <input type="submit" value="登錄"> </form>
從上述代碼中可以看出,使用ModelDriver的方式后,表單中的文本域名稱已經(jīng)不需要添加user前綴,頁(yè)面上的username會(huì)自動(dòng)對(duì)應(yīng)到這個(gè)Model的username屬性。
與屬性驅(qū)動(dòng)相比,模型驅(qū)動(dòng)不需要在Action類中定義與表單元素一一對(duì)應(yīng)的所有屬性及其各屬性的getter和setter方法,這減少了Action類中的代碼量。在項(xiàng)目應(yīng)用中具體使用哪種驅(qū)動(dòng)方法,現(xiàn)給出以下幾點(diǎn)建議。
(1)要統(tǒng)一整個(gè)系統(tǒng)中Action的驅(qū)動(dòng)方法,即要么都使用屬性驅(qū)動(dòng),要么都使用模型驅(qū)動(dòng)。
(2)如果持久層對(duì)象與表單中的屬性是一一對(duì)應(yīng)的關(guān)系,那么建議使用模型驅(qū)動(dòng),因?yàn)槟P万?qū)動(dòng)方法使Action類中的代碼更加簡(jiǎn)潔。
(3)如果持久層對(duì)象與表單中的屬性不是一一對(duì)應(yīng)的關(guān)系,那么建議使用屬性驅(qū)動(dòng),因?yàn)椴皇且灰粚?duì)應(yīng)的關(guān)系時(shí),系統(tǒng)中需要提供兩個(gè)JavaBean(一個(gè)對(duì)應(yīng)表單提交的數(shù)據(jù),一個(gè)用于持久層對(duì)象)。
總之,屬性驅(qū)動(dòng)的方法和模型驅(qū)動(dòng)的方法各有優(yōu)缺點(diǎn),在實(shí)際開發(fā)中,需要根據(jù)項(xiàng)目實(shí)際情況選擇使用哪種驅(qū)動(dòng)方式。