1.MVC&SpringMVC框架概念及特点

(1)什么是MVC?

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

具体操作:

(2)什么是SpringMVC?

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

(3)SpringMVC的好处

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

2.进行更简洁的Web层的开发;

3.天生与Spring框架集成(如IOC容器、AOP等);
4.提供强大的约定大于配置的契约式编程支持;

5.能简单的进行Web层的单元测试;

6.支持灵活的URL到页面控制器的映射;
7.非常容易与其他视图技术集成,如jsp、Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是
放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

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

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

10.更加简单的异常处理;

11.对静态资源的支持;

12.支持Restful风格。

2.SpringMVC请求流程&环境搭建

2.1 SpringMVC请求处理流程分析

   

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

1.首先用户发送请求,请求被SpringMvc前端控制器(DispatherServlet)捕获;
2. 前端控制器(DispatherServlet)对请求URL解析获取请求URI,根据URI,调用HandlerMapping;

3.前端控制器(DispatherServlet)获得返圍的HandlerExecutionChain(包括Handler对象以及Handler对象对应的拦截器);

4. DispatcherServlet 根据获得的HandlerExecutionChain,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler( ….. )方法);
5.HandlerAdapter根据请求的Handler适配并执行对应的Handler;HandlerAdapter(提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring将做一些额外的工作:HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等数据格式化:

数据格式化。如将字符串转换成格式化数字或格式化日期等。

6.Handler执行完毕,返回一个ModelAndView(即模型和视图)给HandlerAdaptor

7. HandlerAdaptor适配器将执行结果ModelAndView返回给前端控制器。

8.前端控制器接收到ModelAndView后,请求对应的视图解析器。
9.视图解析器解析ModelAndView后返回对应View;

10.渲染视图并返回渲染后的视图给前端控制器。

11、最终前端控制器将渲染后的页面响应给用户或客户端

2.2 SpringMVC环境搭建

(1)新建Maven webApp

(2)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.xxxx</groupId>
  <artifactId>springmvc01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springmvc01 Maven Webapp</name>

  <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>
      </dependency>
  </dependencies>

  <build>
    <finalName>springmvc01</finalName>
      <!-- 编译环境插件-->
      <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>

      <configuration>
      <source>1.8</source>
      <target>1.8</target>
      <encoding>UTF-8</encoding>
      </configuration>
      </plugin>
     <!--jetty插件 -->
          <plugin>
              <groupId>org.eclipse.jetty</groupId>
              <artifactId>jetty-maven-plugin</artifactId>
              <version>9.4.27.v20200227</version>

              <configuration>

      <!-- 设置端口-->
          <httpConnector>
              <port>8080</port>
          </httpConnector>
       <!--  设置项目路径 -->
<webAppConfig>
<contextPath>/springmvc01</contextPath>
</webAppConfig>
      </configuration>
</plugin>

      </plugins>
        </build>
      </project>

(3)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">

   <!-- &lt;!&ndash; 开启扫描器 &#45;&#45; >-->
    <context:component-scan base-package="com.xxxx.springmvc.controller"/>

   <!-- &lt;!&ndash; 使用默认的 Servlet 来响应静态文件 &#45;&#45; >-->
    <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>

(4)配置web.xml

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

 <!--  编码过滤 -->
  <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>
  <!-- servlet请求分发器 -->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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请求  -->
<!--&lt;!&ndash; <url-pattern>/</url-pattern> &#45;&#45; >-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

(5)页面控制器的编写

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=new ModelAndView();

//设置数据
        modelAndView.addObject("hello","Hello SpringMVC");
        //视图名称
        modelAndView.setViewName("hello");

        return modelAndView;
    }
}

(6)添加页面视图

<%@ page language="java" import="java.util .* " pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML>
<html>
<head>
    <base href=" <= basePath %">
    <title>My JSP 'hello.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http http-equiv="description" content="This is my page">
</head>
<body>
<%-- el表达式接收参数值 --%>
${hello}
</body>
</html>

(7)启动jetty服务器

配置完毕后,输入下图的网址,启动jetty服务器

2.3 URL地址映射配置&参数绑定

  地址映射配置:通过注解@RequestMapping 将请求路径与方法进行绑定,可以声明在方法级别和类级别。

声明级别: 1.方法级别 2.类级别+方法级别

2.3.1 映射单个URL

声明在方法上,映射单个url

格式:@RequestMapping(“请求路径”)/@RequestMapping(value=“请求路径”)

例如:
@RequestMapping("/test01")
public ModelAndView test01(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test01");
    modelAndView.setViewName("hello");
    return modelAndView;
}
@RequestMapping(value="/test01")
public ModelAndView test01(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test01");
    modelAndView.setViewName("hello");
    return modelAndView;
}
访问地址:http://localhost:8080/springmvc01/test01

2.3.2 映射多个URL

声明在方法上,映射多个URL  支持一个方法绑定多个URL的操作。
使用方式:
1. @RequestMapping({"请求路径","请求路径"})
2.@RequestMapping(value={"请求路径","请求路径"})

例如:

@RequestMapping({"test03_01","test02_01"})
public ModelAndView test03(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test03");
    modelAndView.setViewName("hello");
    return modelAndView;
}
访问地址:
1. http://localhost:8080/springmvc01/test03_01
2. http://localhost:8080/springmvc01/test02_01

2.3.3 映射URL在控制器上

声明在类上,类中的方法都要以该路径作为父路径。
* 声明级别:
* 类级别+方法级别   (/类路径/方法路径)

@Controller

@RequestMapping("/

")

例如:

@Controller
@RequestMapping("/url")
public class UrlController {
@RequestMapping("/test04")
public ModelAndView test04(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test04");
    modelAndView.setViewName("hello");
    return modelAndView;

}

*访问地址: http://localhost:8080/springmvc01/url/test04

2.3.4 设置URL映射的请求方式

通过method属性设置请求方式,默认get和post等请求方式都支持。
注意:如果设置了请求方式,则必须通过制定请求方式访问

格式:

@RequestMapping(value="", method= RequestMethod.   )

例如:

@RequestMapping(value="test06", method= RequestMethod.POST)
public ModelAndView test06(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test06");
    modelAndView.setViewName("hello");
    return modelAndView;
}
访问地址:(只能通过post请求)
* http://localhost:8080/springmvc01/url/test06

2.3.5 通过参数名称映射URL

通过参数的形式访问
* 通过参数的形式访问
* 访问地址:
* http://localhost:8080/springmvc01/url?test05
* */
@RequestMapping(params = "test05")
public ModelAndView test05(){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "test05");
    modelAndView.setViewName("hello");
    return modelAndView;
}

2.4 参数绑定

2.4.1 基本类型

 * 基本类型数据绑定
 * 通过注解@RequestParam 标记一个参数作为请求参数(注解声明在参数前面)
 * 可以通过注解的属性设置相关内容
 * 设置参数默认值 defaultValue默认值 (避免基本类型的数据为空时的500异常)
 * 设置参数的参数名(参数的别名) name属性(如果设置了别名,此时客户端擦混低的参数名要与别名保持一致)
 * @param age
 * @param money
 例如:
@RequestMapping("/data1")
public  void data1(int age,double money) {
    System.out.println("age:"+age+",money:"+money);
}
@RequestMapping("/data2")
public  void data2(@RequestParam(defaultValue = "10") int age,
                   @RequestParam(defaultValue = "20.0") double money) {
    System.out.println("age:"+age+",money:"+money);
}
@RequestMapping("/data3")
public  void data3(@RequestParam(defaultValue = "10" ,name ="userAge" ) int age,
                   @RequestParam(defaultValue = "20.0" ,name="userMoney") double money) {
    System.out.println("age:"+age+",money:"+money);
}

2.4.2 包装类型

请求的参数名要与方法的形参名要保持一致(在未设置别名的情况下),默认为null。
 *可以通过设置@requestParam的属性设置 默认值和别名
*
* @param age
 * @param money

例如:

@RequestMapping("/data4")
public  void data4(Integer age,double money) {
    System.out.println("age:"+age+",money:"+money);
}

2.4.3 字符串类型

/*
 * 字符串类型数据绑定
 * 请求的参数名要与方法的形参名要保持一致(在未设置别名的情况下),默认为null。
 *可以通过设置@requestParam的属性设置 默认值和别名
 *
 * @param userName
 * @param userPassword
 * */

例如:

@RequestMapping("/data5")
public  void data5(String userName,String userPassword) {
    System.out.println("userName:"+userName+",userPassword:"+userPassword);
}

2.4.4 数组类型

/*数组类型数据绑定
客户端传参方式:hobboys=sing&&hobboys=run&hobboys=...
@param hobbys
* */
@RequestMapping("/data6")
public  void data6(String []hobboys) {
   for(String hobbys:hobboys){
       System.out.println(hobbys);
   }

}

2.4.5  JavaBean类型

/*
 * javaBean类型数据绑定
 * 客户端请求的参数名与javaBean对象的属性字段保持一致。
 *
 *
 *
 * @param user
 * */
@RequestMapping("/data7")
public  void data7(User user) {

        System.out.println(user);


}
public class User {
    private Integer id;
    private String userName;
    private String userPassword;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                '}';
    }
}

2.4.6 集合类型

/*
* List集合类型数据绑定
* 注:集合类型的数据,使用JavaBean对象进行包装
* */

例如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>List集合类型数据绑定</title>
</head>
<body>
<form action="data8" method="post">
   <%-- <input name="ids" value="123456" />
    <input name="ids" value="4576" />--%>
    <input name="ids[0]" value="123456" />
    <input name="ids[1]" value="4576" />
       <input name="phoneList[0].num" value="457634343" />
       <input name="phoneList[1].num" value="4576434439" />
       <%--javaBean--%>

    <button type="submit"> 提交</button>
</form>
</body>
</html>
public class Phone {
    private String num;

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "num='" + num + '\'' +
                '}';
    }
}
import java.util.List;

public class User {
    private Integer id;
    private String userName;
    private String userPassword;
//添加集合属性
    private List<Integer>ids;
    private List<Phone>phoneList;

    public List<Phone> getPhoneList() {
        return phoneList;
    }

    public void setPhoneList(List<Phone> phoneList) {
        this.phoneList = phoneList;
    }

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                ", ids=" + ids +
                ", phoneList=" + phoneList +
                '}';
    }
}
@RequestMapping("/data8")
public void data8(User user){
    System.out.println(user);
}

2.5 请求域绑定

* 请求域对象设置API
* 1.ModelAndView
@RequestMapping("/model01")
    public ModelAndView model01(){
    /*
    * 数据模型:Model
    * 视图:View
    * */
   // 设置数据模型(请求访问对象的数据)
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("hello", "Hello Model01");
   //设置视图
    modelAndView.setViewName("hello");
    return modelAndView;
}
* 2.ModelMap
@RequestMapping("/model02")
public String model02(ModelMap modelMap){
    /*
     * 数据模型:Model
     * 视图:View
     * */
    // 设置请求域对象

    modelMap.addAttribute("hello", "Hello Model02");

    //返回视图
    return "hello";
}
* 3.Model
@RequestMapping("/model03")
public String model02(Model model){

    // 设置请求域对象

    model.addAttribute("hello", "Hello Model03");

    //返回视图
    return "hello";
}
* 4.Map
@RequestMapping("/model04")
public String model04(Map map){

    // 设置请求域对象

    map.put("hello", "Hello Model04");

    //返回视图
    return "hello";
* 5.HttpServletRequest
@RequestMapping("/model04")
public String model05(HttpServletRequest httpServletRequest){

    // 设置请求域对象

  httpServletRequest.setAttribute("hello","Hello Model05");
    //返回视图
    return "hello";
}

2.6请求转发与重定向的问题

2.6.1 重定向

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

举例:

/*
     * 请求转发与重定向
     * */
    @Controller
    public class ViewController {
        /*
         * 重定向到JSP页面
         * @return
         * */
        @RequestMapping(value = "/view01")
        public String view01(){
            return "redirect:view.jsp";
        }
        /*
         * 传递参数
         * */
        @RequestMapping("/view02")
        public String view02(){
            return "redirect:view.jsp?name=dsdad&password=222323";
        }

        /*
        * 重定向到JSP页面
        * 传递中文参数(传递中文参数会出现乱码)
        * @return
        * */
        @RequestMapping("/view03")
        public String view03(){
            return"redirect:view.jsp?name=张三&password=232323";

        }
/*重定向到JSP页面
传递参数(通过RedirectAttributes 对象设置重定向的参数,避免中文乱码问题)
*@param
* */
        @RequestMapping("/view04")
        public String view04(RedirectAttributes redirectAttributes){
            //设置参数

            redirectAttributes.addAttribute("name","张三");
            redirectAttributes.addAttribute("password","232323");
            return "redirect:view.jsp";
        }
        /*重定向到JSP页面
        返回的是ModelAndView对象
        * */
    @RequestMapping("/view05")
    public ModelAndView view05(ModelAndView modelAndView){
        //设置模型数据
        modelAndView.addObject("name", "sds");
        modelAndView.addObject("password", "2132");
        //设置视图
        modelAndView.setViewName("redirect:view.jsp");
        return modelAndView;


    }
    /*重定向到Controller
    返回 ModelAndView对象

    @param modelAndView
    @return
    * */
    @RequestMapping("/view06")
    public ModelAndView view06(ModelAndView modelAndView){
        //设置模型数据
        modelAndView.addObject("name", "王五");
        modelAndView.addObject("password", "ds2132");
        //设置视图
        modelAndView.setViewName("redirect:text");
        return modelAndView;

2.6.2 请求转发






/*请求转发到JSP页面
* 传递参数
* @return
* */
@RequestMapping("/view07")
public String view07(){
     return "forward:/../../view.jsp";
}
/*请求转发到JSP页面
  * 传递参数(中文不乱码)
  * @return
  * */
@RequestMapping("/view08")
public String view08(){
     return "forward:/../../view.jsp?name=张三&password=2323";
}
/*请求转发到JSP页面
设置请求域
*
* */
@RequestMapping("/view09")
public String view09(Model model){
     model.addAttribute("name","管理员");
     return "forward:/../../view.jsp?name=张三&password=2323";
}
/*请求转发到JSP页面
设置请求域
*
* */

 /*
* 请求转发到JSP页面(默认)
* 默认会去指定的目录下查找JSP页面(配置文件中设置的)
* @param model
* */

 @RequestMapping("/view10")
public String view10(Model model){
     model.addAttribute("name","管理员");
     return "/../../view";
}

/*
*请求转发Controller
* @param modelAndView
* 
* */

@RequestMapping("/view11")
public ModelAndView view11(ModelAndView modelAndView){
     modelAndView.setViewName("forward:text");
     return modelAndView;
}


@RequestMapping("/view12")
public ModelAndView view12(ModelAndView modelAndView){
     modelAndView.setViewName("forward:text?name=admin&password=1312");
     return modelAndView;
}
}

2.7 JSON数据开发

2.7.1 注解

(1)@ResponseBody

  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 Response对象的body数据区。

  返回的数据不是html标签的页面,而是其他某种格式的数据(如json、xml等)使用(通常用于ajax请求)


(2) @RequestBody

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

2.7.2 使用配置

(1)pom.xml添加json相关坐标。

<!--添加jackson依赖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>

(2)修改servlet-context-xml

<!-- mvc 请求映射 处理器与适配器配置 -- >
<mvc: annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean
class="org.springframework.http.converte].json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>

(3)注解使用

1>@ResponseBody

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用(通常用于ajax请
求)。

2> @RequestBody

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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐