墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. spring
  4. 正文

SpringMVC 核心组件 DispatcherServlet详解

2023年 5月 21日 259点热度 0人点赞 0条评论

在SpringMVC中,DispatcherServlet是一个非常重要的核心组件之一。它充当了前端控制器的角色,负责接收客户端的请求并将请求分发给相应的Controller进行处理。本文将从以下七个方面详细介绍DispatcherServlet的相关知识。

一、什么是DispatcherServlet

1.1 DispatcherServlet是什么

DispatcherServlet是SpringMVC的核心组件之一。它充当了前端控制器的角色,负责接收客户端的请求并将请求分发给相应的Controller进行处理。

1.2 DispatcherServlet的作用

DispatcherServlet的作用是接收客户端的请求,并将请求分发给相应的Controller进行处理。

1.3 DispatcherServlet的工作原理

DispatcherServlet接收到客户端的请求后,会将请求交给HandlerMapping进行处理,HandlerMapping会根据请求的URL找到相应的Controller,并将请求转发给Controller进行处理。Controller处理完请求后,会返回ModelAndView给DispatcherServlet,DispatcherServlet再将ModelAndView交给ViewResolver进行处理,最终将视图呈现给客户端。

二、DispatcherServlet的执行过程

2.1 请求的到达

客户端的请求首先会到达DispatcherServlet。

2.2 HandlerMapping查找对应的Handler

DispatcherServlet会将请求交给HandlerMapping,HandlerMapping会根据请求的URL查找到相应的Handler。

2.3 HandlerAdapter调用Handler的方法

HandlerAdapter会根据请求的类型调用相应的Handler的方法。比如,如果是一个普通的方法请求,那么HandlerAdapter会调用Controller中的对应方法进行处理。

2.4 Handler的方法处理请求并返回ModelAndView

Handler的方法会根据请求的内容进行处理,并返回一个包含模型数据和视图名称的ModelAndView对象。

2.5 ViewResolver解析ModelAndView并返回View

ViewResolver会根据ModelAndView中的视图名称解析出对应的View。

2.6 View呈现给客户端

DispatcherServlet最终将View呈现给客户端。

三、DispatcherServlet的配置

3.1 DispatcherServlet的配置方式

DispatcherServlet的配置有两种方式,分别是在web.xml中进行配置和通过JavaConfig进行配置。

3.1.1 在web.xml中进行配置

在web.xml中配置DispatcherServlet的方式如下:

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

上述配置会将DispatcherServlet映射到根路径(/)。

3.1.2 通过JavaConfig进行配置

通过JavaConfig配置DispatcherServlet的方式如下:

@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }

    @Bean
    public ServletRegistrationBean dispatcherServletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet(), "/");
        registration.setName("dispatcherServlet");
        return registration;
    }
}

3.2 配置DispatcherServlet的初始化参数

DispatcherServlet有以下几个初始化参数:

  • contextConfigLocation:指定Spring MVC配置文件的位置。
  • namespace:指定命名空间。
  • throwExceptionIfNoHandlerFound:如果找不到符合请求的处理器,抛出异常。

3.3 配置DispatcherServlet的上下文参数

DispatcherServlet的上下文参数可以用来配置Spring MVC的一些属性,如是否开启注解支持、是否开启文件上传等。

四、DispatcherServlet的异常处理

4.1 异常处理的作用

异常处理是指在请求处理过程中发生异常时,将异常捕获并进行处理的过程。

4.2 异常处理的方式

Spring MVC提供了多种异常处理方式,包括:

  • @ExceptionHandler注解
  • HandlerExceptionResolver接口
  • SimpleMappingExceptionResolver类

4.2.1 @ExceptionHandler注解

可以在Controller类中定义一个方法,使用@ExceptionHandler注解来捕获异常。如:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = { ArithmeticException.class, NullPointerException.class })
    public ModelAndView handleException(Exception e) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("exception", e);
        return mav;
    }
}

上述代码中,当发生ArithmeticException或NullPointerException异常时,会将异常信息添加到ModelAndView中,并返回error视图。

4.2.2 HandlerExceptionResolver接口

HandlerExceptionResolver接口是用来解决异常的接口。需要实现该接口,并在Spring MVC配置文件中进行配置。

public class MyExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("exception", ex);
        return mav;
    }
}

上述代码中,当发生异常时,会将异常信息添加到ModelAndView中,并返回error视图。

4.2.3 SimpleMappingExceptionResolver类

SimpleMappingExceptionResolver类是一种简单的异常处理器。需要在Spring MVC配置文件中进行配置。

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.ArithmeticException">error</prop>
            <prop key="java.lang.NullPointerException">error</prop>
        </props>
    </property>
</bean>

上述配置中,当发生ArithmeticException或NullPointerException异常时,会返回error视图。

五、DispatcherServlet的拦截器

5.1 拦截器的作用

拦截器是指在请求处理过程中,对请求进行拦截并进行相应的处理。

5.2 拦截器的实现方式

Spring MVC提供了两种拦截器的实现方式,分别是实现HandlerInterceptor接口和继承HandlerInterceptorAdapter类。

public class MyInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

上述代码中,MyInterceptor继承了HandlerInterceptorAdapter类并实现了其中的三个方法,分别是preHandle、postHandle和afterCompletion。

5.3 拦截器的配置

在Spring MVC配置文件中进行配置。

<mvc:interceptors>
    <bean class="com.example.MyInterceptor" />
</mvc:interceptors>

上述配置中,将MyInterceptor添加到拦截器列表中。

六、DispatcherServlet的视图解析器

6.1 视图解析器的作用

视图解析器是将视图名称解析为View对象的组件。

6.2 视图解析器的实现方式

Spring MVC提供了多种视图解析器的实现方式,包括:

  • InternalResourceViewResolver
  • JstlView
  • VelocityViewResolver
  • FreeMarkerViewResolver
  • TilesViewResolver

6.2.1 InternalResourceViewResolver

InternalResourceViewResolver是Spring MVC默认的视图解析器。它将视图名称解析为JSP页面,并返回InternalResourceView对象。

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

上述代码中,创建了一个InternalResourceViewResolver对象,并将其设置为视图解析器。设置了JSP页面的前缀和后缀,以便将视图名称解析为JSP页面。

6.2.2 JstlView

JstlView是一种将JSP页面作为视图的视图解析器。它支持JSP标准标签库(JSTL)。

@Bean
public ViewResolver viewResolver() {
    JstlViewResolver viewResolver = new JstlViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setViewClass(JstlView.class);
    return viewResolver;
}

上述代码中,创建了一个JstlViewResolver对象,并将其设置为视图解析器。设置了JSP页面的前缀和后缀,以便将视图名称解析为JSP页面。同时,设置了视图类为JstlView。

6.2.3 VelocityViewResolver

VelocityViewResolver是一种将Velocity模板作为视图的视图解析器。

@Bean
public ViewResolver viewResolver() {
    VelocityViewResolver viewResolver = new VelocityViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".vm");
    viewResolver.setCache(true);
    viewResolver.setExposeSpringMacroHelpers(true);
    return viewResolver;
}

上述代码中,创建了一个VelocityViewResolver对象,并将其设置为视图解析器。设置了Velocity模板的前缀和后缀,以便将视图名称解析为Velocity模板。同时,设置了缓存开启、暴露Spring宏助手等属性。

七、DispatcherServlet的参数绑定

7.1 参数绑定的作用

参数绑定是指将请求中的参数绑定到Controller方法的参数中。

7.2 参数绑定的方式

Spring MVC提供了多种参数绑定的方式,包括:

  • @RequestParam注解
  • @PathVariable注解
  • @ModelAttribute注解
  • @RequestBody注解

7.2.1 @RequestParam注解

@RequestParam注解用来将请求参数绑定到Controller方法的参数中。

@RequestMapping("/hello")
public String hello(@RequestParam("name") String name, Model model) {
    model.addAttribute("name", name);
    return "hello";
}

上述代码中,@RequestParam注解将请求参数name绑定到方法参数name中。

7.2.2 @PathVariable注解

@PathVariable注解用来将URL路径中的参数绑定到Controller方法的参数中。

@RequestMapping("/hello/{name}")
public String hello(@PathVariable("name") String name, Model model) {
    model.addAttribute("name", name);
    return "hello";
}

上述代码中,@PathVariable注解将URL路径中的参数name绑定到方法参数name中。

7.2.3 @ModelAttribute注解

@ModelAttribute注解用来将请求参数绑定到JavaBean中。

@RequestMapping("/hello")
public String hello(@ModelAttribute User user, Model model) {
    model.addAttribute("user", user);
    return "hello";
}

上述代码中,@ModelAttribute注解将请求参数绑定到User对象中。

7.2.4 @RequestBody注解

@RequestBody注解用来将请求体中的内容绑定到Controller方法的参数中。

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String hello(@RequestBody User user, Model model) {
    model.addAttribute("user", user);
    return "hello";
}

上述代码中,@RequestBody注解将请求体中的内容绑定到User对象中。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: DispatcherServlet java MVC spring springMVC 核心组件 解析
最后更新:2023年 5月 16日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
降维打击!Mistral Voxtral:开源语音的“终结者”已上线! AI“游侠”降临A股:16个“大脑”组团“炒股”,30秒“算命”市场! 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗?
昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”智能触手可及:Google Gemma-3n 系列模型,让万物皆能“思考”AI圈大地震!120亿参数的FLUX编辑器开源,你的显卡准备好了吗?
设计模式:观察者模式 全网最毒舌的AI暴走指南!一秒教你嘴炮封神! java 持久层框架Hibernate的(超详细总结) nginx配置反向代理教程 AI编程三剑客:Cline+DeepSeek R1+Claude3.5智能编码实战指南 无缝衔接设备跨平台本地AI好助手:OllamaTalk 部署教程与深度解析
标签聚合
算法 设计模式 AI deepseek spring 大模型 教程 java

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策