springboot2.x-SpringMVC详解
StringMVC是编写java接口的基础,承担接收和反馈数据的作用,本文主要对入参和出参进行详细解释
一、类声明注解
@Controller @ResponseBody @RequestMapping("/mvc") public class HelloCtrol {
}
@Controller | 声明这是控制类,如果没有@ResponseBody,表示说类卢有方法的返回都是页面路径 |
@ResponseBody | 声明在这个类里所有方法返回的数据都将转化成json对象,@Controller+@ResponseBody=@RestController |
@RequestMapping | 这个类的所有方法对用@RequestMapping映射路径都要加上这个路径前缀 |
二、类方法注解
1.方法上注解
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 |
|
Response Headers 请求返回头 |
|
Requesr Header 请求头 |
|
Form data 表单数据 |
|
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