博主因為打算要考研,所以為了給自己留一手后路。學習了SSM框架。這學期就做了一個完整的SSM項目。(如果考研失敗就去外包做一波CRUD boy)
所以邊考研邊利用業余時間做了一學期,接着期末一周的Web課設時間終於把這個項目1.0搞定了。
下面就來談一下開發完我開發完這個項目的心得:
自己以前做項目就是方法,類什么的都放得比較亂,經過這次完整項目開發。了解了不僅前后端要分離,后端也要分類別類的存放,這樣有利於后期的修改以及
讓人看起來神清氣爽,至少這樣做確實如果后期要修改之前的代碼會方便很多。
在后端:
主要目錄就是這幾個

首先談談Controller層:Controller是前后端對接的地方。接收前端請求,接收前端數據,
轉換格式后
調用Service進行處理后,以Map<String,Object>格式返回
dto層:我理解的是存放Service的返回類型,來存儲Service從Mapper層中查詢的內容
這里可能會有點模糊的是,為什么不直接返回pojo的實體類
原因是:拿添加來舉例,如果添加則必定會有添加成功或者失敗的情況。如果失敗,那么會有一個失敗原因
所以必須把失敗原因返回給Controller來處理,所以就創建一個dto類來放有關Service的返回類
例如:
package com.how2java.dto; import com.how2java.enums.OrderStateEnum; import com.how2java.pojo.Order; import java.util.List; public class OrderExecution { //結果狀態 private int state=0; //狀態標識 private String stateInfo; //訂單數量 private int count; //操作的Order-增查 private List<Order> orderList; //添加時的Order private Order order; public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } public int getState() { return state; } public void setState(int state) { this.state = state; } public String getStateInfo() { return stateInfo; } public void setStateInfo(String stateInfo) { this.stateInfo = stateInfo; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public List<Order> getOrderList() { return orderList; } public void setOrderList(List<Order> orderList) { this.orderList = orderList; } public OrderExecution() { } //店鋪操作失敗時候使用的構造器 public OrderExecution(OrderStateEnum stateEnum) { this.state = stateEnum.getState(); this.stateInfo = stateEnum.getStateInfo(); } //店鋪操作成功時候使用成功的構造器 public OrderExecution(OrderStateEnum stateEnum, Order order) { this.state = stateEnum.getState(); this.stateInfo = stateEnum.getStateInfo(); this.order = order; } //店鋪操作成功時候使用成功的構造器 public OrderExecution(OrderStateEnum stateEnum, List<Order> orderList) { this.state = stateEnum.getState(); this.stateInfo = stateEnum.getStateInfo(); this.orderList = orderList; } }
還可以存放Controller的返回類 如若Controller只返回一種類型的數據 我們可以在dto中編寫一個
Result類同時存儲返回狀態值和返回數據
還可以存放Controller里面圖片處理類 用來專門封裝名稱和數據流 直接返回給Service處理
其實后兩種我認為歸於后面的util工具類可能會更合理
enums層:主要存儲操作數據庫最后的狀態成功與否,和失敗原因 來與dto的Excution層進行比對判斷失敗與否 獲取失敗原因
package com.how2java.enums; public enum OrderStateEnum { SUCCESS(1, "操作成功"), INNER_ERROR(-1001, "操作失敗"), EMPTY_LIST(-1002, "訂單列表為空"),NULL_ORDER(-1003,"Order信息為空"); private int state; private String stateInfo; public int getState() { return state; } public String getStateInfo() { return stateInfo; } private OrderStateEnum(int state, String stateInfo) { this.state = state; this.stateInfo = stateInfo; } /** * 依據傳入的state返回相應的enum值; */ public static OrderStateEnum stateOf(int state) { for (OrderStateEnum stateEnum :values()) { if (stateEnum.getState() == state) { return stateEnum; } } return null; } }
exceptions層:
主要是Service的超時錯誤 它的本質就是一個RuntimeException,用於操作超時拋出
這么做的好處是如果超時,又涉及多個Service操作時,可以輕松找到是哪個地方超時
package com.how2java.exceptions; public class OrderOperationException extends RuntimeException{ public OrderOperationException(String msg){ super(msg); } }
mapper層:
則是SSM與數據庫直接進行交互的地方 用Sql語句來操作數據庫
pojo層:
項目要操作的實體類,里面存放各種實例類(屬性以及set,get方法)
service層:
服務層由兩部分構成一部分是服務接口,一部分則是服務的具體實現
服務實現:則是將前台獲取的信息就行具體處理:如文件存儲和數據庫存儲
則可以調用事物來進行處理
並在調用mapper前進行簡單的邏輯判斷:檢查是否有必要調用maaper層,如若存取數據非法,在Service
即可直接進行處理並返回處理結果給Controller,如若數據合法,完成與數據庫無關的操作后就可以調用mapper層來存儲數據庫了
設計多步驟,我們要在Service的方法中添加@Transactional
如若一步出錯則執行回滾
test層:
此層為測試層,用來對寫好的 mapper ,service,方法做單元測試
package com.how2java; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class BaseTest { }
然后直接繼承BaseTest就可以了 不用再寫junit配置
最后就是util層
這個主要是存放工具類
工具類為各層反復調用的方法,則可以把它抽象出來 單獨建類
如:驗證碼校驗,圖片處理,前端提取Requset 傳來的Json,根據其鍵值 獲取值等
SSM后端部分結構根據我的理解,就大概是這樣。因為這個學期需要考研。還要准備畢業設計。
這個學期新做的O2O商城項目可能沒時間發布到服務器了(因為Linux的路徑和Windows不同,項目路徑還需要重新調試)可能沒時間發布了
在此也建議大家可以利用大一大二時間好好學習。泳有一定的開發經驗。
如果想走Java后端方向:
可以按這個學習
現學 Servelet 再剛SSM,做個SSM項目,后續可以看看深入理解Jvm,和高性能Mysql,netty等等
