SpringMVC

什么是MVC

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

一类称为实体类Bean,专门用于存储业务数据的,如Student,User一类称为业务处理Bean,指Service或Dao对象,专门用于处理业务逻辑和数据访问

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

MVC的工作流程:

用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕后将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

什么是SpringMVC

SpringMVC是Spring的一个后续产品,是Spring的一个子项目

SpringMVC是Spring为表述层开发提供的一整套完备的解决方案,在表述层框架历经Struct,WebWork,Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为Java EE项目表述层开发的首选方案

SpringMVC的特点

Spring家族原生产品,与IOC容器等基础设施无缝对接

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

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

代码清晰简洁,大幅度提升开发效率

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

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

HelloWorld

创建Maven工程,引入依赖

<dependencies>
	<!-- SpringMVC -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.1</version>
    </dependency>

    <!-- 日志 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <!-- ServletAPI -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

</dependencies>

配置web.xml

注册SpringMVC的前端控制器DispatcherServlet

  1. 默认配置方式

    此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml

    <servlet>
      <servlet-name>SpringMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>SpringMVC</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  2. 扩展配置方式

    可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间

    <servlet>
      <servlet-name>SpringMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      
      <init-param>
        <!-- contextConfigLocation Spring配置文件位置 -->
        <!-- contextClass IoC容器类 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath: WEB-INF/applicationContext.xml</param-value>
      </init-param>
      <!-- 将前端控制器DispatcherServlet的初始化时间提前到服务器启动时 -->
      <load-on-startup>1</load-on-startup>
      
    </servlet>
    
    <servlet-mapping>
      <servlet-name>SpringMVC</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    

创建请求控制器

由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理请求的类,即请求控制器

请求控制器中的每一个处理请求的方法称为控制器方法

因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IOC管理,此时SpringMVC才能意识到控制器的存在

@Controller
public class HelloController {}

创建SpringMVC的配置文件

视图解析器

可以将视图解析为页面

@Bean
public InternalResourceViewResolver viewResolver()
{
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    //前缀
    viewResolver.setPrefix("/WEB-INF/view");
    //后缀
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

解析规则:

前缀 + 控制器方法返回的字符串 + 后缀

mvc注解驱动

xml版

<mvc:default-servlet-handler/>
    <!--    开启mvc注解驱动-->
    <mvc:annotation-driven>
        <mvc:message-converters>
<!--            处理响应中文内容乱码-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="defaultCharset" value="UTF-8"/>
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html</value>
                        <value>application/json</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

java版

@Bean
public StringHttpMessageConverter messageConverter()
{
    StringHttpMessageConverter messageConverter = new StringHttpMessageConverter();
    messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
    messageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
    return messageConverter;
}

SpringMVC的注解

@Controller

标注一个类为控制器类,处理请求

@RequestMapping()

标注在处理请求的方法上,请求映射

当方法的参数名与请求参数的参数名相同时,将请求参数的参数值设置给该方法参数

若方法返回一个字符串,则该字符串会被视图解析器解析为一个视图(页面)

参数:

value = "请求路径"

method = RequestMethod.?

处理请求方式为的?请求

@ResponseBody

返回纯数据

@RequestMapping("/data")
@ResponseBody
public Object data()
{
    Map<String,String> map = new HashMap<>();
    map.put("aaa","aaa");
    map.put("bbb","ccc");
    map.put("ccc","bbb");
    return map;
}

若想使用此注解需要配置一个信息转换器MappingJackson2HttpMessageConverter,其依赖jackson包

@Bean
public MappingJackson2HttpMessageConverter jsonMessageConverter()
{
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
    messageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
    return messageConverter;
}