详解SpringMVC的url-pattern配置及原理剖析

简介

在Spring MVC中,url-pattern是一个非常重要的配置项,它决定了哪些请求会被分发给Spring MVC的DispatcherServlet进行处理。本文将详细介绍url-pattern的配置方式及其原理,并提供两个示例说明。

url-pattern的配置方式

在Spring MVC中,url-pattern可以通过多种方式进行配置,如在web.xml中配置、在注解中配置、在Java配置类中配置等。以下是三种常见的配置方式。

在web.xml中配置

web.xml中配置url-pattern的方式如下所示:

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

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

在上面的示例中,我们首先定义了一个名为dispatcherDispatcherServlet,并在servlet-mapping中将url-pattern设置为/,表示所有的请求都会被分发给DispatcherServlet进行处理。

在注解中配置

在注解中配置url-pattern的方式如下所示:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig implements WebMvcConfigurer {
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

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

在上面的示例中,我们使用了@EnableWebMvc注解启用了Spring MVC,并在@ComponentScan注解中指定了扫描的包路径。在configureDefaultServletHandling()方法中,我们调用了configurer.enable()方法,表示将静态资源的处理交给默认的Servlet处理。在addViewControllers()方法中,我们将/路径映射到了index视图。在addResourceHandlers()方法中,我们将/resources/**路径映射到了/resources/目录下的静态资源。在viewResolver()方法中,我们定义了一个InternalResourceViewResolver对象,用于解析JSP视图。

在Java配置类中配置

在Java配置类中配置url-pattern的方式如下所示:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig implements WebMvcConfigurer {
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

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

  @Bean
  public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {
    ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(new DispatcherServlet(), "/");
    registration.setName("dispatcher");
    registration.setLoadOnStartup(1);
    return registration;
  }
}

在上面的示例中,我们使用了@EnableWebMvc注解启用了Spring MVC,并在@ComponentScan注解中指定了扫描的包路径。在configureDefaultServletHandling()方法中,我们调用了configurer.enable()方法,表示将静态资源的处理交给默认的Servlet处理。在addViewControllers()方法中,我们将/路径映射到了index视图。在addResourceHandlers()方法中,我们将/resources/**路径映射到了/resources/目录下的静态资源。在viewResolver()方法中,我们定义了一个InternalResourceViewResolver对象,用于解析JSP视图。在dispatcherServletRegistration()方法中,我们定义了一个ServletRegistrationBean对象,用于注册DispatcherServlet并将url-pattern设置为/

url-pattern的原理剖析

在Spring MVC中,url-pattern的原理是通过DispatcherServlet来实现的。当一个请求到达服务器时,服务器会根据url-pattern将请求分发给DispatcherServlet进行处理。DispatcherServlet会根据请求的URL路径和映射规则来确定请求应该由哪个处理器来处理。处理器处理完请求后,会返回一个ModelAndView对象,DispatcherServlet会将其解析为视图并返回给客户端。

示例1:使用url-pattern处理HTTP GET请求

以下是一个使用url-pattern处理HTTP GET请求的示例。

@Controller
public class HelloController {
  @GetMapping("/hello")
  public ModelAndView hello() {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello, World!");
    return modelAndView;
  }
}

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig implements WebMvcConfigurer {
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

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

  @Bean
  public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {
    ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(new DispatcherServlet(), "/");
    registration.setName("dispatcher");
    registration.setLoadOnStartup(1);
    return registration;
  }
}

在上面的示例中,我们首先定义了一个HelloController类,它使用@GetMapping注解将/hello路径映射到了hello()方法。在hello()方法中,我们返回了一个ModelAndView对象,并将message属性设置为Hello, World!。然后,我们定义了一个AppConfig类,它使用了@EnableWebMvc注解启用了Spring MVC,并在@ComponentScan注解中指定了扫描的包路径。在configureDefaultServletHandling()方法中,我们调用了configurer.enable()方法,表示将静态资源的处理交给默认的Servlet处理。在addViewControllers()方法中,我们将/路径映射到了index视图。在addResourceHandlers()方法中,我们将/resources/**路径映射到了/resources/目录下的静态资源。在viewResolver()方法中,我们定义了一个InternalResourceViewResolver对象,用于解析JSP视图。在dispatcherServletRegistration()方法中,我们定义了一个ServletRegistrationBean对象,用于注册DispatcherServlet并将url-pattern设置为/

示例2:使用url-pattern处理HTTP POST请求

以下是另一个使用url-pattern处理HTTP POST请求的示例。

@Controller
public class CalculatorController {
  @PostMapping("/calculator")
  public ModelAndView calculator(@RequestParam int a, @RequestParam int b) {
    int result = a + b;
    ModelAndView modelAndView = new ModelAndView("result");
    modelAndView.addObject("result", result);
    return modelAndView;
  }
}

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig implements WebMvcConfigurer {
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

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

  @Bean
  public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {
    ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(new DispatcherServlet(), "/");
    registration.setName("dispatcher");
    registration.setLoadOnStartup(1);
    return registration;
  }
}

在上面的示例中,我们首先定义了一个CalculatorController类,它使用@PostMapping注解将/calculator路径映射到了calculator()方法。在calculator()方法中,我们获取了请求参数ab,计算结果后返回了一个ModelAndView对象,并将result属性设置为计算结果。然后,我们定义了一个AppConfig类,它使用了@EnableWebMvc注解启用了Spring MVC,并在@ComponentScan注解中指定了扫描的包路径。在configureDefaultServletHandling()方法中,我们调用了configurer.enable()方法,表示将静态资源的处理交给默认的Servlet处理。在addViewControllers()方法中,我们将/路径映射到了index视图。在addResourceHandlers()方法中,我们将/resources/**路径映射到了/resources/目录下的静态资源。在viewResolver()方法中,我们定义了一个InternalResourceViewResolver对象,用于解析JSP视图。在dispatcherServletRegistration()方法中,我们定义了一个ServletRegistrationBean对象,用于注册DispatcherServlet并将url-pattern设置为/

总结

本文详细介绍了url-pattern的配置方式及其原理,并提供了两个示例说明。我们首先介绍了url-pattern的三种常见配置方式,包括在web.xml中配置、在注解中配置、在Java配置类中配置。然后,我们讲解了url-pattern的原理,即通过DispatcherServlet来实现请求的分发和处理。最后,我们提供了一个使用url-pattern处理HTTP GET请求的示例和一个使用url-pattern处理HTTP POST请求的示例。通过本文的介绍,我们可以了解到如何在Spring MVC应用程序中使用url-pattern来分发请求。

营销型网站