1.拦截器
拦截器是运行在DispatcherServlet
之后,在每个Controller
之前的,且运行结果可以选择放行或拦截!
除此以外,拦截器还会运行在Controller
之后,关于拦截器,在处理某一个请求时,最多有3次执行!只不过,通常关注最多的是第1次执行,即在Controller
之前的那次!
HandlerInterceptor三个方法:
preHandle (HttpServletRequest request, HttpServletResponse response, Object handle),在请求处理之前进行调用。
postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView),请求进行处理之后调用。
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) ,整个请求结束之后(渲染了对应的视图之后)调用。
自定义一个拦截器:
package com.wx.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import sun.misc.Request;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
/**在请求处理之前进行调用。 */
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//登陆拦截判断
String method = httpServletRequest.getMethod();
//httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest,httpServletResponse);
//重定向
httpServletResponse.sendRedirect("/login");
System.out.println(method);
return false;
}
/**在请求处理之后进行调用。 */
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**整个请求结束之后(渲染了对应的视图之后)调用。*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
配置拦截器:拦截了index方法
<!-- 配置拦截器链 -->
<mvc:interceptors>
<!-- 配置第1个拦截器 -->
<mvc:interceptor>
<!-- 指定拦截路径,不在拦截路径之内的将不予处理,即拦截器根本就不运行 -->
<mvc:mapping path="/index"/>
<mvc:mapping path="/user/password.do"/>
<!-- 指定拦截器类 -->
<bean class="com.wx.Interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
测试:
package com.wx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class InterceptorController {
@GetMapping ("/login")
public String login(){
return "login";
}
}
访问index页面实现了跳转
2.异常处理
在J2EE项目的开发中,每个异常都单独处理,系统的代码耦合度高,工作量大:
(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResover
(2)实现Spring的异常处理接口HandlerExceptionResolver自定义的异常处理器
(3)使用@ExceptionHandler注解实现异常处理
我们使用第二种方式来实现SpringMVC的异常处理
首先自定义一个异常的类:
package com.wx.error;
public class MyException extends Exception {
public MyException(String msg){
super(msg);
}
}
实现异常处理类:
package com.wx.error;
import com.sun.glass.ui.View;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
public class CustomExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if (e instanceof IOException) {
return new ModelAndView("error");
} else if (e instanceof SQLException) {
return new ModelAndView("error");
} else if (e instanceof MyException) {
modelAndView.addObject("msg", e.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
return null;
}
}
SpringMvc的配置文件中加上bean注入:‘
<!-- 自定义的实现类 -->
<bean id="exceptionHandler" class="com.wx.error.CustomExceptionHandler"/>
<!-- 默认的实现类注入 -->
添加一个错误页:
测试:
package com.wx.controller;
import com.wx.error.MyException;
import com.wx.service.FilmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ExceptionController {
@Autowired
private FilmService filmService;
@RequestMapping("/exception1")
@ResponseBody
public String exception1() throws Exception {
System.out.println("alalaal");
//当某种业务条件不满足的时候抛出异常
boolean condition = true;
if (condition) {
MyException myException = new MyException("Controller层异常");
throw myException;
}
return "string";
}
@RequestMapping("/exception2")
@ResponseBody
public String exception2() throws Exception {
System.out.println("alalaal");
//当某种业务条件不满足的时候抛出异常
filmService.exception();
return "string";
}
}
访问:http://localhost:8080/exception1
访问:http://localhost:8080/exception2