【SpringMVC】学习总结(一)

SpringMVC

在这里插入图片描述

2.MVC思想

2.1.什么叫MVc?

​ 模型视图控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计思想。它主要通过分离模型视图及控制器在应用程序中的角色将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(serⅵce或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MWC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。

2.2.常见MVC框架运行性能比较

Jsp+servlet > struts1 > spring mvc >struts2+freemarker > struts2,ognl,
开发效率上,基本正好相反。值得强调的是,spring mvc开发效率和struts2不相上下,但从目前来看,springmvc的流行度已远远超过struts2。

3.SpringMVC框架概念与特点

3.1.Spring MVC是什么?

​ Spring MVC是Spring家族中的一个web成员,它是一种基于Java的实现了Web MVC设计思想的请求驱动杀型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring MVC也是要简化我们日常Web开发的。

​ Spring MVC是服务到工作者思想的实现。中央控制器是DispatcherServlet;应用控制器拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;支持本地化/国际化(Locale)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。

3.2.Spring MVC能帮我们做什么?

  • 让我们能非常简单的设计出干净的Web层;

  • 进行更简洁的Web层的开发;

  • 天生与Spring框架集成(如IOC容器、AOP等);

  • 提供强大的约定大于配置的契约式编程支持

  • 能简单的进行Web层的单元测试:

  • 支持灵活的UL到页面控制器的映射;

  • 非常容易与其他视图技术集成,如jsp、Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

  • 非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的AP;

  • 支持灵活的本地化等解析;

  1. 更加简单的异常处理;
  2. 对静态资源的支持;
  3. 支持Restful风格。

4.SpringMVC请求流程

4.1.Spring MVC请求处理流程分析

在这里插入图片描述

Spring MVC框架也是一个基于请求驱动的Web框架,并且使用了前端控制器模式(是用来提供一个集中的请求
处理机制,所有的请求都将由一个单一的处理程序处理来进行设计,再根据请求映射规则分发给相应的页面控制器
(动作/处理器)进行处理。首先让我们整体看一下Spring MVC处理请求的流程:

  • 首先用户发送请求,请求被SpringMvc前端控制器(DispatherServlet)捕获;
  • 前端控制器(DispatherServlet)对请求URL解析获取请求URl,根据URl,调用HandlerMapping;
  • 前端控制器(DispatherServlet)获得返回的HandlerExecutionChain(包括Handler对象以及Handler对象对应的拦截器);
  • DispatcherServlet根据获得的HandlerExecutionChain,选择一个合适的HandlerAdapter。(附注:如果成功获
    得HandlerAdapter后,此时将开始执行拦截器的preHandler(.)方法)
  • HandlerAdapter根据请求的Handleri适配并执行对应的Handler;HandlerAdapter(提取Requestr中的模型数据
    填充Handler,入参,开始执行Handler(Controller))。在填充Handler的入参过程中,根据配置,Spring?将做一些
    额外的工作:
  • HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信
    息。
    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等数据格式化:
    数据格式化:如将字符串转换成格式化数字或格式化日期等
    数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResulti或Error中)
    Handler执行完毕,返回一个ModelAndView(即模型和视图)给HandlerAdaptor
  • Handler执行完毕,返回一个ModelAndView(即模型和视图)给HandlerAdaptor
  • HandlerAdaptori适配器将执行结果ModelAndViewi返回给前端控制器。
  • 前端控制器接收到ModelAndView.后,请求对应的视图解析器。
  • 视图解析器解析ModelAndView后返回对应View;
  • 渲染视图并返回渲染后的视图给前端控制器。
  • 最终前端控制器将渲染后的页面响应给用户或客户端

5.Spring MVC环境搭建

5.1.开发环境

Idea+ Maven + Jdk1.8+tomcat

5.2.新建Maven webApp

Idea下创建springmvc01工程

5.3.pom.xml坐标添加

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zgz</groupId>
    <artifactId>springmvc01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>springmvc01 Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--spring web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>
        <!--spring mvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>
        <!--web servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>springmvc01</finalName>
        <plugins>
            <!--编译环境插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!--tomcat7插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <!--<port>8080</port>-->
                    <path>/web</path>
                    <uriEncoding>UTF-8</uriEncoding>
                    <server>tomcat7</server>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

5.4.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">


    <!--编码过滤utf-8-->
    <filter>
        <description>char encoding filter</description>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--serv1et请求分发器-->
    <servlet>
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化参数,在servlet类加载时加载的参数-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:servlet-context.xml</param-value>
        </init-param>
        <!--表示启动容器时初始化该Servlet-->
        <load-on-startup>1</load-on-startup>

    </servlet>
    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <!--这是拦截请求,"/"代表拦截所有请求,"*.do"拦截所有.do请求-->
        <!--<url-pattern>/</url-pattern>-->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

​ 要想启动我们的SpringMVC环境,目前对于mvc框架的配置还未进行。以上在web.xml中引用了servlet-context.xml文件。

5.4.1.servlet-context.xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        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">
    <!--开启扫描器 -->
    <context:component-scan base-package="com.zgz.springmvc.controller"/>
    <!--使用默认的Servlet来响应静态文件-->
    <mvc:default-servlet-handler/>

    <!--开启注解驱动-->
    <mvc:annotation-driven/>
    <!--配置视图解析器
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceviewResolver">
        <!--前缀:在WEB-INF目录下的jsp目录下-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀:以.jsp结尾的资源-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
5.4.2.页面控制器的编写
package com.zgz.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 *控制器
 */
@Controller
public class HelloController {
    /**
     * 控制器中的方法
     *     访间路径:hello.do
     **/
    @RequestMapping("hello")
    public ModelAndView hello() {
        //得到ModelAndView对象
        ModelAndView mv = new ModelAndView();
        /**
         * 设置数据模型
         **/
        mv.addObject("hello", "hello spring mvc");
        /**
         * 设置视图
         **/
        mv.setViewName("hello") ;
        return mv;
    }
}

5.4.3.添加视图页面

在WEB-INF下新建jsp文件夹,并在文件夹下新建hello.jsp

<%--
  Created by IntelliJ IDEA.
  User: ZHANG
  Date: 2023/2/8
  Time: 18:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- 通过el表达式获取返回数据 --%>
<h2>${msg}</h2>
</body>
</html>

5.4.4.tomcat启动

在这里插入图片描述

6.URL地址映射配置

6.1.@RequestMapping

通过注解@RequestMapping将请求地址与方法进行绑定,可以在类级别和方法级别声明。类级别的注解负责将
一个特定的请求路径映射到一个控制器上,将u和类绑定;通过方法级别的注解可以细化映射,能够将一个特定
的请求路径映射到某个具体的方法上,将ul和类的方法绑定。

6.1.1.映射单个URL
    /**
     * 1.映射单个地址配置
     *      @RequestMapping("路径") 或 @RequestMapping("/路径")
     *      可以给路径添加"/”,也可以不添加
     *      访问路径:http://localhost:8080/web/u01
     **/
    @RequestMapping("u01")
    public ModelAndView url01() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url01");
        modelAndView.setViewName("hello");
        return modelAndView;
    }

    /**
     * 1.映射单个地址配置
     *      可以给路径添加"/”,也可以不添加
     **/
    @RequestMapping("/u02")
    public ModelAndView url02() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url02");
        modelAndView.setViewName("hello");
        return modelAndView;
    }

6.1.2.映射多个地址配置
    /**
     * 2.映射多个地址配置
     *      @RequestMapping(value={"/路径","路径"})
     *      可以给路径添加"/”,也可以不添加
     **/
    @RequestMapping(value={"/u03","u03_2"})
    public ModelAndView url03() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url03");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
6.1.3.设置类路径
    /**
     * 3.设置类路径
     *      @RequestMapping("路径") 或 @RequestMapping("/路径")
     *      可以给路径添加"/”,也可以不添加
     *      访问时:类路径/方法路径
     *      访间路径:http://Localhost:8088/web/urL/u04
     **/
    @RequestMapping("u04")
    public ModelAndView url04() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url04");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
6.1.4.设置地址请求方式
    /**
     * 4.设置地址请求方式
     *      @RequestMapping(value="路径",method = RequestMethod.GET)
     *
     *      访问路径:http://Localhost:8088/web//urL/u05
     *
     **/
    @RequestMapping(value="u05",method = RequestMethod.POST)
    public ModelAndView url05() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url05");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
6.1.5.设置参数路径
    /**
     * 5.设置参数路径
     *      @RequestMapping(value="路径",method = RequestMethod.GET)
     *
     *      访问路径:http://Localhost:8088/web//urL/u05?u06
     *
     **/
    @RequestMapping(params = "u06")
    public ModelAndView url06() {
        ModelAndView modelAndView= new ModelAndView();
        modelAndView.addObject("msg", "url06");
        modelAndView.setViewName("hello");
        return modelAndView;
    }

7.参数绑定

​ 客户端请求的参数到控制器功能处理方法上的参数的绑定,对于参数绑定非常灵活。

7.1.基本数据类型

/**
     * 基本数据类型
     * 1.传递的参数名与方法的形参名保持一致
     * 2.如果参数未传递或参数值为null时,会报500异常
     **/
    @RequestMapping("p01")
    public void param01(int age, double money) {
        System.out.println("age:" + age + "money:" + money);
    }

/**
     * 基本数据类型
     *  1.传递的参数名与方法的形参名保持一致
     *  2.如果参数未传递或参数值为null时,会报500异常
     *
     *  可以通过@RequestParam注解设置参数的相关信息 (注解声明在形参前)
     *      1.通过属性defaultValue设置参数的默认值 (防止基本类型的参数未传递时500异常)
     *      2.通过属性name设置参数的别名
     **/
    @RequestMapping("p02")
    public void param02(@RequestParam(defaultValue = "18" ,name= "uage") int age, @RequestParam(defaultValue = "100")double money) {
        System.out.println("age:" + age + "money:" + money);
    }

7.2.包装类型

/**
     * 包装类型 (如果数据是基本数据类型,建议使用对应的包装类)
     *      1.传递的参数名与方法的形参名保持一致
     *      2.如果参数未传递,默以值为null
     *
     * 可以通过@RequestParam注解设置参数的相关信息(注解声明在形参前)
     *      1.通过属性defaultValue设置参数的默认值(防止基本类型的参数未传递时500异常)
     *      2.通过属性name设置参数的别名
     *
     **/
    @RequestMapping("p03")
    public void param03(Integer age , Double money) {
        System.out.println("age:" + age + "money:" + money);
    }

7.3.字符串类型

 /**
     * 字符串类型
     *      传递的参数名与方法的形参名保持一致
     *      可以接收nuLL值
     *
    **/
    @RequestMapping("p04")
    public void param03(String str) {
        System.out.println("String:" + str);
    }

7.4.数组类型

    /**
     * 数组类型数据绑定
     *      客户端传参形式:ids=1&ids=2&ids=3
     */
    @RequestMapping("/data06")
    public void data06(String[] ids) {
        for (String id : ids) {
            System.out.println(id + "---") ;
        }
    }

7.5 JavaBean类型

    /**
     *JavaBean数据绑定
     *  参数名与JavaBean.对象中的属性字段名保特一致(自动将参数设置到的JavaBean中)
     @param user
     */
    @RequestMapping("/data07")
    public void data07(User user) {
        System.out.println(user);
    }

8.请求转发与重定向

​ SpringMVC默认采用服务器内部转发的形式展示页面信息。同样也支持重定向页面。

8.1.重定向

​ 重定向是发一个302的状态码给浏览器,浏览器自己去请求跳转的网页。地址栏会发生改变。

重定向以redirect::开头

    /**
     * 重定向到JSP页面
     * 默认从项目的根目录下查找资源
     * 返回ModelAndView 对象
     */
    @RequestMapping("view09")
    public ModelAndView view09() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型(请求域的值在重定向中获取不到)
        modelAndView.addObject("msg", "重定向 1...");
        //设置视图
        modelAndView.setViewName("redirect:view.jsp");

        return modelAndView;
    }


    /**
     * 重定向到JSP页面
     * 默认从项目的根目录下查找资源
     * 可以传递参数
     * 返回ModelAndView 对象
     */
    @RequestMapping("view10")
    public ModelAndView view10() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型(请求域的值在重定向中获取不到)
        modelAndView.addObject("msg", "重定向 2...");
        //设置视图
        modelAndView.setViewName("redirect:view.jsp?uanme=zhangsan");

        return modelAndView;

    }

    /**
     * 重定向到JSP页面
     * 默认从项目的根目录下查找资源
     * 可以传递参数
     * 返回ModelAndView 对象
     */
    @RequestMapping("view11")
    public ModelAndView view11(RedirectAttributes redirectAttributes) {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型(请求域的值在重定向中获取不到)
        modelAndView.addObject("msg", "重定向 3...");
        //设置中文参数
        redirectAttributes.addAttribute("uanme","张三") ;
        //设置视图
        modelAndView.setViewName("redirect:view.jsp");

        return modelAndView;

    }

    /**
     * 重定向到控制器
     * 默认从项目的根目录下查找资源
     * 可以传递参数
     * 返回ModelAndView 对象
     */
    @RequestMapping("view12")
    public ModelAndView view12(RedirectAttributes redirectAttributes) {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型(请求域的值在重定向中获取不到)
        modelAndView.addObject("msg", "重定向 4...");

        //设置视图
        modelAndView.setViewName("redirect:hello");

        return modelAndView;

    }

    /**
     * 重定向到JSP页面
     * 默认从项目的根目录下查找资源
     *
     * 返回字符串
     */
    @RequestMapping("view13")
    public String view13() {
        return "redirect:view.jsp";
    }

    /**
     * 重定向到控制器
     * 默认从项目的根目录下查找资源
     *
     * 返回字符串
     */
    @RequestMapping("view14")
    public String view14() {
        return "redirect:hello";
    }

8.2.请求转发

​ 请求转发,直接调用跳转的页面,让它返回。对于浏览器来说,它无法感觉服务器有没有forward。地址栏不发生改变。可以获取请求域中的数据。
请求转发以forward:开头

 /***
     *
     * 请求转发跳转转JSP页面
     * 默认采用请求转发,会去视图解析器中设定的路径下查找指定的视图。 (在WEB-INF/jsp目录下查找名称为test的jsp文件)
     **/
    @RequestMapping("view01")
    public ModelAndView view01() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型
        modelAndView.addObject("msg", "请求转发1---");
        //设置视图
        modelAndView.setViewName("test");

        return modelAndView;
    }

    /***
     *
     * 请求转发跳转JSP页面
     * 使用forward:页面名 转发,此时会从项目的根路径(webapp目录)下查找指定页面
     * 如果传递参数,在页面中可以通过${param.参数名}获取对应的参数
     **/
    @RequestMapping("view02")
    public ModelAndView view02() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型
        modelAndView.addObject("msg", "请求转发2---");
        //设置视图
        modelAndView.setViewName("forward:test.jsp");

        return modelAndView;
    }

    /***
     *
     * 请求转发跳转JSP页面
     * 使用forward:页面名 转发,此时会从项目的根路径(webapp目录)下查找指定页面
     * 如果传递参数,在页面中可以通过${param.参数名}获取对应的参数
     **/
    @RequestMapping("view03")
    public ModelAndView view03() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型
        modelAndView.addObject("msg", "请求转发3---");
        //设置视图
        modelAndView.setViewName("forward:test.jsp?uanme=zhang");

        return modelAndView;
    }

    /***
     *     请求转发跳转控制器
     *     使用forward:路径 转发,此时会从项目的根路径下查找指定控制器
     **/
    @RequestMapping("view04")
    public ModelAndView view04() {

        ModelAndView modelAndView = new ModelAndView();
        //数据模型
        modelAndView.addObject("msg", "请求转发4---");
        //设置视图
        modelAndView.setViewName("forward:hello");

        return modelAndView;
    }

    /***
     * 请求转发跳转JSP页面
     *      默认会从视图解析器设置的路径下查找。(WEB-INF/jsp目录下查找)
     * 返回视图名字符串
     *
     * 常用对象可以设置到方法的形参中,直接使用。
     *
     **/
    @RequestMapping("view05")
    public String view05(HttpServletRequest request) {

        request.setAttribute("msg", "请求转发5---");

        return "test";
    }


    /***
     * 请求转发跳转JSP页面
     *      默认会从视图解析器设置的路径下查找。(WEB-INF/jsp目录下查找)
     * 返回视图名字符串
     *
     * 常用对象可以设置到方法的形参中,直接使用。
     *
     **/
    @RequestMapping("view06")
    public String view06(HttpServletRequest request) {

        request.setAttribute("msg", "请求转发6---");

        return "/../../index";
    }


    /***
     * 请求转发跳转JSP页面
     *      使用forward:路径  转发,此时会从项目的根路径下查找指定控制器
     * 返回视图名字符串
     *
     * 常用对象可以设置到方法的形参中,直接使用。
     *
     **/
    @RequestMapping("view07")
    public String view07(HttpServletRequest request) {

        request.setAttribute("msg", "请求转发7---");

        return "forward:/../../index";
    }


    /***
     * 请求转发跳转控制器
     *      使用forward:路径  转发,此时会从项目的根路径下查找指定控制器
     *
     * 常用对象可以设置到方法的形参中,直接使用。
     *
     **/
    @RequestMapping("view08")
    public String view08(HttpServletRequest request) {

        request.setAttribute("msg", "请求转发8---");

        return "forward:hello";
    }

/**
 * 重定向与请求转发
 *    SpringMVC内部默认采用请求转发形式。
 *  请求转发
 *      地址栏不发生改变。以forward:开头。
 *      方法有两种返回值:
 *      1.返回ModelAndView.对象
 *      2.返回视图名字符串
 *      注:默认都会从视图解析器设置的路径下查找指定视图(不需要设置视图后缀,直接写视图名),如果想从顶目的根目录下查找,则使用forward:视图/控制器
 *  重定向
 *      地址栏会发生改变。以redirect:开头。|
 *      方法有两种返回值:
 *      1.返回ModelAndView.对象
 *      2.返回视图名字符串
 *      注:重定向默认会从顶目的根路径下查找资源。
 */

9.JSON数据开发

9.1.基本概念

​ Json在企业开发中已经作为通用的接口参数类型,在页面(客户端)解析很方便。SpringMVC对于json提供了良好的支持,这里需要修改相关配置,添加json数据支持功能.

9.1.1.@ResponseBody

​ 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
​ 返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用(通常用于ajax请求)。

9.1.2.@RequestBody

​ 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到controller中方法的参数上。

9.2.使用配置

9.2.1.添加json相关坐标

pom.xml

 <!--添加json依赖jar包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.10.0</version>
        </dependency>
9.2.2.修改配置文件

servlet-context.xml

    <!--mvc请求映射处理器与适配器配置-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>
9.2.3.注解使用
9.2.3.1.@ResponseBody & @RequestBody
/**
 * @ResponseBody
 *      设置在方法级别或方法的类型前
 *      默认控制器中方法的返回值是会去找对应的视图页面,如果想要返回数据,需要将返回的结果转换成字符串响应(转换成幻S0字符串)
 * @RequestBody
 *      设置在形参前
 *      要求传递的参数是一个Json格式的字符串!!!(注:字符串!!!)
 */


    /**
     * 响应字符串
     **/
    @RequestMapping("hello")
    @ResponseBody
    public String index(){
        return "Hello SpringMVC" ;
    }

    /**
     * 响应字符串
     **/
    @RequestMapping("queryUser")
    @ResponseBody
    public User queryUser(){
        User user = new User();
        user.setUserId(1);
        user.getUserName("zhangsan") ;
        return user ;
    }

    /**
     * 响应字符串
     **/
    @RequestMapping("queryUser02")
    @ResponseBody
    public User queryUser02(User user){
        
        return user ;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值