异常是java的一大特色,用好了受益匪浅!不瞎扯了,开始写用法,这里控制层用的spring mvc!
思考问题,我们如何做才能使得service层彻底处理所有业务逻辑从而基本实现service和controller层的完全解耦?
所有做过开发的都知道,struts2在处理服务器验证的时候一般会把验证逻辑放在action,这样做没有什么不好,但是如果放在service是否更好,还有其他一些特殊的逻辑要放在service层,有时候特别不方便!现在,我讲讲我所使用的异常转换问题,相信各位大神轻松理解,在自己实际项目中也可以用到!
以service层处理参数验证问题为例:
1.定义parameter异常来封装无需和数据库交互的参数错误信息:
public class ParameterException extends Exception {
private static final long serialVersionUID = 1L;
private Map<String, String> fields = new HashMap<String, String>();
public Map<String, String> getFields() {
return fields;
}
public void setFields(Map<String, String> fields) {
this.fields = fields;
}
public void addFields(String key, String value) {
fields.put(key, value);
}
public boolean isEmpty() {
return fields.isEmpty();
}
public ParameterException() {
super();
// TODO Auto-generated constructor stub
}
public ParameterException(String message, String flag) {
super(message);
}
}
</pre><p></p><pre>
2.定义ServiceException来封装需要和数据库交互的参数错误信息,如密码不正确
public class ServiceException extends Exception {
private static final long serialVersionUID = 1L;
private int code = 0;
private String message = null;
public ServiceException(int code, String message) {
this.message = message;
this.code = code;
}
public ServiceException() {
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
3.Service层以login为例,验证用户名,密码信息:
@Override
public User login(String userNumber, String password)
throws ParameterException, ServiceException {//这里抛出具体的异常
User user = null;
password = DigestUtils.md5Hex(password);
ParameterException parameterException = new ParameterException();
if (StringUtil.isEmpty(userNumber) || StringUtil.isEmpty(password)) {
parameterException.addFields("loginMessage", "用户名或密码为空");
throw parameterException;
}
user = userDao.getUserByUserNumber(userNumber);
if (user == null) {
throw new ServiceException(10000, "用户不存在");
} else if (!password.equals(user.getPassword())
&& !userNumber.equals(user.getUserName())) {
throw new ServiceException(10001, "密码不正确");
}
return user;
}
4.controller层处理异常,返回信息到页面:
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login(String userNumber, String password, HttpSession session) {
ModelAndView mav = null;
User user = null;
try {
user = userService.login(userNumber, password);
} catch (ParameterException parameterException) {//这里进行catch操作,出现异常则返回信息到页面
Map<String, String> fields = parameterException.getFields();
mav = new ModelAndView("login");
mav.addObject("fields", fields);
return mav;
} catch (ServiceException serviceException) {
mav = new ModelAndView("login");
mav.addObject("loginMessage", serviceException.getMessage());
return mav;
}
user.setPassword(null);
session.setAttribute("user", user);
Role role = null;
if(user != null) {
role = userService.getRoleByUserId(user.getId());
session.setAttribute("roleName", role.getRoleName());
if("系统管理员".equals(role.getRoleName())) {
mav = new ModelAndView(new RedirectView("list", true));
}
if("学生".equals(role.getRoleName())) {
mav = new ModelAndView(new RedirectView("/student/list", true));
}
if("老师".equals(role.getRoleName())) {
mav = new ModelAndView(new RedirectView("/teacher/list", true));
}
}
return mav;
}
5.页面拿到错误信息并展示:
<form action="${pageContext.request.contextPath }/user/login" method="post" id="login">
<div class="loginTop">
<div class="sysNameStyle">
<div class="sysNameLocate"></div>
</div>
</div>
<div class="loginBottom">
<div class="userName">
<div class="labelStyle">
学号:
</div>
<div class="inputStyle">
<input type="text" name="userNumber" id="userNumber" class="inputWidth"/>
</div>
<div class="errorMessage">
${loginMessage }${fields['loginMessage'] }
</div>
</div>
<div class="passWord">
<div class="labelStyle">
密码:
</div>
<div class="inputStyle">
<input type="password" name="password" id="passWord" class="inputWidth"/>
</div>
</div>
<div class="submit">
<div class="resetLocate">
<input type="reset" value="取消" class="submitStyle"/>
</div>
<div class="submitLocate">
<input type="submit" value="登陆" class="submitStyle"/>
</div>
</div>
</div>
</form>