一、 Preparable介面 1.有prepare()方法,實現該介面的action在執行時,首先執行該方法,用於進行一些預處理。2.創建prepareXXX方法,則在執行XXX方法前,將先執行prepareXXX方法. 二、ModelDriven介面 1.該介面實現將T類中的屬性展現到actio... ...
一、 Preparable介面
1.有prepare()方法,實現該介面的action在執行時,首先執行該方法,用於進行一些預處理。
2.創建prepareXXX方法,則在執行XXX方法前,將先執行prepareXXX方法.
二、ModelDriven介面
1.該介面實現將T類中的屬性展現到action中,action中不再需要針對T類,寫set,get方法
2.註意preparable與modeldriven執行順序,必須保證getmodel在prepare之前調用。
實現了ModelDriven就必須實現getModel這個方法,該方法返回的是你的ModelDrivern泛型中設定的實體類(就是父類抽出來的公共方法中的泛型)。
其實是為了實現代碼的重用,不要再定義一次你在數據訪問層定義的屬性了,直接用那個類就行了。
三、執行順序:
prepare->prepareInput->input->getModel.
參照下麵例子:
假設請求為:http://127.0.0.1:8080/employee_input.action
且我們的類結構如下:
BaseAction.java
public class BaseAction extends ActionSupport { }
CRUDAction.java
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
public abstract class CRUDAction<T> extends BaseAction implements ModelDriven<T>, Preparable { // 具體的CRUD方法抽取 CRUD Method; // 保證執行input方法時執行下麵規定的prepareInput():因為方法名對應二次參數綁定攔截器 public abstract void prepareInput() throws Exception; @Override public void prepare() throws Exception { // 留空 } }
具體實現EmployeeAction.java
public class EmployeeAction extends CRUDAction<Employee> { // 具體的實現CRUD , 如excute(){};save(){};delete(){};等等 CRUD Method; public String input() {} @Override public void prepareInput() throws Exception { // 省略其他設置// 設置查詢,回顯數據,在更新方法中中解決屬性丟失問題
} @Override /** 驅動模型 */ public Employee getModel() { return employee; } //省略其他設置 }
順序:
1 . CRUDaction-------prepare()
2 . EmployeeAction---prepareInput()
3 . EmployeeAction---input()
4 . EmployeeAction---getModel()