发布时间:2026-09-28 19:17:18 浏览次数:1
在Spring MVC中,url-pattern是一个非常重要的配置项,它决定了哪些请求会被分发给Spring MVC的DispatcherServlet进行处理。本文将详细介绍url-pattern的配置方式及其原理,并提供两个示例说明。
在Spring MVC中,url-pattern可以通过多种方式进行配置,如在web.xml中配置、在注解中配置、在Java配置类中配置等。以下是三种常见的配置方式。
在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配置类中配置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设置为/。
在Spring MVC中,url-pattern的原理是通过DispatcherServlet来实现的。当一个请求到达服务器时,服务器会根据url-pattern将请求分发给DispatcherServlet进行处理。DispatcherServlet会根据请求的URL路径和映射规则来确定请求应该由哪个处理器来处理。处理器处理完请求后,会返回一个ModelAndView对象,DispatcherServlet会将其解析为视图并返回给客户端。
以下是一个使用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设置为/。
以下是另一个使用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来分发请求。