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的基本执行流程,通过注解可以更加简洁地配置和管理控制器。

posted @ 2023-08-23 10:13  一只小小菜鸡  阅读(27)  评论(0)    收藏  举报