Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。

(1) Http请求:客户端请求提交到DispatcherServlet。
(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) 调用处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(8) Http响应:视图负责将结果显示到客户端。


SpringMVC接口解释
(1)DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
(2)HandlerMapping接口: 能够完成客户请求到Controller映射。
(3)Controller接口: 需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。 Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。 从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
(4)ViewResolver接口: Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
web.xml加载过程

配置中央(前端)控制器
<!--配置SpringMVC的中央控制器-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
完整的
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--Spring自带的字符集过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置SpringMVC的中央控制器-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
对应的路径 /WEB-INFO/Springmvc-servlet.xml
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--SpringMVC框架的配置文件-->
<!--自动扫描@Controller注解的类-->
<context:component-scan base-package="com.kaishengit.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven/>
<!--静态资源不经过中央控制器-->
<mvc:default-servlet-handler/>
<!--视图解析器-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上传的视图解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000"/>
</bean>
</beans>
Controller
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
System.out.println("Hello,SpringMVC!");
return "home";
}
}
更多RequestMapping
package com.kaishengit.controller;
import com.kaishengit.exception.NotFoundException;
import com.kaishengit.pojo.Account;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
@Controller
@RequestMapping("/user")
public class UserController {
//@RequestMapping(method = RequestMethod.GET)
@GetMapping
public String list(Model model) {
Account account = new Account();
account.setUserName("jack");
account.setAge(23);
Account account2 = new Account();
account2.setUserName("Rose");
account2.setAge(22);
List<Account> accountList = Arrays.asList(account,account2);
model.addAttribute("accountList",accountList);
return "user/list";
}
@GetMapping("/new")
public String newUser() {
return "user/add";
}
@PostMapping("/new")
public String saveUser(Account account,
RedirectAttributes redirectAttributes) {
System.out.println(account);
redirectAttributes.addFlashAttribute("message","添加成功");
return "redirect:/user";
}
//@GetMapping(value = "/check/{userName}",produces = "text/plain;charset=UTF-8")
@RequestMapping(value = "/check/{userName}",method = RequestMethod.GET,
produces = "text/plain;charset=UTF-8")
@ResponseBody
public String checkUserName(@PathVariable String userName) {
if(userName.equals("tom")) {
return "不可用";
} else {
return "可以用";
}
}
@RequestMapping(value = "/api/{id:\\d+}",method = RequestMethod.GET)
@ResponseBody
public Account findById(@PathVariable Integer id) {
Account account = new Account();
account.setUserName("李四");
account.setAge(23);
return account;
}
@RequestMapping("/http")
public String method(HttpServletRequest request, HttpServletResponse response,
HttpSession session) {
return "user/list";
}
@RequestMapping(value = "/upload",method = RequestMethod.GET)
public String fileUpload() {
return "user/upload";
}
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String saveFile(String name, MultipartFile file) {
System.out.println("Name:" + name);
if(!file.isEmpty()) {
//上传表单控件的name属性值
System.out.println("getName:" + file.getName());
//上传文件的原始名称
System.out.println("getOriginalFilename:" + file.getOriginalFilename());
//文件大小(字节)
System.out.println("size: " + file.getSize());
//文件的MIME类型
System.out.println("ContentType:" + file.getContentType());
//InputStream inputStream = file.getInputStream();
}
return "redirect:/user";
}
@RequestMapping("/u-{id:\\d+}")
public String showUser(@PathVariable Integer id) {
if(id == 100) {
throw new NotFoundException();
}
return "redirect:/user";
}
}
http://127.0.0.1:8080/springmvc/user/page?p=2
@RequestMapping("/page")
public String page(@RequestParam(value="p")int pageNum) {
System.out.println(pageNum);
return "";
} @
RequestMapping("/page")
public String page(@RequestParam(value="p",defaultValue="1",required=false) int pageNum) {
System.out.println(pageNum);
return "";
}
文件上传jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="text" name="name">
<input type="file" name="file">
<button>upload</button>
</form>
</body>
</html>


image

image
控制器基于注解
<mvc:annotation-driven/>
