标签:end targe cto 浏览器 sage 三种方式 fail servlet inf
对异常的处理,除了使用try-catch外,在Spring下还提供了配置简单异常处理和使用@ExceptionHandler注解的方法,另外异常还有系统异常和应用异常的区别,针对不同的异常如何抛送给用户也需要考虑。
系统异常:由于系统故障导致的异常,如网络中断、数据库关闭这种的,导致访问失败归为系统异常
应用异常:由于用户操作不当导致的异常,如填写错误用户名和密码,或者不是按照业务正常的逻辑使用页面,归为应用异常
参考前面刚做的登录界面,如果用户输入错误用户名或密码,则是应用异常,如果用户登录时数据库被关闭了出现的异常,则是系统异常,针对两种异常,需要区分后抛送给用户,参考第一篇博文,它定义了一个异常类来专门区分,将应用异常全部抛送为自定义异常,系统异常为其他异常。
(1)异常的try-catch处理
自定义异常类
1 package com.boe.exception; 2 3 public class ApplicationException extends RuntimeException{ 4 public ApplicationException() { 5 6 } 7 //用此创建的对象,可以用getMessage来获取错误信息 8 public ApplicationException(String message) { 9 super(message); 10 // TODO Auto-generated constructor stub 11 } 12 }
在catch里根据异常的类型不同,抛出不同的提示给用户做到区分。如下第18行,通过实例化对象判断实现区分,是应用异常,就获取业务层抛出的错误信息,将其发送给login页面并提示,如果是系统异常就进入loginNG界面。
1 //验证登录 2 @RequestMapping("/logincheck.do") 3 public String login(userInfo data,ModelMap mm,HttpSession session) { 4 System.out.println("登录验证"); 5 System.out.println("用户名为:"+data.getUser()); 6 System.out.println("密码为:"+data.getPwd()); 7 //处理业务层异常 8 try { 9 Admin admin=service.checkLogin(data.getUser(), data.getPwd()); 10 if(admin!=null) { 11 System.out.println("登录成功"); 12 mm.addAttribute("user",data.getUser()); 13 //登录成功后,将admin信息存入session 14 session.setAttribute("loginData", admin); 15 } 16 }catch(Exception e) { 17 //应用错误,即用户填写错误 18 if(e instanceof ApplicationException) { 19 mm.addAttribute("login_fail", e.getMessage()); 20 mm.addAttribute("username",data.getUser()); 21 mm.addAttribute("password", data.getPwd()); 22 return "login"; 23 } 24 //系统错误 25 return "loginNG"; 26 } 27 return "loginOK"; 28 }
(2)异常借助Spring简单异常处理
修改上面登录验证方法,将try-catch去掉简,在Spring下也可以实现异常处理,需要在applicationContext.xml文件中配置简单异常处理,它有个弊端,就是不能预估所有可能抛出的异常,每次新增抛出一次异常需要添加一个配置,不能覆盖所有的异常,不能对异常做复杂处理,如本例中无法将异常消息传递给登录页面。
修改后登录login方法
1 //验证登录 2 @RequestMapping("/logincheck.do") 3 public String login(userInfo data,ModelMap mm,HttpSession session) { 4 System.out.println("登录验证"); 5 System.out.println("用户名为:"+data.getUser()); 6 System.out.println("密码为:"+data.getPwd()); 7 //处理业务层异常 8 /** 9 try { 10 Admin admin=service.checkLogin(data.getUser(), data.getPwd()); 11 if(admin!=null) { 12 System.out.println("登录成功"); 13 mm.addAttribute("user",data.getUser()); 14 //登录成功后,将admin信息存入session 15 session.setAttribute("loginData", admin); 16 } 17 }catch(Exception e) { 18 //应用错误,即用户填写错误 19 if(e instanceof ApplicationException) { 20 mm.addAttribute("login_fail", e.getMessage()); 21 mm.addAttribute("username",data.getUser()); 22 mm.addAttribute("password", data.getPwd()); 23 return "login"; 24 } 25 //系统错误 26 return "loginNG"; 27 } 28 */ 29 //不使用try-catch 30 Admin admin=service.checkLogin(data.getUser(), data.getPwd()); 31 if(admin!=null) { 32 System.out.println("登录成功"); 33 mm.addAttribute("user",data.getUser()); 34 //登录成功后,将admin信息存入session 35 session.setAttribute("loginData", admin); 36 } 37 return "loginOK"; 38 }
applicationContext.xml中配置简单异常处理
1 <!-- 配置简单异常类SimpleMappingExceptionResolve --> 2 <!-- 应用异常 --> 3 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 4 <property name="exceptionMappings"> 5 <props> 6 <prop key="com.boe.exception.ApplicationException">login</prop> 7 </props> 8 </property> 9 </bean>
输入错误的用户名或者密码后,会重新进入登录页面,但是不能提示到底是用户名错还是密码错。
(3)使用注解@ExceptionHandler的方式
可以看到上面提示无法解决,使用注解的方式就可以。
step1 在处理器当中添加一个异常处理方法,该方法前面需添加@ExceptionHandler注解
step2 在异常处理方法里面,依据异常类型做异常处理,提示用户
1 /** 2 * 添加异常处理方法,使用注解@ExceptionHandler 3 * @param e 方法抛出的异常 4 * @param request 请求 5 * @return 视图名 6 */ 7 @ExceptionHandler 8 public String exceptionHandler(Exception e,HttpServletRequest request) { 9 if(e instanceof ApplicationException) { 10 //应用异常,获取异常信息,并发送浏览器 11 request.setAttribute("login_fail", e.getMessage()); 12 //返回登录页面 13 return "login"; 14 }else { 15 //系统异常,进入loginNG界面 16 return "loginNG"; 17 } 18 }
再次输入错误用户名或密码,将能提示用户。
以上是错误处理的三种方式,在区分异常类型方面,可以使用try-catch或者@ExceptionHandler注解的方式,配置简单异常的也可以但是存在弊端,无法将具体错误信息返回,并且有多少个异常就需要配置多少信息(key=异常类全名,value=视图名)。
参考博文:
(1)https://www.cnblogs.com/youngchaolin/p/11354307.html 登录
标签:end targe cto 浏览器 sage 三种方式 fail servlet inf
原文地址:https://www.cnblogs.com/youngchaolin/p/11364818.html