SpringMVC應該是目前web開發最經常使用的框架。他的項目結構也相對固定,通常都會有如下幾層。前端
這裏主要講下controller層 和 service層,由於我實際工做中發現,什麼該放在controller層,什麼該放在 service層,彷佛每家公司都有本身的作法。web
最近一個項目是這樣安排的數據庫
public class DepartmentController {
@Autowired
private DepartmentService departmentService;
/**
* 刪除部門
* @param departmentId
* @return
*/
@RequestMapping(value = "/department", method= RequestMethod.DELETE)
public Result delete(String departmentId){
return departmentService.delete(departmentId);
}
}
public class DepartmentService {
@Autowired
private DepartmentMapper departmentMapper;
@Autowired
private UserService userService;
/**
* 刪除部門
* @param departmentId
* @return
*/
@RequestMapping(value = "department", method= RequestMethod.DELETE)
public Result delete(String departmentId){
if(departmentId == null || "".equals(departmentId)){
return new FailResult("部門id不合法");
}
//刪除部門前,查看部門下是否存在人員
Result result = userService.getUserList(departmentId);
//拆解result 找出結果
List<User> List = result.getDate();
if(if list != null && list.size > 0){
return new FailResult("部門下是否存在人員");
}
int i = departmentService.delete(departmentId);
if(i == 1){
return new SuccessResult<Boolean>(true);
}
return new FailResult("刪除失敗");
}
}
複製代碼
上面代碼中,Controller層的任務很是簡單,接收前端的參數而後傳給service,service處理完後返回最終結果,至於 參數傳沒穿,格式對不對,甚至最後返回結果的封裝,都放到service中去處理。
咱們能夠看到service的任務很是集中,很是重,而Controller的任務很是輕,就只作了一個轉發的操做。其實這樣分配很是不合理,特別是 最終返回結果的封裝,很是不該該放在service裏面。
上面代碼中咱們想刪除一個部門,先要判斷部門下是否存在人員,因而咱們調用人員的service,結果他返回的是給前端展現的對象,因而咱們不得不,拆解對象,取出咱們想要的結果,很是麻煩。若是他把Result的封裝放在Controller層就很是方便了,service層能夠直接返回處理結果。bash
通過此次項目後,我一直在思考,Controller層和service層的職責應該怎樣設計纔好。下面說下個人見解。app
Controller層是前端直接接觸的層,離用戶最近,同時也表明着一個接口。
他的任務應該是你按照個人要求傳遞規定的參數,而且參數的值也合法的話,我就返回給你想要的結果。
從上面分析能夠看出Controller層關注點在兩個方面,請求參數,和響應結果。框架
所以,controller層的任務是ui
因此Controller層的職責總結起來就兩點。spa
service層負責的是業務的處理,它的關注的是業務,不該該作與業務沒有直接關係的事情。 好比:設計
這樣設計的緣由是但願各層職責分明,每層負責本身的事,這樣作還有一個好處,那就是,不會存在某層很是 「重」,而某層又很是 「輕」 的狀況。code