我已經讀過關於服務層和控制器之間差異的許多理論,並且我在實踐中遇到了一些關於如何實現這一點的問題。一個答案Service layer and controller: who takes care of what?說:服務層和控制器在實踐中的區別
我試圖限制控制器做相關驗證HTTP 參數工作,決定什麼樣的服務方法有哪些參數, 放什麼在HttpSession或要求,什麼以叫重定向或 轉發或類似的網絡相關的東西。
紅旗:
溫控器的請求過多的服務層:如果我的控制器體系結構可能會越來越糟糕。 控制器向服務層發出若干請求,而不是 返回數據。 Controller不通過參數向服務層 發出請求。
目前我正在開發使用Spring MVC的web應用程序,我有這樣的方法節省改變用戶的電子郵件:
/**
* <p>If no errors exist, current password is right and new email is unique,
* updates user's email and redirects to {@link #profile(Principal)}
*/
@RequestMapping(value = "/saveEmail",method = RequestMethod.POST)
public ModelAndView saveEmail(
@Valid @ModelAttribute("changeEmailBean") ChangeEmailBean changeEmailBean,
BindingResult changeEmailResult,
Principal user,
HttpServletRequest request){
if(changeEmailResult.hasErrors()){
ModelAndView model = new ModelAndView("/client/editEmail");
return model;
}
final String oldEmail = user.getName();
Client client = (Client) clientService.getUserByEmail(oldEmail);
if(!clientService.isPasswordRight(changeEmailBean.getCurrentPassword(),
client.getPassword())){
ModelAndView model = new ModelAndView("/client/editEmail");
model.addObject("wrongPassword","Password doesn't match to real");
return model;
}
final String newEmail = changeEmailBean.getNewEmail();
if(clientService.isEmailChanged(oldEmail, newEmail)){
if(clientService.isEmailUnique(newEmail)){
clientService.editUserEmail(oldEmail, newEmail);
refreshUsername(newEmail);
ModelAndView profile = new ModelAndView("redirect:/client/profile");
return profile;
}else{
ModelAndView model = new ModelAndView("/client/editEmail");
model.addObject("email", oldEmail);
model.addObject("emailExists","Such email is registered in system already");
return model;
}
}
ModelAndView profile = new ModelAndView("redirect:/client/profile");
return profile;
}
你可以看到,我有很多的請求到服務層,我從控制器重定向 - 這是業務邏輯。請顯示此方法的更好的版本。
另一個例子。我有這樣的方法,它返回用戶的個人資料:
/**
* Returns {@link ModelAndView} client's profile
* @param user - principal, from whom we get {@code Client}
* @throws UnsupportedEncodingException
*/
@RequestMapping(value = "/profile", method = RequestMethod.GET)
public ModelAndView profile(Principal user) throws UnsupportedEncodingException{
Client clientFromDB = (Client)clientService.getUserByEmail(user.getName());
ModelAndView model = new ModelAndView("/client/profile");
model.addObject("client", clientFromDB);
if(clientFromDB.getAvatar() != null){
model.addObject("image", convertAvaForRendering(clientFromDB.getAvatar()));
}
return model;
}
方法convertAvaForRendering(clientFromDB.getAvatar())被放置在超類此控制器,它是這種方法的正確擺放,否則他必須放在服務層??
請幫忙,這對我來說真的很重要。
您應該忘記「Controller向Service層發出太多請求,Controller向Service層發出一些不返回數據的請求,Controller向Service層發出請求而不傳入參數。 「聽起來像*非感*對我 – 2016-07-30 20:08:07
「請顯示更好的版本的這種方法?」,請嘗試codereview.stackexchange.com –