博主由於打算要考研,因此爲了給本身留一手後路。學習了SSM框架。這學期就作了一個完整的SSM項目。(若是考研失敗就去外包作一波CRUD boy)前端
因此邊考研邊利用業餘時間作了一學期,接着期末一週的Web課設時間終於把這個項目1.0搞定了。java
下面就來談一下開發完我開發完這個項目的心得:spring
本身之前作項目就是方法,類什麼的都放得比較亂,通過此次完整項目開發。瞭解了不只先後端要分離,後端也要分類別類的存放,這樣有利於後期的修改以及sql
讓人看起來神清氣爽,至少這樣作確實若是後期要修改以前的代碼會方便不少。數據庫
在後端:後端
主要目錄就是這幾個服務器
首先談談Controller層:Controller是先後端對接的地方。接收前端請求,接收前端數據,app
轉換格式後框架
調用Service進行處理後,以Map<String,Object>格式返回ide
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等等