1.SpringMVC框架简介

1.1.框架简介

Spring MVC 是 Spring 提供给 Web 应用的框架设计。。
Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。作为当今业界最主流的 Web 开发框架,Spring MVC 已经成为当前javaWeb框架事实上的标准。

1.2.SpringMVC核心架构流程

01.SpringMVC框架 - 图1
springMVC核心架构的具体流程步骤如下:

  1. 首先用户发送请求——>DispatcherServlet(前端控制器),前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  4. HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
  5. ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
  6. View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
  7. 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

    1.3.前后端分离架构下的SpringMVC

    上一节中,详细描述了SpringMVC的核心架构流程。 但是要注意:这是非前后端分离模式下的SpringMVC核心架构。
    所以,我们会看到:在Handler处理器执行后,返回一个ModelAndView;也就是说:在非前后端分离模式下,视图层是由服务器端控制的。
    那么,在前后端分离模式下,视图层要分离出去,成为一个独立工程;或者说:视图层不在由服务器端控制。 所以,在前后端分离模式下,SpringMVC的核心架构流程修改如下:
    01.SpringMVC框架 - 图2
    本教程中,讲解的都是在前后端分离模式下的SpringMVC

    2.SpringMVC框架实例

    SpringMVC框架的开发有两种方式:

  8. 配置文件方式

  9. 注解方式

本教程中,只讲解注解方式

2.1.创建Maven工程

01.SpringMVC框架 - 图3

注意:SpringMVC是Web工程,所以打包方式要选择 war 包。

01.SpringMVC框架 - 图4

注意:Maven创建Web工程后,需要手动添加 WEB-INF 目录与 web.xml 配置文件。

2.2.在pom.xml文件中添加依赖

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.neusoft</groupId>
  6. <artifactId>smvc</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <build>
  10. <plugins>
  11. <!-- 设置jdk版本 -->
  12. <plugin>
  13. <groupId>org.apache.maven.plugins</groupId>
  14. <artifactId>maven-compiler-plugin</artifactId>
  15. <configuration>
  16. <source>1.8</source>
  17. <target>1.8</target>
  18. <encoding>utf-8</encoding>
  19. </configuration>
  20. </plugin>
  21. </plugins>
  22. </build>
  23. <properties>
  24. <spring.version>5.2.8.RELEASE</spring.version>
  25. </properties>
  26. <dependencies>
  27. <!-- 此依赖会关联引用Spring中的所有基础jar包 -->
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-context</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <!-- spring-webmvc会依赖spring-web -->
  34. <dependency>
  35. <groupId>org.springframework</groupId>
  36. <artifactId>spring-webmvc</artifactId>
  37. <version>${spring.version}</version>
  38. </dependency>
  39. </dependencies>
  40. </project>

2.3.配置SpringMVC前端控制器

在 web.xml 文件中配置 SpringMVC 前端控制器,也就是配置 DispatcherServlet 核心组件。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  3. <servlet>
  4. <servlet-name>springmvc</servlet-name>
  5. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  6. <!-- 也可不配置参数,默认加载 /WEB-INF/springmvc-servlet.xml -->
  7. <init-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath:springmvc-servlet.xml</param-value>
  10. </init-param>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>springmvc</servlet-name>
  14. <url-pattern>/</url-pattern>
  15. </servlet-mapping>
  16. </web-app>

01.SpringMVC框架 - 图5

2.4.创建SpringMVC配置文件

在resources文件夹下创建springmvc-servlet.xml 配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop.xsd
  14. http://www.springframework.org/schema/mvc
  15. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  16. <!--
  17. 此标签能够自动加载注解的处理器映射和注解的处理器适配,
  18. 而且还默认加载了很多其他方法。 比如:参数绑定到控制器参数、json转换解析器
  19. -->
  20. <mvc:annotation-driven />
  21. <!-- 开启注解扫描,将包下带有@Controller注解的类纳入Spring容器中-->
  22. <context:component-scan base-package="com.neusoft.smvc.controller" />
  23. </beans>

2.5.创建Handler处理器

在 com.neusoft.springmvc.controller 包下创建 HelloController 处理器。

  1. package com.neusoft.smvc.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class HelloController {
  7. @ResponseBody
  8. @RequestMapping("/hello")
  9. public String hello() throws Exception {
  10. return "hello world!";
  11. }
  12. }

@Controller:此注解声明在类上,表示此类是一个 Handler 处理器类,并被纳入到 Spring 容器中; @ResponseBody:此注解可以声明在类上,或者方法上;表示处理器方法直接返回数据。 @RequestMapping:此注解可以声明在类上,或者方法上;表示将一个请求url映射给处理器方法。

2.6.测试

将工程部署到Tomcat中,启动服务器,在浏览器地址栏中写入:http://localhost:8080/smvc/hello

2.7.相关注解详解

2.7.1.@ResponseBody注解

@responseBody注解的作用是将controller的方法返回的数据写入到response对象的body区,也就是直接将数据写入到输出流中,效果等同于使用 response.getWriter() 输出流对象向前端返回数据。需要注意的是,在使用此注解之后,响应不会再走视图处理器。

  1. @responseBody 应用在处理器类上:此处理器类中的所有方法都直接返回数据。
  2. @responseBody 应用在处理器类的某个方法上:此处理器类中的某个方法直接返回数据。

    2.7.2.@RequestMapping注解

    用于建立请求URL和处理器方法之间的对应关系。

  3. @RequestMapping 应用在处理器类上: 设置请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以 / 开头。 它出现的目的是为了使我们的URL可以按照模块化管理。

    1. @Controller
    2. @RequestMapping("/user")
    3. public class HelloController {
    4. @ResponseBody
    5. @RequestMapping("/hello")
    6. public String hello() throws Exception {
    7. return "hello world";
    8. }
    9. }

    上面处理器方法请求url应该这样写:http://localhost:8080/springmvc/user/hello

  4. @RequestMapping 应用在处理器类的某个方法上:请求URL的第二级访问目录。

  5. @RequestMapping注解中常用属性有:
    value:用于指定请求的URL。 method:用于指定请求的方式。
    1. @ResponseBody
    2. @RequestMapping(value="/hello",method=RequestMethod.POST)
    3. public String hello() throws Exception {
    4. return "hello world";
    5. }

    如果使用 get 方式访问此处理器方法时(比如:在地址栏中输入url访问),就会出现异常。

2.7.3.@GetMapping与@PostMapping

@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.Post)的缩写。

3.处理器方法的参数与返回值

3.1.处理器方法参数

SpringMVC也是基于Spring的,所以可以直接给处理器方法注入参数,自动绑定默认支持的各种数据类型。 这些默认支持的数据类型,或者说可以注入的对象类型有:

  1. HttpServletRequest对象。
  2. HttpServletResponse对象。
  3. HttpSession对象。(注意:ServletContext不会注入。)
  4. 简单数据类型。作用:获取客户端提交的单值参数。

    1. public String hello(String userName,String password) throws Exception {}

    注意:处理器方法的参数名必须与提交参数名一致。 测试:http://localhost:8080/springmvc/user/hello?userName=zhangsan&password=123

  5. 数组类型。 作用:获取客户端提交的多值参数。

    1. public String hello(Integer[] aihao) throws Exception {}

    注意:处理器方法的参数名必须与提交参数名一致。 测试:http://localhost:8080/springmvc/user/hello?aihao=1&aihao=2&aihao=3

  6. 对象类型。 作用:获取客户端提交参数。

    1. public String hello(User user) throws Exception {}

    注意:处理器方法的参数名可以任意,但参数中的属性名必须与提交参数名一致。 测试:http://localhost:8080/springmvc/user/hello?userId=1&userName=zhangsan&password=123

3.2.使用@RequestParam匹配参数

获取客户端提交参数时,处理器的参数名必须与提交参数名一致。但如果处理器的参数名与提交参数名不一致时,可以使用@RequestParam注解来匹配参数。

  1. public String hello(@RequestParam("username") String un,
  2. @RequestParam("password") String pw) throws Exception {}

注意:@RequestParam的value值必须与提交参数名一致。 测试:http://localhost:8080/springmvc/user/hello?userName=zhangsan&password=123

3.3.接收AJAX提交json数据

在前后端分离项目中,前端的 ajax 会向服务器端提交 json 数据,SpringMVC也可以直接接收 json 数据。

注意:

  1. 提交的是json对象,所以 SpringMVC 也必须要使用对象来接收。
  2. 需要添加CORS过滤器,设置服务器端允许跨域(需要导入servlet-api.jar)。
  1. pom.xml中添加servlet-api依赖

    1. <dependency>
    2. <groupId>javax.servlet</groupId>
    3. <artifactId>javax.servlet-api</artifactId>
    4. <version>4.0.0</version>
    5. <scope>provided</scope>
    6. </dependency>
  2. 添加CORS过滤器

    1. package com.neusoft.smvc.filter;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import javax.servlet.annotation.WebFilter;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;
    12. @WebFilter("/*")
    13. public class CorsFilter implements Filter {
    14. @Override
    15. public void init(FilterConfig filterConfig) throws ServletException {}
    16. @Override
    17. public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
    18. throws IOException, ServletException {
    19. HttpServletRequest request = (HttpServletRequest)req;
    20. HttpServletResponse response = (HttpServletResponse)resp;
    21. //设置允许跨域
    22. response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
    23. //设置开启Cookie
    24. response.setHeader("Access-Control-Allow-Credentials", "true");
    25. chain.doFilter(req, resp);
    26. }
    27. @Override
    28. public void destroy() {}
    29. }
  3. SpringMVC处理器中要使用对象接收提交的json数据

    1. public String hello(User user) throws Exception {}
  4. 使用Axios提交

    1. <button onclick="hello()">提交</button>
    2. <script src="https://unpkg.com/axios/dist/axios.js"></script>
    3. <script src="https://cdn.bootcss.com/qs/6.5.1/qs.min.js"></script>
    4. <script>
    5. let user = {
    6. userId:1,
    7. userName:'zhangsan',
    8. password:'123'
    9. };
    10. function hello() {
    11. axios.post('http://localhost:8080/smvc/user/hello',Qs.stringify(user))
    12. .then(response=>{
    13. console.log(response.data);
    14. }).catch(error=>{
    15. console.log(error);
    16. });
    17. /*
    18. axios.get('http://localhost:8080/smvc/user/hello',{params:user})
    19. .then(response=>{
    20. console.log(response.data);
    21. }).catch(error=>{
    22. console.log(error);
    23. });
    24. */
    25. }
    26. </script>

    3.4.处理器方法返回值

    SpringMVC的处理器方法可以返回 ModelAndView ,也可以直接返回数据。 在前后端分离模式中,SpringMVC的处理器方法直接返回数据。所以,返回 ModelAndView 的情况不做讨论。

  5. 返回 String
    上面实例中,SpringMVC的处理器方法就是直接返回String。

  6. 返回 json
    首先,在 pom.xml 文件中添加 jackson 依赖:

    1. <!-- jackson相关依赖 -->
    2. <dependency>
    3. <groupId>com.fasterxml.jackson.core</groupId>
    4. <artifactId>jackson-databind</artifactId>
    5. <version>2.9.0</version>
    6. </dependency>
  7. 服务器端代码:

    1. //返回值设置为对象或者集合
    2. @ResponseBody
    3. @RequestMapping("/hello")
    4. public User hello(User user) throws Exception {
    5. System.out.println(user);
    6. return user;
    7. }
    8. /*
    9. @ResponseBody
    10. @RequestMapping("/hello")
    11. public List<User> hello(User user) throws Exception {
    12. List<User> list = new ArrayList<>();
    13. list.add(user);
    14. list.add(user);
    15. list.add(user);
    16. return list;
    17. }
    18. */
  8. 前端代码:

    1. axios.post('http://localhost:8080/smvc/user/hello',Qs.stringify(user))
    2. .then(response=>{
    3. console.log(response.data);
    4. }).catch(error=>{
    5. console.log(error);
    6. });

    注意:

    1. springmvc-servlet.xml 配置文件中必须要有 mvc:annotation-driven 标签配置。这里配置了json转换解析器。
    2. 只要 SpringMVC 的处理器返回值设置为对象,或者集合,那么就能返回 json 数据。

4.SpringMVC文件上传

4.1.添加文件上传jar包依赖

  1. <dependency>
  2. <groupId>commons-fileupload</groupId>
  3. <artifactId>commons-fileupload</artifactId>
  4. <version>1.2.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-io</groupId>
  8. <artifactId>commons-io</artifactId>
  9. <version>2.4</version>
  10. </dependency>

4.2.配置文件上传解析器

在springmvc-servlet.xml 配置文件中配置文件上传解析器。

  1. <!--必须要有此id名 -->
  2. <bean id="multipartResolver"
  3. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  4. <!--上传文件大小限制,单位:字节 -->
  5. <property name="maxUploadSize" value="5000000"></property>
  6. </bean>

4.3.创建上传文件处理器

  1. package com.neusoft.smvc.controller;
  2. import java.io.File;
  3. import java.util.UUID;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpSession;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.ResponseBody;
  9. import org.springframework.web.multipart.MultipartFile;
  10. @Controller
  11. public class UploadController {
  12. @ResponseBody
  13. @RequestMapping("/upload")
  14. // 必须要有MultipartFile类型参数。而且参数名必须与表单file控件名一致
  15. public String upload(MultipartFile myFile) {
  16. //上传图片存储目录
  17. String path = "d:/upload";
  18. //获取文件名并使用UUID生成新文件名
  19. String fileName = myFile.getOriginalFilename();
  20. String newFileName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));
  21. //在指定上传图片存储目录中创建新文件
  22. File targetFile = new File(path, newFileName);
  23. //如果找不到指定目录和文件,就新创建此目录和文件
  24. if (!targetFile.exists()) {
  25. targetFile.mkdirs();
  26. }
  27. //将文件写入硬盘(myFile在内存中)
  28. try {
  29. myFile.transferTo(targetFile);
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. return "ok";
  34. }
  35. }

4.4.客户端表单提交

  1. <form action="http://localhost:8080/smvc/upload" enctype="multipart/form-data" method="post">
  2. <input type="file" name="myFile"><br>
  3. <input type="submit" value="上传">
  4. </form>

注意:

  1. enctype:设置表单的MIME编码。
    默认情况,这个编码格式是application/x-www-form-urlencoded(标准键值对格式),不能用于文件上传;只有使用了multipart/form-data,才能上传二进制数据;
  2. method:必须为post方式提交。

5.SpringMVC拦截器

早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低。
Spring将预处理与后处理功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦。SpringMVC的拦截器类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理。

5.1.创建SpringMVC拦截器

创建 SpringMVC 拦截器,只需要实现 HandlerInterceptor 接口即可。 接口中有三个方法需要实现:

  1. preHandle:该方法在 controller 执行前执行,可以实现对数据的预处理。 如果方法返回 true ,则继续调用下一个资源。否则不在继续调用。
  2. postHandle:该方法在处理器执行后,生成视图前执行。这里有机会修改视图层数据。
  3. afterCompletion:最后执行,通常用于记录日志,释放资源,处理异常。

    1. package com.neusoft.springmvc.interceptor;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletResponse;
    4. import org.springframework.web.servlet.HandlerInterceptor;
    5. import org.springframework.web.servlet.ModelAndView;
    6. public class CorsInterceptor implements HandlerInterceptor{
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. System.out.println("在到达处理器之前做前置工作");
    10. return true;
    11. }
    12. @Override
    13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}
    14. @Override
    15. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}
    16. }

    5.2.配置SpringMVC拦截器

    在springmvc-servlet.xml 配置文件中配置 SpringMVC 拦截器。

    1. <!-- 可以配置多个拦截器 -->
    2. <mvc:interceptors>
    3. <mvc:interceptor>
    4. <mvc:mapping path="/**" />
    5. <bean class="com.neusoft.springmvc.interceptor.CorsInterceptor" />
    6. </mvc:interceptor>
    7. </mvc:interceptors>

    01.SpringMVC框架 - 图6

    5.3.拦截器与过滤器的区别

  4. Filter是Servlet容器的,Interceptor是SpringMvc实现的(结合springBoot看)

  5. Filter对所有请求起作用,Intercptor可以设置拦截规则,而且只对经过DispatchServlet的请求起作用。
  6. Filter只能拿到request和response,interceptor可以拿到整个请求上下文,包括request和response。
  7. Filter是基于函数回调,Interceptor是基于反射(AOP思想)

    6.RESTful互联网软件架构

    6.1.什么是REST

    REST(Representational State Transfer 表现层状态转化):是一种互联网软件架构规范。
    如果按照上面的字面含义去理解,那是永远也无法理解的。实际上,REST省略的主语。REST的全称应该是 Resource Representational State Transfer。通俗来讲就是:资源在网络中以某种表现形式进行状态转移。
    所以,REST包含三个结构:

  8. 资源(Resources):
    资源是 RESTful 的主体,主要指代互联网上的一个实体,可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。资源通过 URI 来唯一标识。

  9. 表现层(Representation)
    资源的信息载体形式,叫做表现层。它可以是文本、XML、JSON 或者是一个二进制文件。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对”表现层”的描述。
  10. 状态转化(State Transfer)
    互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。

REST:是一种为了让信息在互联网上顺利传递而设计的软件架构风格,即一种采用标准URI进行调用的规范。

注意,它并不是一个框架,它只是一种理念。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

6.2.RESTful架构

如果一个互联网软件架构符合REST原则,就称它为RESTful架构。

具体来说:RESTful架构的规范与约束要求我们:

  1. 对url进行规范,写出符合RESTful格式的url。
    优雅RESTful风格的资源URL不希望带 .html 或 .do 或?或& 等后缀。
  2. 指定请求资源格式。也就是说:在RESTful架构中,每个URI代表一种资源,客户端通过四个HTTP方法(四个动词),对服务器端资源进行操作:

    • GET用来获取资源;
    • POST用来新建资源(也可以用于更新资源);
    • PUT用来更新资源;
    • DELETE用来删除资源;

      6.2.使用RESTful风格URL

  3. 前端控制器url映射配置必须为 “/” ,不能是 .do 或 .action 等后缀

    1. <servlet-mapping>
    2. <servlet-name>springmvc</servlet-name>
    3. <url-pattern>/</url-pattern>
    4. </servlet-mapping>
  4. 客户端提交方式:

    1. http://localhost:8080/springmvc/hello/zhangsan/123
  5. 处理器接收参数方式:

    1. @ResponseBody
    2. @RequestMapping("/hello/{userName}/{password}")
    3. public String hello(@PathVariable("userName") String userName,@PathVariable("password") String password) throws Exception {
    4. System.out.println(userName+","+password);
    5. return "hello world!";
    6. }

    注意:
    如果想支持put delete方式请求,需要在web.xml里新增加过滤器配置

    1. <!--使⽤Rest风格的URI,将页⾯普通的post请求转为指定的delete或者put请求-->
    2. <filter>
    3. <filter-name>HiddenHttpMethodFilter</filter-name>
    4. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    5. </filter>
    6. <filter-mapping>
    7. <filter-name>HiddenHttpMethodFilter</filter-name>
    8. <servlet-name>springmvc</servlet-name>
    9. </filter-mapping>
    10. <filter>
    11. <filter-name>HttpPutFormContentFilter</filter-name>
    12. <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
    13. </filter>
    14. <filter-mapping>
    15. <filter-name>HttpPutFormContentFilter</filter-name>
    16. <servlet-name>springmvc</servlet-name>
    17. </filter-mapping>


    本章作业

  6. 简单介绍下对springMVC的理解?

  7. Spring MVC的主要组件有哪些?
  8. SpringMVC如何通过AJAX向前端返回数据?
  9. SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
  10. 如果在拦截请求中,想拦截get方式提交的方法,怎么配置?
  11. 怎样在Controller方法里面得到Request,或者Session?
  12. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
  13. 编程题:
    1. 使用SpringMVC实现一个登录案例。
    2. 使用前后端分离的模式实现。
    3. 服务器端要有数据层组件、业务层组件、控制层组件。
    4. 数据层组件中可以不真正的连接数据库,而是返回模拟数据。
    5. 控制层组件要向前端返回json数据。
    6. 前端使用ajax请求,并通过服务器端返回的json数据来判断是否登录成功。