文章目录
-
- 描述
- 处理器返回值的类型
-
- 1. `ModelAndView`返回数据和视图
- 2. `String`返回逻辑视图
-
- `String`返回可以设置请求转发和重定向
-
- 2.1 `String`返回值,通过`forward `请求转发
- 2.2 `String`返回值,通过`redirect `重定向
- 3. `void`返回值,不返回【springmvc不推荐使用】
- 4. `json`返回值为json数据,`fastjson`使用【****】
-
- `@ResponseBody`和`@RequestBody`
- 4.1 环境准备(依赖)
- 4.2 基础测试`fastjson`
-
- 4.2.1 测试javabean对象转json数据格式
- 4.2.2 测试json数据格式转javabean对象
- 4.3 `@ResponseBody`注解
- 4.4 `@RequestBody`注解
描述
我们知道,浏览器向服务器发起请求,携带数据,请求将其交给后台Controller
等处理,处理完成之后,我们需要将处理结果和页面等内容返回到浏览器,但是这过程是怎么做到的呢,这篇文章描述的是后台向前台页面传输数据的方法。
处理器返回值的类型
1. ModelAndView
返回数据和视图
ModelAndView
是SPringMVC提供模型视图,在前后端不分离的情况下,这种用法是最多的,但是前后端分离后,以json
数据格式为主。
ModelAndView
可以拆分理解,Model就是数据模型,View就是页面视图,就是同时包含模型和视图。
主要使用方法:
- 通过
addObject(key,value)
设置数据,返回给前台 - 通过
setViewName()
设置逻辑视图,就是需要跳转返回到的页面路径(在SpringMVC中配合视图解析器使用【视图解析器自动加前后缀】,只要写名称就行)
@Controller
public class ReturnValueController {
//public 返回值类型 方法名(参数类型 参数名){}
//通过path访问当前方法,且请求方式为get/post方式
@RequestMapping(path="ModelAndView.action",method = { RequestMethod.POST,RequestMethod.GET})
public ModelAndView testModelAndView(){ //
User user= new Person(null,"striveday","123456");
//使用ModelAndView实现请求转发
ModelAndView mv = new ModelAndView();
mv.addObject("user",user);
mv.setViewName("ModelAndView");//视图解析器配置:前缀+逻辑视图名+后缀
return mv;
}
}
逻辑视图和物理视图概念:
物理视图 :是指真正的文件路径地址,在这里就是前缀+逻辑视图+后缀( /WEB-INF/jsp/ModelAndView.jsp)
逻辑视图: 页面的名称叫逻辑视图,并不是真正的页面地址,但是可以由视图解析器进行拼接,得到真正的页面地址,即物理视图。
物理视图 = 前缀+逻辑视图+后缀
2. String
返回逻辑视图
返回页面名称,也就是需要返回的页面路径(逻辑名)。
用这种方式也是可以进行携带数据(Model)
Model可以用来向页面传递参数,通过在方法参数上注入Model
,来实现携带数据。
model.addAttribute(“key”, value);
案例:
@RequestMapping(path="testString.action",method = { RequestMethod.GET,RequestMethod.POST})
public String testString(Model model){
//Model 可以设置数据,自动由视图解析器带到页面
model.addAttribute("data","String返回值");
return "StringSuccess"; //逻辑视图 文件名
}
- 在Spring MVC框架中,控制器类中处理方法的return语句默认就是请求转发实现,实现的是转发到视图。
- ModelAndView这些都是通过请求转发实现的。
String
返回可以设置请求转发和重定向
forward:
指令,用于请求转发
redirect :
指令,用于重定向
forward 指令:后面接物理视图
redirect 指令:后面接项目访问路径+物理视图
【注意1***】forward:
指令和redirect :
指令,视图解析器是不对指令后面的内容拼接前缀和后缀的
【注意2】指令也可以访问控制器方法
2.1 String
返回值,通过forward
请求转发
@RequestMapping(path="testForward .action",method = { RequestMethod.GET,RequestMethod.POST})
public String testForward (Model model){
//Model 可以设置数据,自动由视图解析器带到页面
model.addAttribute("data","wHelloWord");
return "forward:/WEB-INF/jsp/success.jsp"; //
}
2.2 String
返回值,通过redirect
重定向
重定向是不能访问WEB-INF
@RequestMapping(path="testRedirect.action",method = { RequestMethod.GET,RequestMethod.POST})
public String testRedirect(Model model){
//Model 可以设置数据,自动由视图解析器带到页面
model.addAttribute("data","wHelloWord");
//return "redirect:http://www.taobao.com"; //访问淘宝
//return "redirect:success.jsp"; //重定向访问
return "redirect:testForward .action"; //访问上面那个重定向方法,指令可以访问控制器方法
}
3. void
返回值,不返回【springmvc不推荐使用】
void
返回值,进行页面跳转就是用以前的请求转发和重定向。只是以前重定向无法传输数据,现在可以通过Model
来进行数据传输。关于请求转发实现可以看这个:请求转发和重定向代码实现
@RequestMapping(path="testVoid.action",method = { RequestMethod.GET,RequestMethod.POST})
public void testVoid(HttpServletRequest req, HttpServletResponse resp)throws Exception{
//请求转发
req.setAttribute("name","请求转发");
req.getRequestDispatcher("testVoid.jsp").forward(req,resp);
//response.sendRedirect(request.getContextPath()+"/testVoid.jsp");//重定向
}
4. json
返回值为json数据,fastjson
使用【****】
现在都要求前后端分离,而前后端分离的关键是使用ajax
请求,那么ajax
请求基本都用json
进行数据传递。
SpringMVC默认使用Jackson
进行数据转换,这个我前面有写过,想了解的看这个:
===》 Jackson使用,json数据转换。
好了,不打广告了哈哈哈,我们今天用的不是自带的Jackson
哦,所以好好看吧。
今天介绍的是阿里巴巴的fastjson
,进行数据与json数据格式之间的转换。
=============== 分隔线 =====》》》》》》》》》
接下来对的是重点!!!
这里有两个很重要的注解:@ResponseBody
和@RequestBody
。
在fastjson
中我们需要用到这两个注解
@ResponseBody
和@RequestBody
@ResponseBody
注解,用于方法返回值转json数据格式注解加在方法上,SpringMVC可以【自动地】将方法的返回对象转为json数据,发送给页面进行展示。
看关键字自动的
,敲黑板,很重要,这就是我们使用它的原因,毕竟,谁喜欢写代码弄来弄去还有bug呢,自动完成,赞!
@RequestBody
注解,用于方法参数转json数据格式在方法形参的前边加上
@RequestBody
注解,该注解可以自动解析页面发送过来的json
格式数据,解析完之后,自动的将json中的数据封装到方法形参对象里面(set方法)。
好了来实战吧
4.1 环境准备(依赖)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
4.2 基础测试fastjson
拿别人的东西总要先测试测试吧,万一有bug呢,虽然这是阿里巴巴的并且有贼多人使用,但是养成这个习惯,准没错!【学会没嘿嘿】
先创建一个小对象(我也想)
public class Person {
private int id;
private String username;
private String password;
//省略set/get方法,但是需要有
}
创建测试类,测试javabean转json和json转javabean
4.2.1 测试javabean对象转json数据格式
JSON.toJSONString(javabean对象)
:实现将javabean对象转json数据格式。
import com.alibaba.fastjson.JSON;
public class TestFastJson {
@Test
public void test01(){
Person p = new Person(1,"striveday","GF123456");
String json = JSON.toJSONString(p);//调用静态方法toJSONString,参数传入对象 ,将对象转成json
System.out.println(json);
}
}
运行结果:
{“id”:1,“password”:“GF123456”,“username”:“striveday”}
转换成功!
4.2.2 测试json数据格式转javabean对象
JSON.parseObject(json数据, javabean的class)
:实现将json数据格式转换为javabean对象。
@Test
public void test02(){
String json = "{\"id\":1,\"password\":\"GF123456\",\"username\":\"striveday\"}";//copy刚刚运行结果哈
//json转javaBean,参1:json 参2:对象class类
Person p = JSON.parseObject(json,Person.class);
System.out.println(p);
}
运行结果
Person{id=1, username=‘striveday’, password=‘GF123456’, city=‘null’, birthday=null, birthday2=null}
这里需要重写javabean的toString()方法,不然输出的是哈希值哟。
好的,妥妥的没问题,测一下也不花多少时间嘛,这个习惯总时好的!
4.3 @ResponseBody
注解
@ResponseBody
注解用于方法返回值转json数据格式
该注解加在方法上,SpringMVC可以【自动地】将方法的返回对象转为json数据,发送给页面进行展示。
@ResponseBody
注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定要求格式后,写入到Response对象的body数据区。(一般是json、xml等数据格式)
@RequestMapping(path = "testResponseBody.action",method = { RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Object testResponseBody(){
Person p1 = new Person(1,"striveday","GF123456");
Person p2 = new Person(2,"studyday","GF123456");
List<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);
return list; //springmvc自动地将list使用ObjectMapper转成json
}
4.4 @RequestBody
注解
@RequestBody
注解,用于方法参数转json数据格式。
在方法形参的前边加上@RequestBody
注解,该注解可以自动解析页面发送过来的json
格式数据,解析完之后,自动的将json中的数据封装到方法形参对象里面(set方法)
其实
@RequestBody
注解就是读取request请求中的body数据,然后使用系统默认配置的HttpMessageConverter
进行解析,再把相应的数据绑定到请求作用域中传递给后台controller方法,然后参数自动绑定到Controller方法的参数上(实现方法返回值对象转json数据格式,所以页面name值和controller形式参数名称要相同)
@RequestMapping(path = "testRequestBody.action",method = { RequestMethod.POST,RequestMethod.GET})
public ModelAndView testRequestBody(@RequestBody Person person){ //
System.out.println("object:"+person);
return null;
}