這是在分享我以前寫過的code
這個是我寫的資料維護功能的controller的Code,技術用的是Java的Spring framework,有些內容有拿掉,用todo的方式來表示拿掉了甚麼。(最後一行,我不知道怎麼拿掉又不會使得前面的泛型不會消失,只能說請多包涵)
@Controller
//TODO:RequestMapping
public class MenuItemMaintanceController extends CrudControllerBase{
//TODO:使用Resource注入取得靜態下來選單的物件
protected StaticSelectListUtil staticSelectListUtil;
@Override
protected MenuItemMaintanceFormData initFormData() {
//TODO:傳回一個頁面用的資料物件,並設初始值
}
@Override
protected void initInputDataWithDto(MenuItemMaintanceFormData formData,
MenuItemMaintanceFormDto formDto) {
//TODO:設定編輯或新增時,輸入欄位的數值
}
@Override
protected void initFindDataWithDto(MenuItemMaintanceFormData formData,
MenuItemMaintanceFormDto formDto) {
//TODO:設定編輯或新增時,輸入欄位的預設值(復原用)
}
@Override
protected MenuItemMaintanceFormDto getInitDto() {
MenuItemMaintanceFormDto formDto=new MenuItemMaintanceFormDto();
//TODO:設定FormDto初始值並傳回
}
@Override
//TODO:使用Resource注入此功能參數設定用的物件
protected void setConfigDto(ICrudControllerConfigDto configDto) {
this.configDto=configDto;
}
//有需要做特殊設定或邏輯時才需要override,否則可省略
@Override
protected void initEditPageData(MenuItemMaintanceFormData formData,
MenuItemMaintanceFormDto formDto) {
super.initEditPageData(formData, formDto);
formData.setActSelectList(staticSelectListUtil.getActStatus());
}
}
維護功能之間會有些共通的部分,共通的都包進父類別裡了,所以你看不到頁面會呼叫的method,你也看不到怎麼使用service,你甚至連設定service的部分都看不到(註1),也許你懷疑有沒有做分層,但我真的有做,只是被包到你感覺不到而已。
但你可以看到一些要對controller注入物件的部分與對頁面物件做處理的部分,因為這是非共通的部分,需要在子類別實作。
這個code比一般的controller的程式碼簡短多了,當你在開發一個類似功能時,也會感到輕鬆多了,當你在找錯誤時,你需要看的code也會減少很多。使用物件導向可以讓程式變得這樣簡單,不用寫幾百行或者上千行code(我看過有controller寫到3千行)。當然要建立這樣的寫法不容易,有時還得對父類別做調整,相信功力不夠的會連維護都有困難。
註1:service物件的設定是採用autowired的作法,這並非多數情況都適當的做法,有需要時可以用子類別override掉原本的設定。