Spring MVC架构请求处理流程
- 用户发送请求☞DispatcherServlet
DispatcherServlet是前端控制器,作为统一访问点,进行全局的流程控制。其收到请求后不直接进行处理,而是委托其他解析器进行处理。
- DispatcherServlet☞HandlerMapping
HandlerMapping将请求映射为HandlerExecutionChain对象(一个Handler对象(页面控制器)和多个HandlerInterceptor对象(拦截器)),采用Strategy模式,很容易添加新的Strategy对象。
- DispatcherServlet☞HandlerAdapter
HandlerAdapter将Handler包装为Adapter,采用Adapter模式,从而很容易支持多类型Handler
- HandlerAdapter☞Handler相应方法调用
HandlerAdapter会根据适配结果调用真正地Handler处理方法,并返回一个ModelAndView对象(模型数据、逻辑视图名)
- ModeAndView中逻辑视图名☞ViewResolver
ViewResolver将逻辑视图名解析为具体的View,采用策略模式,很容易更换其他视图技术
- Model☞View☞渲染
View根据Model数据进行渲染,Model本质是一个Map数据结构,因此很容易支持各种视图技术
- DispatcherServlet☞响应客户端
Spring MVC框架的使用
- pom.xml中添加依赖
- spring web MVC 依赖
- jackson 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:root.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 创建root.xml&spring-servlet.xml
- root.xml可以暂时不用写东西
- spring-servlet.xml中设置注解驱动和扫描包路径
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="com.test.controller"></context:component-scan>
@Controller
public class UserController {
@RequestMapping("/login")
public ModelAndView login(String username, String password) {
ModelAndView mav = new ModelAndView("/user.jsp");
mav.addObject("username", username);
return mav;
}
@RequestMapping("/login")
public String login(String username, String password, Model model, HttpSession session) {
model.addAttribute("username", username);
session.setAttribute("username", username);
return "/user.jsp";
}
@RequestMapping("/loginUser")
public String login(User user, Model model) {
model.addAttribute("user", user);
return "/user.jsp";
}
@RequestMapping("/loginMap")
public String login(@RequestParam Map<String, Object> user, Model model) {
model.addAttribute("user", user);
return "/user.jsp";
}
@RequestMapping("/testParam")
public String testParam(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(name = "abc") String name) {
return "/user.jsp";
}
@RequestMapping(value = "/testMethod", method = { RequestMethod.POST })
public String testMethod() {
return "/user.jsp";
}
@RequestMapping("/testResp")
public String testResp() {
return "redirect:/user.jsp";
}
@RequestMapping(value = "/testRespText", produces = { "text/plain;charset=utf-8" })
@ResponseBody
public String testRespText() {
return "你好, world";
}
@RequestMapping(value = "/testRespJson", produces = { "application/json;charset=utf-8" })
@ResponseBody
public List<User> select() {
List<User> users = new ArrayList<User>();
users.add(new User(1, "qq", "34324"));
users.add(new User(1, "qq", "34324"));
users.add(new User(1, "qq", "34324"));
users.add(new User(1, "qq", "34324"));
return users;
}
}