Home Tags Posts tagged with "@RequestBody"

@RequestBody

今天在进行开发的时候,发现Controller 里面 的方法参数 可以用 @ModelAttribute 修饰

之前用过 @RequestBody、@RequetParam、@PathVariable 注解修饰 参数@ModelAttribute 还是头一次见到,特此补充

 

@ModelAttribute的用法大概有两种:

一种是直接标记在方法上,

一种是标记在方法的参数中,

两种标记的方法产生效果也各不相同

一、直接标记在方法上

注:用@ModelAttribute 修饰的方法会先于请求的方法执行!!!

@Controller
@RequestMapping(value=”model”)
public class ModelAttributeTest {

@ModelAttribute
public void init()
{
System.out.println(“最先执行的方法”);
}

@ModelAttribute
public void init02()
{
System.out.println(“最先执行的方法02”);
}

@RequestMapping(value=”modelTest.do”)
public String modelTest()
{
System.out.println(“然后执行的方法”);
return “modelTest”;
}

@ModelAttribute
public void init03()
{
System.out.println(“最先执行的方法03”);
}
}

 

部署后运行,点击页面测试按钮,查看控制台输出,这个时候你会发现,后台控制器并没有直接进入modelTest.do的路径,而是先执行了被@ModelAttribute标记的init方法。应该这么理解,当同一个controller中有任意一个方法被@ModelAttribute注解标记,页面请求只要进入这个控制器,不管请求那个方法,均会先执行被@ModelAttribute标记的方法,所以我们可以用@ModelAttribute注解的方法做一些初始化操作。当同一个controller中有多个方法被@ModelAttribute注解标记,所有被@ModelAttribute标记的方法均会被执行,按先后顺序执行,然后再进入请求的方法。

 

当@RequestMapping标记和@ModelAttribute同时标记在一个方法上

点击测试页面,会发现当两个注解同时注解到一个方法上时,方法的返回值会变成model模型的返回值,key是标记的名

 

 

二.@ModelAttribute标记在参数前

 

@Controller
@RequestMapping(value=”model”)
public class ModelAttributeTest {

@RequestMapping(value=”modelTest.do”)
public String modelTest(@ModelAttribute(“pojo”) PojoTest pojo)
{
try {
pojo.setUserName(new String(pojo.getUserName().getBytes(“iso-8859-1″),”utf-8”));
pojo.setSex(new String(pojo.getSex().getBytes(“iso-8859-1″),”utf-8”));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(pojo);
return “modelTest”;
}

}

点击页面测试,页面文本框会显示URL地址传递过来的参数,因为SpringMVC会自动匹匹配页面传递过来的参数的name属性和后台控制器中的方法中的参数名,如果参数名相同,会自动匹配,如果控制器中方法是封装的bean,会自动匹配bean中的属性,其实这种取值方式不需要用@ModelAttribute注解,只要满足匹配要求,也能拿得到值

@RequestBody

作用:

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

ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  •     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 必须;
  •     multipart/form-data, 不能处理;
  •     其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

0 63

转载;由于与前端交互的过程当中,都是用json数据与前端进行交互,这样想取出整个传送过来的json数据的时候,就需要用到@RequestBody这个注解,前端发送数据的格式如下:

//测试发送json数据
$(“#id”).click(function () {
$.ajax({
type: “post”,
url: “test”,
contentType: “application/json; charset=utf-8”,
data: JSON.stringify(getTestJson()),
dataType: “json”,
success: function (data) {
alert(data);
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});

function getTestJson() {
var Json = {
“a”:”aaaaaaa”,
“b”:0,
“c”:2,
};
return Json;
}

});

前台的AJAX这样去写,这样传输数据,那么后台就可以拿到完整的数据了,具体怎么拿看如下代码:
@RequestMapping(value = “/test”,method = RequestMethod.POST)
@ResponseBody
public String test(@RequestBody String requestJson){
if(requestJson==null||requestJson==””){
return ApiResponse.buildFailResponse(ResultConstant.OPERATOR_FAIL,”请求接口需要传递正确的JSON数据”);
}
}
这样,加上一个@RequestBody注解,就可以轻松的把请求过来的json数据全部拿到,然后就随便你把json数据是转成
JSONObject还是普通的JAVA对象进行操作了。
但是,我们在传输json数据的时候,假如json数据为空,那么就会报一个错误,就是Required request body is missing
这个的意思就是我们这个接口必须要传输json格式的数据,假如没有数据,就会报错返回错误的信息。
但是,我们一般想做的样子是我们由自己去判断数据是否为空,假如为空,返回我们与前端约定格式的数据,那样会
方便前端来进行调试。
假如不想让系统报错,那么就需要在@RequestBody增加一个Required属性了,并且把该属性设置为false,如下:
@RequestMapping(value = “/test”,method = RequestMethod.POST)
@ResponseBody
public String test(@RequestBody(required = false) String requestJson){
if(requestJson==null||requestJson==””){
return ApiResponse.buildFailResponse(ResultConstant.OPERATOR_FAIL,”请求接口需要传递正确的JSON数据”);
}
}

————————————————
版权声明:本文为CSDN博主「梦里梦不出梦里梦的梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38455201/article/details/78952511