下面是Spring MVC执行流程的注解版:
存在的问题:·
1.web.xml文件需要存在(不然Tomcat(log->GBK编码)的War包构建不成功,部署会失败).
2.spring和springmvc需要加载bean会有冲突的问题,可以统一管理Bean等
WebInit(代替web.xml)
//代替web.xml public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer { @Override //设置一个配置类代替Spring的配置文件 protected Class<?>[] getRootConfigClasses() { //配置文件 return new Class[]{SpringConfig.class}; } @Override //设置一个配置类代替SpringMVC的配置文件 protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; } @Override //设置SpringMVC的前端控制器DispatcherServlet的url-pattern protected String[] getServletMappings() { return new String[]{"/"}; } @Override //设置当前的过滤器 protected Filter[] getServletFilters() { //创建编码过滤器 CharacterEncodingFilter encodingFilter=new CharacterEncodingFilter(); encodingFilter.setEncoding("UTF-8"); encodingFilter.setForceEncoding(true); //创建处理请求方式的过滤器 HiddenHttpMethodFilter hiddenHttpMethodFilter=new HiddenHttpMethodFilter(); //返回过滤器方式 return new Filter[]{encodingFilter,hiddenHttpMethodFilter}; } }
SpringConfig(代替Spring.xml)
1 //先不配置,到SSM整合使用 2 @Configuration//将当前的类标识为配置类,代替Spring的配置文件 3 @ComponentScan("top.b3222.aMvc.interceptor") 4 public class SpringConfig { 5 }
WebConfig(代替SpringMVC.xml)
20 //扫描组件,视图解析器,默认的servlet,mvc的注解驱动 21 //视图控制器,文件上传解析器,拦截器,异常处理器 22 //相当于springmvc.xml//有很多默认方法 23 @Configuration 24 //扫描组件 25 @ComponentScan("top.b3222.aMvc.controller") 26 //开启Mvc的注解驱动 27 @EnableWebMvc 28 public class WebConfig implements WebMvcConfigurer { 29 @Override 30 //默认的Servlet,处理静态资源 31 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 32 configurer.enable(); 33 } 34 @Override 35 //配置视图解析器 36 public void addViewControllers(ViewControllerRegistry registry) { 37 registry.addViewController("/").setViewName("index"); 38 } 39 // @Bean 40 // //文件上传解析器,将标识的方法的返回值作为Bean进行管理 41 // public CommonsMultipartResolver multipartResolver(){ 42 // return new CommonsMultipartResolver(); 43 // } 46 @Override 47 //拦截器 48 public void addInterceptors(InterceptorRegistry registry) { 49 FirstInterceptor firstInterceptor = new FirstInterceptor(); 50 registry.addInterceptor(firstInterceptor).addPathPatterns("/**").excludePathPatterns("/"); 51 } 53 @Override 54 //配置异常解析器 55 public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { 56 SimpleMappingExceptionResolver exceptionResolver=new SimpleMappingExceptionResolver(); 57 Properties prop=new Properties(); 58 prop.setProperty("java.lang.ArithmeticException","error"); 59 exceptionResolver.setExceptionMappings(prop); 60 exceptionResolver.setExceptionAttribute("ex"); 61 resolvers.add(exceptionResolver); 62 } 64 @Bean 65 public ITemplateResolver templateResolver() { 66 WebApplicationContext webApplicationContext =ContextLoader.getCurrentWebApplicationContext(); 67 // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得 68 ServletContextTemplateResolver templateResolver = new 69 ServletContextTemplateResolver(webApplicationContext.getServletContext()); 70 templateResolver.setPrefix("/WEB-INF/templates/"); 71 templateResolver.setSuffix(".html"); 72 templateResolver.setCharacterEncoding("UTF-8"); 73 templateResolver.setTemplateMode(TemplateMode.HTML); 74 return templateResolver; 75 } 76 //生成模板引擎并为模板引擎注入模板解析器 77 @Bean 78 public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { 79 SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 80 templateEngine.setTemplateResolver(templateResolver); 81 return templateEngine; 82 } 83 //生成视图解析器并未解析器注入模板引擎 84 @Bean 85 public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { 86 ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 87 viewResolver.setCharacterEncoding("UTF-8"); 88 viewResolver.setTemplateEngine(templateEngine); 89 return viewResolver; 90 } 92 }
拦截器配置interceptor->FirstInterceptor
多个拦截器的执行顺序
①若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:
preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行
②若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false
的拦截器之前的拦截器的afterCompletion()会执行
1 @Component 2 public class FirstInterceptor implements HandlerInterceptor { 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//为true放行 5 return true; 6 } 7 @Override 8 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 9 } 10 @Override 11 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 12 } 13 }
异常处理器(可以被配置类加载Bean)
//@ControllerAdvice将当前类标识为异常处理的组件 @ControllerAdvice public class ExceptionController { //@ExceptionHandler用于设置所标识方法处理的异常 @ExceptionHandler(ArithmeticException.class) //ex表示当前请求处理中出现的异常对象 public String handleArithmeticException(Exception ex, Model model){ model.addAttribute("ex", ex); return "error"; } }
1. 客户端发送HTTP请求到DispatcherServlet。
2. DispatcherServlet是前端控制器,它接收到请求后将其委派给处理器映射器(HandlerMapping)。
3. 处理器映射器根据请求的URL映射到相应的处理器(Controller)。
4. 处理器执行业务逻辑,并返回一个ModelAndView对象,其中包含了模型数据和视图名称。
5. 处理器适配器(HandlerAdapter)将处理器包装成一个可执行的Handler对象。
6. Handler对象被调用执行业务逻辑。
7. 处理器返回一个ModelAndView对象给DispatcherServlet。
8. DispatcherServlet将ModelAndView对象中的模型数据传递给视图解析器(ViewResolver)。
9. 视图解析器根据视图名称解析出具体的视图对象(View)。
10. 视图对象负责渲染模型数据,并生成最终的响应结果。
11. DispatcherServlet将响应结果返回给客户端。
这是Spring MVC的基本执行流程,通过注解可以更加简洁地配置和管理控制器。
标签:拦截器,return,SpringMVC,流程,视图,new,Override,注解,public From: https://www.cnblogs.com/topb3222/p/17650493.html