首页 > 其他分享 >SpringMVC执行流程注解版

SpringMVC执行流程注解版

时间:2023-08-23 10:24:21浏览次数:37  
标签:拦截器 return SpringMVC 流程 视图 new Override 注解 public

下面是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

相关文章

  • Lombok 常用注解·····
    ​ Lombok是一个Java库,它提供了一组注解,可以帮助开发人员简化Java代码。以下是Lombok常用的注解:importlombok.*;importlombok.extern.slf4j.Slf4j;/***@Auther:TianWei_18811580953*@Date:2023/8/23-08-23-9:36*@Description:com.jjj.da*@ve......
  • 执行流程
    packagecom.mytest;importorg.junit.jupiter.api.*;importstaticorg.junit.jupiter.api.Assertions.assertEquals;publicclassCase2Test{//前置条件,只执行一次,方法必须时static@BeforeAllstaticvoidsetUpAll(){System.out.println("所有......
  • java流程控制01.Scanner
    用户交互ScannerScanner交互,在之前的基本语法学习中,并没有实现程序和人的交互,但是Java给我们提供了一个工具类,我们可以获取用户的输入。java.util.Scanner是java5的新特征,我们可以通过Scanner类来获取用户的输入。基本语法:Scanners=newScanner(System.in);通过Scanner......
  • SpringMVC 中中文乱码解决
    请求中文乱码在web.xml中配置spring自带的过滤器org.springframework.web.filter.CharacterEncodingFilter,只可以解决请求<!--spring自带的解决中文乱码的filter--><filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.fil......
  • Hello, SpringMVC
    springMVC的执行流程 具体流程(1)当用户通过浏览器发起一个HTTP请求,请求直接到前端控制器DispatcherServlet;(2)前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler,并将它返回给前端控制器;(3)前端控制器调用处理器适配器Handle......
  • LAMP搭建流程与应用
    LAMP搭建流程1、环境准备 [root@localhostopt]#systemctlstopfirewalld.service [root@localhostopt]#setenforce02、安装环境依赖包 [root@localhostopt]#yuminstall-y\ gcc\        #c语言编译器 gcc-c++\      #c编译......
  • 充电玩具外销美国ASTM F963 4.4标准办理流程
    中国制造的玩具以其质量稳定、价格优惠而受到世界各地消费者的青睐。然而,出口到美国这样一个重要市场需要符合一系列的标准要求,其中ASTMF9634.4标准是最为关键的之一。下面将介绍一下充电玩具外销美国ASTMF9634.4标准的办理流程。首先,如何确定自己的产品是否属于充电玩具范畴?根......
  • 国标GB28181视频平台EasyGBS国标平台添加针对H.265视频流的告警信息的具体操作流程
    EasyGBS国标视频云服务支持设备/平台通过国标GB28181协议注册接入,可实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。在EasyGBS平台中接入......
  • 注解
    1.元注解@Target说明修饰对象范围@Retention:定义该注解被保留的时间长短,SOURCE源文件保留,CLASSclass文件保留,RUNTIME运行时保留@Documented:描述javadoc@Inherited:阐述了某个被标注的类型是被继承的2.注解处理TestProvider注解@Target(ElementType.FIELD)......
  • 企业级快速开发平台,助力企业走入流程化管理,创造高效办公!
    要想实现高效办公,创造流程化管理新时代,需要借助一些优秀平台来实现目标。企业级快速开发平台是当前较为流行的软件平台,拥有多项典型功能,可以摒弃传统办公带来的效率低下、难维护等各种矛盾,一起创造流程化管理和数字化发展新时代。流辰信息是专业研发低代码技术平台的服务商,是提供......