• 第04篇_Spring_MVC

    第01章_SpringMVC快速入门

    第一节 SpringMVC简介

    1. 什么是MVC?

    MVC是一种通用软件架构,M是指业务模型V是指用户界面C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。MVC架构的工作流程如下:

    1. 用户发送请求到服务器的Controller(C)

    2. Controller调用相应的Model(M)处理请求。

    3. 根据处理结果渲染对应的View视图(V)进行响应。

    image-20220829215822285

     

    2. 什么是SpringMVC?

    SpringMVC是MVC架构的一种具体实现,为表述层(web页面+Servlet)开发提供了一整套完备的解决方案。

    SpringMVC的主要特点如下:

    1. Spring系列产品,与Spring的IOC容器等基础设施无缝对接。

    2. 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理。

    3. 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案

    4. 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可。

    5. 性能卓著,尤其适合现代大型、超大型互联网项目要求。

     

     

    第二节 SpringMVC入门案例

    1. 创建Maven工程

    image-20220808224147905

    注意:

    1. 默认会标记src\main\java为源代码根目录,src\main\resources为资源根目录,若没有则需手动标记。

    2. 必须在pom.xml中修改打包方式为war包:<packaging>war</packaging>

     

    2. 配置web.xml

    新建src\main\webapp\WEB-INF\web.xml文件,配置DispatcherServlet统一处理前端请求。

    如需在Web工程启动时,加载Spring上下文配置,只需在web.xml中注册ContextLoaderListener监听器即可。

     

    3. 配置spring-mvc-config.xml

    在资源根目录下新建spring-mvc-config.xml文件(与web.xml中对应即可),配置表述层组件扫描默认视图解析器

     

    4. 编写请求控制器

     

    5. 编写视图页面

    新建src\main\webapp\WEB-INF\pages\index.jsp文件(与视图解析器配置的前缀后缀以及视图名称相对应),编写JSP页面如下。

     

    6. 进行测试

    添加一个Tomcat服务器,部署当前应用,设置上下文路径后进行启动。

    image-20220808230158199

    启动完成后访问http://localhost:8080/页面,显示如下即代表测试成功。

    image-20220808230422200

     

     

    第三节 入门案例扩展

    1. DispatcherServlet的初始化参数

    参数名参数说明
    contextConfigLocationspring-mvc-config.xml文件位置,支持以逗号分隔配置多个。
    contextClass上下文实现类,默认为XmlWebApplicationContext
    namespaceWebApplicationContext的命名空间。默认为[servlet-name]-servlet
    throwExceptionIfNoHandlerFound在找不到请求的处理程序时是否抛出NoHandlerFoundException。默认为false,此时将响应404(NOT_FOUND),而不会引发异常。
    注意:如果配置了DefaultServletHandler,则在找不到请求处理程序时一律交给它来处理。

    第02章_请求与响应详解

    第一节 请求映射

    请求映射指根据请求路径请求方法请求参数等信息,将请求映射到对应的控制器方法,一般使用@RequestMapping注解来配置。

     

    1. 请求路径路由

    1.1 声明请求路径

    @RequestMapping注解的path(value)属性用来声明请求路径,类上为一级路径,方法上为二级路经,SpringMVC会自动进行拼接。

    提示:

    1. 一个控制器方法可以配置多个请求路径,用于将不同的请求映射到同一段处理逻辑。

    2. Spring MVC默认开启.*后缀模式匹配,以便映射到/person的控制器也能映射到/person.*

    3. 建议设置useSuffixPatternMatching(false)和favorPathExtension(false)来关闭后缀匹配模式,并通过Accept请求头进行替代。

    4. 请求路径还可以嵌入${…}占位符,这将在启动时从系统环境等其他属性源中解析替换。

     

    1.2 请求路径通配符

    可以通过Ant风格的通配符来模糊匹配请求路径:

     

    2. 请求方式限定

    2.1 声明请求方式

    @RequestMapping注解的method属性用来声明请求方式,如果方式不匹配则报"405:Request method 'POST' not supported"错误。

     

    2.2 请求方式组合注解

    为了简化请求方法匹配,SpringMVC设计了一些组合注解,如@GetMapping@PostMapping@PutMapping@DeleteMapping等。

     

    2.3 转换请求方式

    浏览器默认只能发送GETPOST请求,如需发送其它类型请求,可用POST请求+_method参数进行伪造。

    首先web.xml文件中配置过滤器如下:

    然后前端发送请求时改为POST请求,并附带_method参数指定要伪造的请求方法。

    这时就可以正确匹配控制器中的PUT方法了。

     

    3. 请求参数与请求头匹配(不常用)

    3.1 声明请求参数和请求头

    @RequestMapping注解的params属性和headers属性分别用来声明控制器方法所需的请求参数请求头,支持的格式如下:

     

    3.2 几个特殊的请求头

    特别的,对于Content-TypeAccept请求头,可分别通过consumesproduces属性来匹配。

    提示:MediaType常量类中提供了常用的Content-Type常量,例如APPLICATION_JSON_VALUE和APPLICATION_XML_VALUE。

     

     

    4. 自定义请求映射逻辑

    SpringMVC可对请求映射进行精确控制,主要有两种方式:

     

    5. 静态资源映射

    默认情况下,前端不能访问服务器的静态资源(html/css/js/img等),需要对其进行映射配置。

    提示:如需生成“版本化”的URL,可考虑配置VersionResourceResolver。

     

     

    第二节 参数绑定

    1. 控制器方法参数

    控制器方法常用的参数类型如下:

    参数常用的注解如下:

     

    2. 通过HttpServletRequest获取参数

    HttpServletRequest作为控制器方法的形参,框架在调用时会自动注入为当前请求对象,通过该对象即可获取参数和Cookie等。

    提示:可在控制器方法中注入的对象有:HttpServletRequestHttpServletResponseHttpSession、java.security.Principal、Locale、InputStream、OutputStream、Reader、Writer等。

     

    3. 绑定请求参数

    3.1 简单类型

    在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。

    注意

    1. 若有多个同名的请求参数,可以设置形参为字符串数组或者字符串类型。

      • 若使用字符串数组作为形参,则映射为多个数组元素。

      • 若使用字符串作为形参,则映射为一个逗号拼接的字符串。

    2. 使用Map作为参数,它将接收所有未被其它方式映射的参数。

     

    3.2 POJO类型

    可以在控制器方法的形参位置设置一个POJO类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

    相应的HTML页面如下:

     

    3.3 @RequestParam注解

    @RequestParam注解用来指定请求参数和控制器方法形参的映射关系。该注解一共有三个属性:

    注意:如果使用java.util.Optional作为方法参数,并且与@RequestParam和@RequestHeader等具有required属性的注解结合使用,该注解等效于required=false。

     

    4. 绑定请求头和Cookie

    @CookieValue注解用来指定Cookie数据和控制器方法形参的映射关系,@RequestHeader注解用来指定请求头信息与控制器方法形参的映射关系,其常用属性及使用方法和@RequestParam注解类似。

     

    5. 绑定路径变量

    路径变量指在请求路径中通过{xxx}占位符声明的变量,常用于RESTful风格的请求中,可通过@PathVariable注解进行绑定。

    特别的,路径变量还可以使用正则表达式来进行路径匹配。

     

    6. 绑定矩阵变量

    矩阵变量(Matrix Variable);开头,多个值之间用逗号隔开,SpringMVC中可通过设置<mvc:annotation-driven enable-matrix-variables="true"/>removeSemicolonContent=false来开启矩阵变量功能。

     

    7. 绑定请求体(JSON格式)

    7.1 @RequestBody注解

    @RequestBody注解用来将请求体内容绑定到控制器方法的形参。请求体的格式默认为&拼接的字符串,无需消息转换器,可直接使用String类型形参接收。

    如下页面,发送POST请求时,打印请求体的值:name=zhangsan&money=123

    注意:如果请求体不存在(如GET请求方式)或形参类型不匹配(非String类型),则响应400错误。

     

    7.2 请求消息转换

    如果请求体为JSON/XML等特殊字符串格式,除了使用String类型形参接收外,还可以通过HttpMessageConverter绑定到相应的实体类。

    首先引入Jackson的依赖如下:

    然后通过开启MVC注解驱动来自动配置MappingJackson2HttpMessageConverter

    则可以控制器方法如下:

    使用Postman发送一个POST请求如下,请求体格式为JSON字符串,形参为Account类型,实现自动绑定。

    image-20220816155727126

    注意:如果请求体格式为&拼接的字符串,则消息转换器不能将其绑定到POJO类,需要使用前面所述的请求参数绑定方式。

     

    扩展:使用Jquery来发送POST请求示例如下:

     

    5.3 RequestEntity

    RequestEntity<T>类可作为控制器方法的形参,封装请求头和转换后的请求体,方便后续使用。

    前端通过POST方式请求http://localhost:8080/message/req2,打印信息如下:

    注意:使用RequestEntity作为形参时可以没有请求体,封装后的请求体数据为null。

     

    8. 请求参数乱码问题

    8.1 POST请求参数乱码

    如果POST请求参数出现乱码,可在web.xml中配置SpringMVC提供的编码过滤器CharacterEncodingFilter

    注意CharacterEncodingFilter一定要配置到其他过滤器之前,否则可能无效!

     

    8.2 Get请求乱码

    Tomcat8.0之前GET请求也可能会出现乱码问题,需修改Tomcat的server.xml配置文件useBodyEncodingForURI属性为true。

    如果遇到Ajax请求仍然乱码,则把useBodyEncodingForURI="true"改为URIEncoding="UTF-8"

     

    9. 参数验证

    若类路径存在Hibernate Validator或类似实现,则在全局注册LocalValidatorFactoryBean,以支持@Vaild注解和Validated接口。

    你可以通过如下方式来配置全局Validator实例:

    也可注册自己的Validator实例:

    类似的XML配置如下:

     

     

    第三节 域数据共享

    1. Request域数据共享

    1.1 通过HttpServletRequest共享

    HttpServletRequest作为控制器方法的形参,框架在调用时会自动注入为当前请求对象,通过该对象即可在Request域共享数据等。

     

    1.2 通过Model形参共享

     

    1.3 通过Map/ModelMap形参共享

     

    1.4 通过响应ModelAndView共享

    ModelAndView有Model和View的功能,Model主要用于向请求域共享数据View主要用于设置视图,实现页面跳转

     

    1.5 通过@ModelAttribute共享(了解)

    @ModelAttribute注解用来进行Request域数据共享,可以作用于普通方法控制器方法参数之上。

     

    1.6 @RequestAttribute(了解)

    @RequestAttribute属性可以从Request域获取数据并映射到控制器方法参数。

     

     

     

    2. Session域数据共享

    2.1 通过HttpSession共享

    HttpSession作为控制器方法的形参,框架在调用时会自动注入为当前会话对象,通过该对象即可在Session域共享数据等。

     

    2.2 通过@SessionAttributes共享(了解)

    @SessionAttributes注解可作用于控制器所在类上,其从Request域查找配置的属性,并共享到Session域。

    @SessionAttribute注解可从Session域获取数据并映射到控制器方法参数。

     

    3. Application域数据共享

    获取会话对象(或请求对象)后,通过该对象可获取ServletContext对象,即可在Application域共享数据等。

     

     

    第四节 结果响应

    1. 控制器方法返回值

    控制器方法常用的返回值类型如下:

    返回值相关的注解如下:

     

    2. 通过ServletAPI响应

    HttpServletRequestHttpServletResponse作为控制器方法的形参,框架在调用时会自动注入为当前请求对象或响应对象,此时可以进行请求转发重定向直接发送响应数据等。

    提示:可在控制器方法中注入的对象还有:HttpServletRequestHttpServletResponseHttpSession、java.security.Principal、Locale、InputStream、OutputStream、Reader、Writer等。

     

    3. 请求转发或重定向

    3.1 通过forward进行请求转发

    当控制器方法设置的视图名称forward:为前缀时,创建InternalResourceView视图,然后直接通过:后面的路径进行转发,而不经过视图解析器拼接视图前后缀等过程。

    注意:

    1. 使用Forward进行转发时,写转发路径而非视图名称,相当于 request.getRequestDispatcher("url").forward(request,response)

    2. 转发路径以/开头时,则是基于Servlet上下文的绝对路径,否则是相对于当前请求的相对路径。

    3. 可以转发到其它的控制器方法或JSP视图页面,但不能够转发到其它服务器

    4. 当工程引入了JSTL模板库的依赖时,转发视图会自动转换为JstlView

     

    3.2 通过redirect进行重定向

    当控制器方法设置的视图名称redirect:为前缀时,创建RedirectView视图,然后直接通过:后面的路径进行重定向,也不经过视图解析器拼接视图前后缀等过程。

    注意:

    1. 使用Redirect进行重定向时,写新路径而非视图名称,相当于response.sendRedirect(url)

    2. 同样的,路径以/开头时,则是基于Servlet上下文的绝对路径,否则是相对于当前请求的相对路径。

    3. 可以重定向到任何可访问URL资源,但WEB-INF目录下的资源除外

     

    3.3 重定向数据共享

    重定向时默认传递所有的Model属性,可以通过RequestMappingHandlerAdapter的ignoreDefaultModelOnRedirect标志来控制。

    如果属性为String类型,则直接拼接在URL之后。如果非String类型,则通过RedirectAttributes的实现类RedirectAttributesModelMap进行传递。RedirectAttributesModelMap有一个flashAttributes属性,在重定向之前(通常在会话中)被临时保存,在重定向之后可供请求使用。

    在每个请求上,都有一个具有从上一个请求(如果有)传递的属性的输入FlashMap,和一个具有为后续请求保存的属性的输出FlashMap,通过RequestContextUtils中的getInputFlashMap/getOutputFlashMap方法,可以从Spring MVC中的任何位置访问这两个FlashMap实例。

     

    4. 响应视图页面

    当控制器方法设置的视图名称没有任何前缀时,则由配置的视图解析器按优先级(order属性配置)进行解析,它会将视图名称拼接前后缀,然后以转发的方式实现跳转。

     

    4.1 设置视图名称

    在控制器方法结束时,可通过返回StringModelAndView的形式设置视图名称。

    这里也可以直接返回视图的绝对路径,如/WEB-INF/pages/success.jsp,但一般会结合视图解析器使用,只需返回视图名称即可。

     

    4.2 默认视图解析器(JSP)

    SpringMVC提供了一个默认视图解析器InternalResourceViewResolver可用于解析JSP视图。

    JSP视图的简单示例如下,文件路径为src\main\webapp\WEB-INF\pages\success.jsp

     

    4.3 响应Thymeleaf视图

    首先需要引入Thymeleaf视图的相关依赖。

    然后在spring-mvc-config.xml文件中配置Thymeleaf视图解析器,并设置视图前缀视图后缀优先级等关键属性。

    Thymeleaf视图的简单示例如下,文件路径为src\main\webapp\WEB-INF\templates\success.html

     

    4.4 响应FreeMarker视图页面

    首先也是引入FreeMarker视图的相关依赖。

    然后在spring-mvc-config.xml文件中配置FreeMarker视图解析器和相关配置类,并设置视图前缀视图后缀优先级等关键属性。

    FreeMarker视图的简单示例如下,文件路径为src\main\webapp\WEB-INF\templates\success.ftl

     

    4.5 view-controller

    当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示。

    注意:当存在view-controller时,控制器方法中的请求映射将全部失效,此时需开启MVC注解驱动:<mvc:annotation-driven/>

     

    5. 响应实体类(JSON格式)

    5.1 @ResponseBody注解

    @ResponseBody注解用来将返回值作为为响应体返回,但由于响应体一般为字符串类型,因此默认只能转换String类型的返回值。

    提示

    1. @ResponseBody注解也可以配置在上,等效于类中的所有控制器方法都加上该注解。

    2. SpringMVC提供了一个@ResponseBody和@Controller的组合注解@RestController,简化注解使用。

     

    5.2 响应消息转换

    为了能够转换其它类型的返回值作为响应体,需要引入JSON/XML依赖,并配置相关的HttpMessageConverter

    引入Jackson的依赖如下:

    并通过开启MVC注解驱动来自动配置MappingJackson2HttpMessageConverter

    然后就可以响应不同类型的实体数据了。

     

    5.3 ResponseEntity

    ResponseEntity可作为控制器方法的返回值类型,它可以设置响应头和响应体信息,并经消息转换器转换后响应给浏览器。

     

     

    第五节 文件上传和下载

    1. 文件上传(CFU方式)

    1.1 前端表单

    文件上传要求FROM表单的请求方式必须为POST,并且添加属性enctype="multipart/form-data"

    注意:文件输入框的name属性值要求和控制器方法中MultipartFile形参名一致。

     

    1.2 后台服务

    首先添加commons-fileupload依赖如下:

    然后在SpringMVC的配置文件中添加multipartResolver配置。

    编写控制器代码如下,SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息。

    注意:

    1. 可以使用List<MultipartFile>接收多个同名文件,或使用Map<String, MultipartFile>MultiValueMap<String, MultipartFile>映射多个文件。

    2. MultipartFile可以不直接作为方法的参数,放在POJO类参数的某个属性。

     

    2. 文件下载

    文件下载关键是设置一个Content-Disposition请求头,以附件的形式进行下载。

     

    3. 文件异地存储

     

    第03章_常用MVC组件

    第一节 MVC组件简介

    SpringMVC通过组件化配置来支持不同的功能,主要的一些组件如下:

    img

    下面是MVC组件的一些内置实现,详情可以参考DispatcherServlet.properties

     

     

    第二节 视图解析器

    SpringMVC定义了ViewViewResolver接口,用于解绑控制器与特定的视图技术。

     

    1. 内置视图解析器

    SpringMVC对一些场景内置了ViewResolver,如下:

     

    2. 配置ContentNegotiatingViewResolver

    类似的XML配置如下:

     

    3. 配置其它视图解析器

    请参考“响应视图页面”章节!

     

     

    第三节 控制器拦截器

    1. 实现一个拦截器

    拦截器用于拦截Controller方法的执行,需要实现HandlerInterceptor接口,并根据情况来实现其抽象方法。

    注意:

    1. 拦截器只能拦截控制器方法,不能拦截其它请求,如静态资源请求。

    2. 特别的,如果使用@ResponseBody和ResponseEntity,则在控制器方法返回前已将响应写入和提交,因此不能再通过postHandle来处理响应,如"添加额外的响应头"等操作。(不过,你可以通过ResponseBodyAdvice或RequestMappingHandlerAdapter解决!)

     

    2. 配置拦截器

     

    3. 拦截器执行顺序

    如果配置了多个拦截器,则按如下原则来执行拦截器方法:

     

     

    第四节 异常处理器

    如果在请求映射或处理期间引发了异常,则交给HandlerExceptionResolver链来处理,通常是返回一个友好的错误响应。

     

    1. 内置异常处理器

    SpringMVC对一些场景内置了HandlerExceptionResolver,如下:

    如果当前HandlerExceptionResolver无法处理引发的异常,请返回null值,交给下一个HandlerExceptionResolver进行处理。

    如果所有的HandlerExceptionResolver都无法处理异常,则映射到Servlet容器的默认错误页面。错误页面可通过下面方式配置。

     

    2. 实现一个异常处理器

    自定义CustomRuntimeException异常和CustomExceptionResolver如下。

     

    3. 配置异常处理器

     

     

    第五节 类型转换器

    如果控制器方法的参数既不是HttpServletRquest等特殊对象,也不是String类型,则在映射请求参数时,一般需要进行相应的类型转换。

    如将前端传过来的String类型值映射到Date类型的形参。

     

    1.Formatter

    org.springframework.format.Formatter用于处理String类型到任意类型的转换。首先定义一个Formatter如下:

    然后在spring-mvc-config.xml文件中进行配置。

    注意:

    1. FormattingConversionServiceFactoryBean也可以配置其它类型的转换器。

    2. 默认情况下,安装了Number和Date类型的格式化程序,包括对@NumberFormat和@DateTimeFormat注解的支持。如果 Classpath 中存在Joda-Time,则还将安装对Joda-Time格式库的完全支持。

     

    2. Converter

    org.springframework.core.convert.converter.Converter用来处理任意类型之间的映射。首先定义一个Converter如下:

    然后在spring-mvc-config.xml文件中进行配置:

     

    3. PropertyEditor

    java.beans.PropertyEditor也可以用来进行属性转换,使用方式请参考“@InitBinder”相关章节。

     

     

    第六节 Multipart解析器

    MultipartResolver是一种用于解析Multipart请求(如文件上传)的策略,当收到Content Type为multipart/form-dataPOST请求时,将会把HttpServletRequest包装为MultipartHttpServletRequest

    SpringMVC提供了两种实现方式,一种是基于Commons FileUpload的实现,另一种基于Servlet 3.0 Multipart请求解析。

     

    1. Commons FileUpload

    首先导入commons-fileupload依赖,然后配置CommonsMultipartResolver类,Bean名称固定为multipartResolver

    如何使用Multipart解析器,请参考“文件上传”章节。

     

    2. Servlet 3.0 Multipart

    默认情况下,Servlet 3.0 Multipart功能为关闭状态,可通过web.xml的<multipart-config>标签或如下Java配置进行开启。

    同样的,需要配置Bean名称为multipartResolverStandardServletMultipartResolver

     

    第04章_常用MVC注解

    第一节 通过注解配置MVC

    1、Servlet容器初始化(web.xml)

    在Servlet3.0环境中,容器会查找javax.servlet.ServletContainerInitializer接口的实现类,并用它来初始化Servlet容器。而Spring的SpringServletContainerInitializer类实现了该接口,将初始化逻辑委托给WebApplicationInitializer的实现类。

     

    为了继续简化Servlet容器的初始化过程,Spring又定义了AbstractAnnotationConfigDispatcherServletInitializer抽象类。

    提示:如果您需要进一步自定义DispatcherServlet本身,则可以覆盖createDispatcherServlet方法。

     

    2. SpringMVC配置(spring-mvc-config.xml)

     

    3. Spring配置(spring-config.xml)

     

    4. 编写控制器

    一切配置就绪后,就可以使用之前的方式来编写控制器了。

     

     

    第二节 @ControllerAdvice

    @ControllerAdvice(@RestControllerAdvice)是针对多个控制器的切面,一般用于配置类型转换器和异常处理器等。

     

    1. @InitBinder

    @InitBinder标注的方法用来初始化WebDataBinder实例,该类实例用于多种场景下的属性转换

    注意:

    1. 如果@InitBinder方法在@ControllerAdvice中定义,默认对所有控制器生效。若在@Controller中定义,则只对当前控制器生效。

    2. @Controller中定义的@InitBinder和@ModelAttribute方法将会在@ControllerAdvice中定义的相应方法之后被调用。

    3. @Controller中定义的@ExceptionHandler方法将会在@ControllerAdvice中定义的相应方法之前被调用。

     

    2. @ExceptionHandler

    @ControllerAdvice是控制器方法的切面,配合@ExceptionHandler注解可以定义异常处理通知。

    提示:

    1. 尽量通过注解的value属性或方法参数指定更精确的异常类型。

    2. 异常处理方法参数支持HandlerMethod、ServletRequest、ServletResponse、HttpSession等大多数在控制器所支持的参数。

    3. 返回值也可以是@ResponseBody、ResponseEntity<B>、String、void、ModelAndView等大多数在控制器所支持的返回值。

     

    3. @ModelAttribute

    该注解不常用,使用方式请参考“域数据共享”章节。

     

    第05章_其它补充

    第一节 其它MVC配置

    1. 配置HttpMessageConverter

    HttpMessageConverter用于处理@RequestBody和@ResponseBody注解,对HTTP消息进行序列化和反序列化。

    你可以通过覆盖configureMessageConverters()extendMessageConverters()来自定义HttpMessageConverter。

    类似的XML配置如下:

     

    2. 配置内容协商

    SpringMVC根据如下流程来确定请求的Midea类型:

    扩展名和Content Type的对应关系可通过configureContentNegotiation来配置:

    类似的XML配置如下:

     

    3. 配置路径匹配规则

    您可以自定义路径匹配和URL处理有关的选项。

    类似的XML配置如下:

     

    4. 配置CROS

    跨域资源共享(CORS)可以解决Ajax只能同源(协议+域名+端口)使用的限制,使用SpringMVC可以非常方便的进行配置。

     

    4.1 单独配置

    @CrossOrigin注解用于开启单个控制器的跨域请求支持,如以下示例所示:

    默认情况下,@CrossOrigin允许所有的来源、所有的请求头和所有HTTP请求方式,不启用allowedCredentials,并设置maxAge为30分钟。

     

    4.2 全局配置(CorsRegistry)

    默认情况下,全局配置允许所有的来源、所有的请求头和GET、HEAD、POST请求方式,不启用allowedCredentials,maxAge为30分钟。

    类似的XML配置如下:

     

    4.3 全局配置(CorsFilter)

     

    5. DelegatingWebMvcConfiguration

    DelegatingWebMvcConfiguration为SpringMVC提供了一些默认配置,你可以删除@EnableWebMvc并直接从DelegatingWebMvcConfiguration扩展,而不是实现WebMvcConfigurer。

     

     

    第二节 构建URL

    1. UriBuilderFactory

    UriBuilderFactoryUriBuilder一起提供了一种可插入的机制,基于共享配置(基本URL、编码首选项和其他详细信息)从URI 模板构建URI。

     

    2. UriComponentsBuilder

    UriComponentsBuilder是UriBuilder的实现类,用于构建复杂的URL请求路径。

     

    3. ServletUriComponentsBuilder

    ServletUriComponentsBuilder也是UriBuilder的实现类,用于构建相对于当前请求的URI。

     

    4. MvcUriComponentsBuilder

    MvcUriComponentsBuilder可以按控制器方法名称来构建URI连接。

     

     

    第三节 其它说明

    1. 内置过滤器

    SpringMVC内置了一些过滤器,用来处理一些特殊场景:

     

    2. 控制器动态代理

    对控制器进行动态代理时推荐使用基于子类的动态代理。

    主要注意的是,如果继承了非Spring上下文感知接口(例如InitializingBean,*Aware等)的其它接口,则需要手动指定代理方式。

     

    3. MVC日志

    DEBUG和TRACE日志记录可能会记录敏感信息,因此默认情况下屏蔽请求参数和请求头,开启方式如下:

     

    4. 异步请求

    SpringMVC与Servlet 3.0异步请求处理进行了广泛的集成:

    更多信息请参考官方文档!

     

    5. HTTP缓存

    HTTP缓存可显著提高Web应用程序的性能。 HTTP缓存围绕Cache-Control响应头以及随后的条件请求头(例如Last-Modified和ETag)展开。