SpringMVC执行流程注解版
下面是Spring MVC执行流程的注解版:
存在的问题:·
1.web.xml文件需要存在(不然Tomcat(log->GBK编码)的War包构建不成功,部署会失败).
三大组件:Listener->Filter->Servlet
controller依赖与service所以service的ioc容器的创建要早于controller,spring容器的创建要早于web容器
ContextLoaderListener
Spring提供了监听器ContextLoaderListener,实现ServletContextListener接口,可监听
ServletContext的状态,在web服务器的启动,读取Spring的配置文件,创建Spring的IOC容器。web
应用中必须在web.xml中配置
<listener>
<!--
配置Spring的监听器,在服务器启动时加载Spring的配置文件
Spring配置文件默认位置和名称:/WEB-INF/applicationContext.xml
可通过上下文参数自定义Spring配置文件的位置和名称
-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--自定义Spring配置文件的位置和名称-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
2.spring和springmvc需要加载bean会有冲突的问题,可以统一管理Bean等
3.命名空间需要注意(系统自动提示的往往不能使用,需要注意)
4.加载外部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的基本执行流程,通过注解可以更加简洁地配置和管理控制器。

浙公网安备 33010602011771号