什么是MVC?

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范,是将业务逻辑、数据、显示分离的方法来组织代码.

MVC的主要作用是降低了视图与业务逻辑间的双向耦合

MVC不是一种设计模式,而是一种架构模式。不同的MVC存在着差异

  • Model(模型):数据模型,提供要展示的数据,因此包含数据和行为。
  • View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西
  • Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的数据模型返回给视图,由视图负责展示,也就是说控制器做了个调度员的工作

MVC框架要做哪些事情:

  1. 将url映射到java类或java类的方法
  2. 封装用户提交的数据
  3. 处理请求,调用相关业务处理,封装响应数据
  4. 将响应的数据进行渲染,jsp/html等展示层。

什么是SpringMVC?

SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架

Spring的web框架围绕着DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。

用注解来实现SpringMVC

1. 首先在web.xml配置文件中配置DispatcherServlet控制器

<!--配置DispatcherServlet:这个是SpringMVC的核心:请求分发器,前端控制器-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--绑定springmvc配置文件-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--启动级别-->
    <load-on-startup>1</load-on-startup>
</servlet>

<!--设置DispatcherServlet的作用范围-->
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!--
        注意:这里的 / 和 /*是有区别的
        /:只匹配所有的请求,不匹配jsp页面
        /*:匹配所有请求,包括jsp页面
    -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

2. 配置SpringMVC的配置文件。注意:配置文件需要引入context和mvc名称空间

<?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">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.zhiqian.controller"/>

    <!--设置SpringMVC不处理静态资源-->
    <mvc:default-servlet-handler/>

    <!--自动开启并注入处理器映射器和处理器适配器-->
    <mvc:annotation-driven/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="suffix" value=".jsp"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
    </bean>
</beans>

3. 创建controller层(servlet层),完善前端视图和controller之间的对应

  • 创建相关Controller控制类,使用@Controller注解
  • 在控制类中创建返回值为String的方法,参数为Model,方法上面使用注解@RequestMapping("路径"),其中返回值为视图名,会被视图解析器处理

@RequestMapping的作用:用于映射url到控制器类或一个特定的处理程序方法上。可用于类和方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

注意:使用springMVC必须配置的三大件:处理器映射器、处理器适配器、视图解析器。其中前两项只需开启注解驱动即可

定义Controller控制器的两种方式:

  • 实现Controller接口定义控制器。缺点:一个控制器只能有一个方法。这种方式不用
  • 使用@Controller注解定义控制器

实现请求转发和重定向

在响应方法上return 后跟资源路径表示转发,在资源路径前加上redirect:表示重定向

获取前端传递过来的参数

  • 接收基本类型的数据:只需要在响应方法上加上对应参数即可,参数前面最好加上注解@RequestParam(""),括号里填写前端传来的参数的名称
  • 接收的是一个对象:在响应方法上加上对应实体类的参数即可,前端传送过来的参数名会自动匹配实体类对象中的属性名。因此参数名必须和实体类中的属性名保持一致,否则就是null

给前端传递参数

  • ModelAndView
  • Model
  • ModelMap

这三种方式都可以给前端传递参数,它们的用法和Map类似,调用addAttribute()方法以键值对的形式存储,返回的前端页面可以通过key拿取对应的值

乱码过滤器

我们可以在web.xml配置文件中配置SpringMVC的乱码过滤器,防止中文乱码。

<!--配置springmvc乱码过滤器-->
<filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Controller返回JSON数据

涉及到的两个注解:

  • @ResponseBody:此注解加在方法上,表明此方法的返回值不走视图解析器,而是直接向前端返回一个json字符串
  • @RestController:此注解用在类上,表明该类中的方法都不会走视图解析器,而是直接返回一个json字符串

一般在前后端分离或者ajax请求的时候会用到

将java对象转化成JSON数据需要导入相关的依赖:Jackson、fastjson等等
以Jackson为例:导入Jackson依赖

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.2</version>
    </dependency>

它提供了一个ObjectMapper对象,调用该对象的writeValueAsString()方法,将参数转换成一个JSON字符串

    List<User> list = new ArrayList<>();
    list.add(new User("张三",18,"男"));
    list.add(new User("李四",19,"男"));
    list.add(new User("王五",18,"男"));
    ObjectMapper mapper = new ObjectMapper();
    String s = mapper.writeValueAsString(list);
    return s;

在传递json字符串时也可能会出现乱码问题,解决json乱码问题:

  • 在@RequestMapping注解上加上属性:produces = "application/json;charset=UTF-8"
  • 在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置
最后修改:2021 年 06 月 09 日 03 : 35 PM
如果觉得我的文章对你有用,请随意赞赏