【发布时间】:2016-12-05 07:07:22
【问题描述】:
我已经阅读了很多关于服务层和控制器之间差异的理论,对于如何在实践中实现这一点我有一些疑问。 Service layer and controller: who takes care of what? 的一个回答说:
我试图限制控制器做与验证 http 相关的工作 参数,决定使用什么参数调用什么服务方法, 在 httpsession 或请求中放入什么,重定向什么视图或 转发或类似的网络相关内容。
危险信号:如果出现以下情况,我的控制器架构可能会变坏:
Controller 向 Service 层发出过多请求。这 控制器向服务层发出许多请求 返回数据。控制器向服务层发出请求 不传入参数。
目前我正在使用 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层??
请帮忙,这对我来说真的很重要。
【问题讨论】:
-
你应该忘记“控制器向服务层发出太多请求。控制器向服务层发出大量请求,但没有返回数据。控制器向服务层发出请求没有传递参数。”对我来说听起来像无意义
-
“请显示此方法的更好版本?”,试试 codereview.stackexchange.com
标签: java spring-mvc model-view-controller