MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
2.spring mvc的执行原理- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。
- HanderMapping处理器映射器,根据请求的url找到对应的handler。
- HandlerExecution将解析信息传给DispatcherServlet。
- HandlerAdapter处理器适配器,按照路径去执行Handler
- Controller访问根据请求做执行对应的业务逻辑,返回(ModelAndView)
- ViewResolver视图解析器:根据ModelAndView传过来的结果调用对应的视图,渲染数据。
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器:
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器:
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的
过滤器注解使用
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//类似于在web.xml中注册了,根据类名排序来执行
//@WebFilter(filterName = "TestFilter1",urlPatterns = "/*")
public class TestFilter2 implements Filter {
//容器在创建当前过滤器的时候自动调用;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("====================TestFilter1容器创建了=========================");
}
//过滤器的主要代码写在这个地方
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("====================TestFilter1方法执行了=========================");
//因为有可能不止这一个过滤器,所以需要将所有的过滤器执行
//注意 这一行代码一定要写到最后
filterChain.doFilter(servletRequest,servletResponse);
}
//容器在销毁当前过滤器的时候自动调用
@Override
public void destroy() {
System.out.println("====================TestFilter1容器销毁了=========================");
}
}
过滤器配置web.xml使用
TestFilter2
com.wwy.common.TestFilter2
TestFilter2
/*
TestFilter1
com.wwy.common.TestFilter1
TestFilter1
/*
拦截器的使用:
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//执行请求方法前调用的方法
System.out.println("------------处理前------------");
//返回false则终止方法
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
//执行请求方法后调用的方法
System.out.println("------------处理后------------");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//dispatcherServlet执行后清理的方法
System.out.println("------------清理------------");
}
}
拦截器mvc里面的配置文件:
拦截器的执行顺序
1、跟配置文件的顺序有关,链式执行;
2、如果第一个pre就返回false,是不会进入第二个拦截器的



