springboot2.x(四)-SpringMVC详解

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属性

主体参数说明
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;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值