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

发布时间:2026-09-28 19:17:18 浏览次数:1

简介

在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>

在上面的示例中,我们首先定义了一个名为dispatcher的DispatcherServlet,并在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请求的示例。

@Controllerpublic 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请求的示例。

@Controllerpublic 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()方法中,我们获取了请求参数a和b,计算结果后返回了一个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来分发请求。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477