Spring MVC DispatcherServlet之前端控制器架构详解
在Spring MVC中,DispatcherServlet是一个核心组件,它是前端控制器模式的实现。本文将详细介绍Spring MVC DispatcherServlet之前端控制器架构的实现原理和实现过程,并提供两个示例说明。
前端控制器架构的实现原理
前端控制器架构的实现原理是通过一个中央控制器来处理所有的请求,并将请求分发给相应的处理器进行处理。在Spring MVC中,DispatcherServlet就是前端控制器,它负责接收所有的请求,并将请求分发给相应的Controller进行处理。
DispatcherServlet的实现原理是通过Servlet API来实现的。在Servlet容器启动时,DispatcherServlet会被初始化,并创建一个Servlet容器的上下文环境。当有请求到达时,Servlet容器会将请求转发给DispatcherServlet进行处理。DispatcherServlet会根据请求的URL和请求方法来查找对应的Controller,并调用其处理方法。处理方法会返回一个ModelAndView对象,DispatcherServlet会将其转换为HTTP响应,并返回给客户端。
前端控制器架构的实现过程
下面是使用前端控制器架构的实现过程:
-
创建一个名为spring-mvc-demo的Maven项目。
-
创建一个名为UserController的Controller类。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
@PostMapping("/")
public User addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
在上面的示例中,我们创建了一个名为UserController的Controller类,并使用@RestController注解标记它。在Controller中,我们使用@Autowired注解将UserService注入到Controller中,并使用@GetMapping和@PostMapping注解标记处理GET和POST请求的方法。
- 创建一个名为UserService的Service类。
@Service
public class UserService {
private Map<Long, User> userMap = new HashMap<>();
public User getUserById(Long id) {
return userMap.get(id);
}
public User addUser(User user) {
user.setId(System.currentTimeMillis());
userMap.put(user.getId(), user);
return user;
}
}
在上面的示例中,我们创建了一个名为UserService的Service类,并使用@Service注解标记它。在Service中,我们使用Map来模拟用户数据,并提供了getUserById和addUser方法来获取和添加用户。
- 创建一个名为spring-mvc-demo.xml的Spring配置文件。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.controller"/>
<mvc:annotation-driven/>
</beans>
在上面的示例中,我们创建了一个名为spring-mvc-demo.xml的Spring配置文件,并使用
- 创建一个名为web.xml的Web配置文件。
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Spring MVC Demo</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-demo.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>
</web-app>
在上面的示例中,我们创建了一个名为web.xml的Web配置文件,并配置了DispatcherServlet。在
- 运行项目并测试。
在浏览器中输入"http://localhost:8080/user/1",可以看到返回了一个JSON格式的用户信息。在Postman中发送一个POST请求到"http://localhost:8080/user/",并设置请求体为JSON格式的用户信息,可以看到返回了添加后的用户信息。
示例
以下是两个示例演示如何使用前端控制器架构:
示例一
-
创建一个名为spring-mvc-demo的Maven项目。
-
创建一个名为UserController的Controller类。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
@PostMapping("/")
public User addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
在上面的示例中,我们创建了一个名为UserController的Controller类,并使用@RestController注解标记它。在Controller中,我们使用@Autowired注解将UserService注入到Controller中,并使用@GetMapping和@PostMapping注解标记处理GET和POST请求的方法。
- 创建一个名为UserService的Service类。
@Service
public class UserService {
private Map<Long, User> userMap = new HashMap<>();
public User getUserById(Long id) {
return userMap.get(id);
}
public User addUser(User user) {
user.setId(System.currentTimeMillis());
userMap.put(user.getId(), user);
return user;
}
}
在上面的示例中,我们创建了一个名为UserService的Service类,并使用@Service注解标记它。在Service中,我们使用Map来模拟用户数据,并提供了getUserById和addUser方法来获取和添加用户。
- 创建一个名为spring-mvc-demo.xml的Spring配置文件。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.controller"/>
<mvc:annotation-driven/>
</beans>
在上面的示例中,我们创建了一个名为spring-mvc-demo.xml的Spring配置文件,并使用
- 创建一个名为web.xml的Web配置文件。
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Spring MVC Demo</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-demo.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>
</web-app>
在上面的示例中,我们创建了一个名为web.xml的Web配置文件,并配置了DispatcherServlet。在
- 运行项目并测试。
在浏览器中输入"http://localhost:8080/user/1",可以看到返回了一个JSON格式的用户信息。在Postman中发送一个POST请求到"http://localhost:8080/user/",并设置请求体为JSON格式的用户信息,可以看到返回了添加后的用户信息。
示例二
-
创建一个名为spring-mvc-demo的Maven项目。
-
创建一个名为UserController的Controller类。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
@PostMapping("/")
public User addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
在上面的示例中,我们创建了一个名为UserController的Controller类,并使用@RestController注解标记它。在Controller中,我们使用@Autowired注解将UserService注入到Controller中,并使用@GetMapping和@PostMapping注解标记处理GET和POST请求的方法。
- 创建一个名为UserService的Service类。
@Service
public class UserService {
private Map<Long, User> userMap = new HashMap<>();
public User getUserById(Long id) {
return userMap.get(id);
}
public User addUser(User user) {
user.setId(System.currentTimeMillis());
userMap.put(user.getId(), user);
return user;
}
}
在上面的示例中,我们创建了一个名为UserService的Service类,并使用@Service注解标记它。在Service中,我们使用Map来模拟用户数据,并提供了getUserById和addUser方法来获取和添加用户。
- 创建一个名为spring-mvc-demo.xml的Spring配置文件。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.controller"/>
<mvc:annotation-driven/>
</beans>
在上面的示例中,我们创建了一个名为spring-mvc-demo.xml的Spring配置文件,并使用
- 创建一个名为WebAppInitializer的Web配置类。
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
在上面的示例中,我们创建了一个名为WebAppInitializer的Web配置类,并实现了WebApplicationInitializer接口。在onStartup方法中,我们创建了一个AnnotationConfigWebApplicationContext对象,并注册了一个名为AppConfig的配置类。然后,我们创建了一个DispatcherServlet对象,并将其添加到Servlet容器中。
- 创建一个名为AppConfig的Spring配置类。
@Configuration
@ComponentScan(basePackages = "com.example.controller")
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
在上面的示例中,我们创建了一个名为AppConfig的Spring配置类,并使用@Configuration、@ComponentScan和@EnableWebMvc注解标记它。在配置类中,我们使用WebMvcConfigurer接口的configureDefaultServletHandling方法来启用默认的Servlet处理。
- 运行项目并测试。
在浏览器中输入"http://localhost:8080/user/1",可以看到返回了一个JSON格式的用户信息。在Postman中发送一个POST请求到"http://localhost:8080/user/",并设置请求体为JSON格式的用户信息,可以看到返回了添加后的用户信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring mvc DispatcherServlet之前端控制器架构详解 - Python技术站