在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对象中。
文章评论