[Java] 我對於CRUD的controller的寫法

這是在分享我以前寫過的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掉原本的設定。