、請求參數的注入
在Struts2框架中,表單的提交的數據會自動注入到與Action對象相對應的屬性。它與Spring框架中的IoC的注入原理相同,通過Action對象為屬性提供setter方法注入
要求:
jsp中表單的name屬性與Action中對應的屬性的setter方法對應。要注入屬性值的Action對象,必須為該屬性提供setXXX()方法,因為Struts2的內部實現是按照JavaBean規范中提供的setter方法,自動為屬性注入值
所以一般在Action中注入的屬性的屬性名與表單對應控件的name值相等,且該屬性提供getXXX()、setXXX()方法
域模型DomainModel
我們使用有相同點的屬性都喜歡把它封裝,這樣比較結構化,簡單明了。第一種方式注入請求參數在參數過多的情況下可能造成action中的代碼過多
將一些屬性信息封裝成一個實體對象的屬性。操作領域對象的方法,在Action對象中引用某一實體對象,並且http請求的參數值可以注入到實體對象的屬性上,這種方式i就是struts2提供的DomainModel的方式
注意:使用域模型的時候,jsp中的表單空間的name屬性應該與Action中的對象和bean中的屬性對應,格式為 對象.屬性 ,例如:user.name

public Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport{ private User user; public void setUser(User user){this.user=user;} public User getUser(){return User;} public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="user.name" label="用戶名"/> <s:password name="user.password" label="密碼" /> <s:textfield name="user.age" label="年齡"/> <s:submit value="注冊"/> </s:form> </body>
驅動模型ModelDriven
在域模型DomainModel中,雖然struts2的Action對象可以通過直接定義實例對象的引用來調用實體對象進行相關的操作,但要求的參數必須是指定參數對應的實體對象,例如上李忠需要指定參數名稱為user.name這種形式,有點不方便
驅動模型不需要指定參數所屬的對象引用。Struts2的API中,提供了一個名為ModelDriven的接口,Action對象可以通過實現此接口獲取指定的實體對象,獲取的方式是實現ModelDriven提供的getModel()方法進行獲取,其語法格式為: T getModel();
注意:驅動模型必須實例化對象類型的那個成員變量,否則空指針錯誤
處理流程
Struts2實例化Action對象,判斷Action對象是否實現ModelDriven接口,如果實例化了該接口,就會調用getModel()獲得實體對象模型並將其返回。后面就可以直接使用該對象的屬性了。
public Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport implements ModelDriven{ private User user; @Override public User getModel(){ return this.user; } public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="name" label="用戶名"/> <s:password name="password" label="密碼" /> <s:textfield name="age" label="年齡"/> <s:submit value="注冊"/> </s:form> </body>