Spring MVC是Spring体系的轻量级Web MVC 框架. Spring MVC的核心Controller控制器,用于处理请求,产生响应. Spring MVC基于Spring IOC容器运行,所有对象被IOC管理

Spring MVC 官方网址: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
Spring 5.x 的版本变化,之前的文章都是根据spring 4.x的版本来开发的

  • Spring 5.x最低要求JDK8与J2EE7(Servlet3.1/Tomcat8.5+)
  • Spring 5.x支持JDK8/9 可以使用新特性
  • Spring 5.x最重要的新特性支持响应式编程

    Spring MVC环境配置

    创建一个新的项目,进入product

image.png

image.png

image.png

image.png

image.png

得到如下界面,Type:选择Web Application : Exploded

image.png

创建完项目之后,在pom.xml中添加spring-webmvc 依赖

  1. Maven依赖spring-webmvc
  2. web.xml配置DispatcherServlet
  3. 配置applicationContext的mvc标记
  4. 开发Controller控制器
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>5.2.4.RELEASE</version>
  6. </dependency>
  7. </dependencies>

配置web.xml

<?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_4_0.xsd"
         version="4.0">
    <!-- DispatchServlet 对所有请求进行拦截
        DispatcherServlet是Spring MVC最核心对对象
        DispatcherServlet用于拦截http请求
        并根据请求对URL调用与之对应的Controller方法,来完成http请求处理
    -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置加载哪个applicatoinContext.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <!-- 在web应用启动时自动创建Spring IOC容器 并初始化DispatcherServlet -->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 拦截所有请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

配置applicationContext.xml

<!--
        在Spring ioc 初始化过程中,自动创建管理com.prim.springmvc及自包中拥有一下注解的对象
        @Repository
        @Service
        @Controller
        @Component
     -->
    <context:component-scan base-package="com.prim.springmvc"/>
    <!-- 启动Spring MVC注解开发模式 conversion-service 一旦遇到date类型就会根据配置的转换 -->
    <mvc:annotation-driven conversion-service="conversionService">
        <!-- 设置消息的转换器 -->
        <mvc:message-converters>
            <!-- 对于http响应的消息文本转换 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 原始的写法: response.setContextType() -->
                        <value>text/html;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- 将图片js/css等静态资源排除在外 不通过DispatcherServlet处理 提高执行效率 -->
    <mvc:default-servlet-handler/>

    <!-- 通知Spring MVC 有哪些自定义的时间格式转换类 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.prim.springmvc.converter.DateConverter"/>
            </set>
        </property>
    </bean>

Spring MVC 数据绑定

如何进行数据绑定,controller 控制器的方法如何和URL绑定在一起的呢? 通过注解@GetMapping

  • URL Mapping 🈯️将URL与Controller方法绑定
  • 通过将URL与方法绑定,SpringMVC便可通过Tomcat对外暴露服务
  • @RequestMapping 通用绑定
  • @GetMapping 绑定Get请求
  • @PostMapping 绑定post请求

接受请求参数

  • 使用Controller方法参数接收
  • 使用Java Bean接受数据
  • 复合数据的获取

利用数组或者list接受请求中的复合数据 利用@RequestParam作为参数设置默认值 使用Map对象接受请求参数及注意事项

URI绝对路径与相对路径
/project
/js
/jquery.js
/index.js
/index.html

中文乱码

tomcat默认使用字符集ISO-8859-1,解决乱码将ISO-8859-1转换为UTF-8
controller中请求与响应都要设置utf-8字符集
解决方案:

  • Get请求乱码 - server.xml增加URIEncoding属性

    URIEncoding=”UTF-8” tomcat 8.0之后版本默认是utf-8
    8.0之前版本需要添加 URIEncoding=”UTF-8”

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    
  • Post请求乱码 - web.xml配置CharacterEncodingFilter

 <!-- 配置post请求中文乱码过滤 -->
    <filter>
        <filter-name>characterFilter</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>
    </filter>
    <filter-mapping>
        <filter-name>characterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • Response响应乱码 - Spring配置StringHttpMessageConverter
<!-- 启动Spring MVC注解开发模式 conversion-service 一旦遇到date类型就会根据配置的转换 -->
    <mvc:annotation-driven conversion-service="conversionService">
        <!-- 设置消息的转换器 -->
        <mvc:message-converters>
            <!-- 对于http响应的消息文本转换 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 原始的写法: response.setContextType() -->
                        <value>text/html;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

响应输出结果

  • @ResponseBody - 产生响应文本

    ResponseBody 直接产生响应体的数据,不涉及任何视图 ResponseBody 可产生标准字符串/JSON/XML等格式数据 ResponseBody 被StringHttpMessageConverter所影响

  • ModelAndView - 利用模版引擎渲染输出

ModelAndView指“模型与视图”对象
通过ModelAndView可将包含数据对象与模版引擎进行绑定
SpringMVC中默认的View是JSP,也可以配置其他模版引擎.

  • mav.addObject()方法设置的属性默认存放在当前请求中
  • 默认ModeAndView 使用请求转发(forward)至页面
  • 重定向使用new ModelAndView(“redirect:/index.jsp”)

Spring MVC 整合Freemarker

加入依赖后,必须将jar包添加到 WEB-INF/lib中,否则就会报错 找不到类的错误.

        <!-- 整合freemarker模版引擎 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

freemarker 配置

    <!-- freemarker 配置 -->
    <!-- 开启freemarker -->
    <bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!-- 产生结果以后 输出文本向客户端输出的字符集 -->
        <property name="contentType" value="text/html;charset=utf-8"/>
        <!-- 配置扩展名 -->
        <property name="suffix" value=".ftl"/>
    </bean>
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!-- 配置模版文件目录 WEB-IN 目录下外部无法访问可以保证安全性-->
        <property name="templateLoaderPath" value="/WEB-INF/ftl"/>
        <property name="freemarkerSettings">
            <props>
                <!-- 渲染产生最终结果设置的字符集 -->
                <prop key="defaultEncoding">UTF-8</prop>
            </props>
        </property>
    </bean>
@Controller
@RequestMapping("/fm")
public class FreemarkerController {

    @GetMapping("/test")
    public ModelAndView test() {
        //直接写文件名即可 Spring已经帮助我们找到扩展名
        ModelAndView modelAndView = new ModelAndView("/test");
        User user = new User();
        user.setUsername("andy");
        //传递请求 数据
        modelAndView.addObject("u", user);
        return modelAndView;
    }
}

test.ftl 模版

<h1>${u.username}</h1>