1. 程式人生 > >Struts2的模型驅動、屬性驅動的理解

Struts2的模型驅動、屬性驅動的理解

因為在struts1的版本中,屬性的攔截以及控制的處理是被封裝為兩個對立的ActionForm、Action來獲取HttpServerRequest的引數、控制訪問的MAPPING的。而在Struts2中我們可以直接通過Action來獲取請求引數,並把處理的資源對映返回給struts.xml指向對應的檢視資源或者模型或者控制器進行下一步的處理。發現Action在Struts2中負責了struts1的ActionForm以及Action的雙重任務,那麼、我們如果習慣了struts1的開放方式的,在Struts中提供,模型驅動的方式來分解Action的任務,這種模式是通過專門的JavaBean來封裝請求。

Field-driven方式:直接在Action類中定義各種Java基本型別(包裝型別)、String、Date型別的屬性,這些屬性名和頁面表單輸入域的名字一一對應。 Model-driven方式:通過領域模型JavaBean來進行資料傳遞。在Action類中定義一個領域模型JavaBean的物件,JavaBean所封裝的屬性與頁面表單輸入域的名字一一對應。把頁面表單的資料直接封裝到這個JavaBean中。

   我們來比較一下:屬性驅動和模型驅動的區別

   屬性驅動的例子:

public class InputAction extends ActionSupport {
	private static final long serialVersionUID = 7513077180980272234L;
	
	private String str;
	private int inte;
	private double dou;
	private char c;
	private boolean flag;
	private Date date;
	
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public int getInte() {
		return inte;
	}
	public void setInte(int inte) {
		this.inte = inte;
	}
	public double getDou() {
		return dou;
	}
	public void setDou(double dou) {
		this.dou = dou;
	}
	public char getC() {
		return c;
	}
	public void setC(char c) {
		this.c = c;
	}
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	public String execute(){
		System.out.println(str);
		System.out.println(inte);
		System.out.println(dou);
		System.out.println(c);
		System.out.println(flag);
		System.out.println(date);
		return "succ";
	}
}
   模型驅動例子:
public class ModelDriverAction {
	private Account acc;
	public Account getAcc() {
		return acc;
	}
	public void setAcc(Account acc) {
		this.acc = acc;
	}		
	public String execute(){
		System.out.println(acc);		
		return "succ";
	}
}


      其實,模型驅動必須實現ModelDriver介面,以及必須實現getMode()方法,該方法把Action和以及對應的Model例項關聯。配置屬性驅動和模型驅動的方式一樣,在struts.xml檔案中配置對應的Action即可,那他怎麼實現的?

    那麼,我們要看到Struts2是一個攔截器為核心的框架,在struts_default.xml檔案裡面可以發現對應的攔截器的設定。

   而我們在屬性驅動模型下在JSP中訪問屬性時:

   <s:property value="str">

  而在模型驅動模型下在JSP中訪問屬性時:

  <s:property value ="acc.no">

    但是,Struts2會自動識別使用何種驅動模式,省略model.系統自動會關聯到model.username的屬性值。