欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot2.x-SpringMVC详解

程序员文章站 2022-03-21 11:42:31
StringMVC是编写java接口的基础,承担接收和反馈数据的作用,本文主要对入参和出参进行详细解释一、类声明注解@Controller@ResponseBody@RequestMapping("/mvc")public class HelloCtrol {}@Controller声明这是控制类,如果没有@ResponseBody,表示说类卢有方法的返回都是页面路径@ResponseBody声明在这个类里所有方法返回的数据都将转化成json对象,@....

StringMVC是编写java接口的基础,承担接收和反馈数据的作用,本文主要对入参和出参进行详细解释

一、类声明注解

 

@Controller
@ResponseBody
@RequestMapping("/mvc")
public class HelloCtrol {

}

@Controller 声明这是控制类,如果没有@ResponseBody,表示说类卢有方法的返回都是页面路径
@ResponseBody 声明在这个类里所有方法返回的数据都将转化成json对象,@Controller+@ResponseBody=@RestController
@RequestMapping 这个类的所有方法对用@RequestMapping映射路径都要加上这个路径前缀

二、类方法注解

1.方法上注解

@ResponseBody
声明返回的数据将转化成json,否则则是页面路径
@RequestMapping

简写:

@RequestMapping("/index")  等价@RequestMapping(value="/index",method=RequestMethod.GET),提交方式为GET

1、 value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

 

2、 consumes,produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

 

3、 params,headers;

params: 指定request中必须包含某些参数值是,才让该方法处理。

@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")

 

Value详解

 1.最简单,一个路径 如value="/shop/cread_User"

 2.Restful,把值放入路径,避免?传参数,如value="/shop/cread_User/${user_id}",和参数注解:

@PathVariable("user_id") Integer user_id
联合使用

3.value为数组,表示多个路径映射到一个方法上,如:

value = { "/user","/userList","creatUser"}

4.模糊匹配:

value="view/*"

 

consumes、produces限制请求的提交类型和返回的内容内容,很少用到

@Controller

//方法仅处理request Content-Type为“application/json”类型的请求
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") 
public void addPet(@RequestBody Pet pet, Model model) {    
    // implementation omitted
}

 

@Controller
//方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {    
    // implementation omitted
}

2.方法内参数注解

@RequestParam注解

获取get或者post提交的参数

 public User m1(HttpServletRequest request,@RequestParam(value = "id",defaultValue = "2",required = true) Integer id,@RequestParam("name") String name){

}

(1)value,URL对应参数名,可以与后面方法里的参数名不一致

 (2)required:是否必填

  (3)defaultValue:默认参数

注意如果:value名和方法里参数名一样,可省了,如RequestParam(value = "id")Integer id 等价于 Integer id,注意java po对象不能加@RequestParam

 

@PathVariabl注解

和url占位配合使用

@RequestMapping(value = "/index/{id}", method = RequestMethod.GET)
public String zw(@PathVariable("id") Integer id){}

@RequestBody

主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个

应用场景:

前端传递比较复杂的json数据,很难用简单键值对来描述

协助:

  (1)http格式contentType:"application/json"

   (2)传递数要用json字符串,不能用js对象

   (3)提交方式必须是post

 

接收对象可以是个json字符串,也可以映射成对象

例:js

function json() {
    var obj=  {
        userId: 1,
        userName: 'jzk',
        address:{"city":"成都"}
    };
    $.ajax({
        type: "POST",//方法类型
        dataType: "json",//预期服务器返回的数据类型
        url: "/mvc/jsonobj" ,//url
        data:JSON.stringify(obj),//Json字符串
        contentType:"application/json;charset=UTF-8",

        headers: //header里面传递数据
            {
                Authorization: '1234456',
                pwd:'44333333'
            },

        success: function (result) {
            console.log(result);//打印服务端返回的数据(调试用)

            alert(result.userId);

        },
        error : function() {
            alert("异常!");
        }
    });
}

java

@ResponseBody
@RequestMapping(value = "/jsonstr")
public User json(@RequestBody String json){//接收json字符串
    System.out.println("json:"+json);
    User user=new User();
    user.setUserId(5788);
    return user;
}

@ResponseBody
@RequestMapping(value = "/jsonobj")
public User json(@RequestBody User u){//接收数据对象
    System.out.println("json:"+u.getUserName()+"==u.add="+u.getAddress().getCity());
    User user=new User();
    user.setUserId(5788);
    return user;
}

 

@RequestHeader参数

直接获取header里面的参数值

public User json(@RequestBody User u,@RequestHeader("pwd") String pwd,@RequestHeader("Authorization") String Authorization){

//等价于 

 request.getHeader("pwd")

}

3.其他

1.jquery.ajax提交详解

web前端一般通过ajax与后端交互,核心方法是$.ajax(参数数组)

  function myajax() {
                var mydata={
                    id: 1,
                    name: 'jzk'
                };
                $.ajax({
                    /**
                     * url:默认当前页地址。发送请求的地址。提交到服务接口的url链接,可以直接带参数
                      **/
                    url: "/mvc/m" ,
                    /**
                     * type:默认值: "GET")。请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
                     */
                    type:"get",
                    /**
                     * dataType:
                     * 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。
                     * 在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:
                      最常用的是json,html,text三种类型
                     "xml": 返回 XML 文档,可用 jQuery 处理。
                     "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
                     "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
                     "json": 返回 JSON 数据 。
                     "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
                     "text": 返回纯文本字符串
                     */
                    dataType: "json",//预期服务器返回的数据类型
                    /**
                     * data:
                     * 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后

                     * data有三种展现形式:
                     * 1.javascript对象
                     * 如:{id:1,sex=2},系统能自动转化成url?id=1&sex=2   contentType: 'application/x-www-form-urlencoded'
                     * 2.字符串,如:id=1&sex=2,一般用$(#form表单ID).serialize()序列化form元素 contentType: 'application/x-www-form-urlencoded'
                     * 3.json字符串 如:"{id:1,sex=2}",一般用JSON.stringify(js的json对象)转化, contentType: 'application/json;charset=UTF-8'
                     */
                    data: mydata,
                    /**
                     * 类型:java对象或者String,发送信息至服务器时内容编码类型。

                     默认值: "application/x-www-form-urlencoded"。他会自动把data为javascript对象转化成url?id=&name=....适合简单的键值对

                     如果入参是复杂的json对象,则要使用:contentType: 'application/json;charset=UTF-8'传递
                     在data:就要用json字符串传递过去,使用JSON.stringify(java json对象)转化成字符串在传递
                     eg:
                     var p = {
           name: 'yuwen',
           score: [
              {'luo' : '100'},
              {'lei' : '98'}
              ]
       };
           $.ajax({
           type: "post",
           url: "/role/contentTypeTest",
           dataType: 'json',
           contentType: 'application/json;charset=UTF-8',
           data: JSON.stringify(p),
           error: function(request) {
              layer.alert('添加失败');
           },
           success: function(result) {
              layer.msg('保存成功');
           }
       });
                     */
                    contentType:"application/x-www-form-urlencoded",
                    /**
                     * 把数据放在header里面传递,和data数据格式一样
                     */
                    headers: //header里面传递数据
                        {
                            Authorization: '1234456',
                            pwd:'44333333'
                        },

                    success: function (result) {
                        /**
                         * data指服务器返回的数据
                         */
                        console.log(result);//打印服务端返回的数据(调试用)

                        alert(result.userId);

                    },
                    error:function(XMLHttpRequest, textStatus, errorThrown){
                        console.log("失败:"+getAjaxException(XMLHttpRequest.responseText));
                    }
                });

            }

2.http协议解析

HTTP简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP工作原理

HTTP三点注意事项:
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http属性

springboot2.x-SpringMVC详解

主体 参数说明
general
  1. Request URL:  //请求的英文名

    http://localhost:8080/mvc/m?id=1&name=jzk

  2. Request Method: //请求方法

    GET

  3. Status Code:

    200

  4. Remote Address:

    [::1]:8080

  5. Referrer Policy:

    no-referrer-when-downgrade

Response Headers

请求返回头

  1. Content-Type:  //请求返回的数据格式

    application/json;charset=UTF-8

  2. Date:

    Sat, 12 Dec 2020 02:07:19 GMT

  3. Transfer-Encoding:

    chunked

Requesr Header

请求头

  1. Accept://客户端可识别的内容类型列表。

    application/json, text/javascript, */*; q=0.01

  2. Accept-Encoding:

    gzip, deflate, br

  3. Accept-Language:

    zh-CN,zh;q=0.9

  4. Authorization:  //header里自定义的数据

    1234456

  5. Cache-Control:

    no-cache

  6. Connection:

    keep-alive

  7. Content-Length:

    13

  8. Content-Type: //内容类型

    application/x-www-form-urlencoded; charset=UTF-8

  9. Host: //服务器

    localhost:8080

  10. Origin: //域名+端口

    http://localhost:8080

  11. Pragma:

    no-cache

  12. pwd:   //header里自定义的数据

    44333333

  13. Referer:  //请求页面的URL

    http://localhost:8080/mvc/index?ss=22

  14. User-Agent: //浏览器信息

    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36

  15. X-Requested-With:

    XMLHttpRequest

Form data

表单数据

  1. id:

    1

  2. name:

    jzk

3.java vo对象和json转化的特殊处理

(1)日期类型格式化输出

属性文件里配置默认的

#json日期输出格式化默认值
spring.jackson.date-format= yyyy-MM-dd
spring.jackson.time-zone= GMT+8

     如果有时间要求,则在vo的属性文件里配置

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

eg:

public class User1 {
    private Integer userId;
    private String userName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date birth;

}

(2)日期类型输入

属性文件里配置默认的

  spring.mvc.date-format = yyyy-MM-dd

有日期时间需求的在vo属性文件加,@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

public class User1 {
    private Integer userId;
    private String userName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date birth;

 

 

(3)null字符串处理

对象里的null属性统一转化成"",避免前端去判断null再处理

package com.jyj;
import java.io.IOException;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
 * null返回空字符串
 * @author 戴旌旗
 *
 */
@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
        serializerProvider.setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

 

本文地址:https://blog.csdn.net/weixin_41158378/article/details/111055072

相关标签: springboot