详解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>
在上面的示例中,我们首先定义了一个名为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请求的示例。
@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()
方法中,我们获取了请求参数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
来分发请求。