文章目录
返回值是 ModelAndView
有数据和视图,对视图执行forward ,处理器方法处理完,需要跳转到其他资源,且又要在跳转的资源传递数据
例:
@RequestMapping(value = "/receiceobject.do")
public ModelAndView doSome1(Student myStudent){
ModelAndView mv=new ModelAndView();
mv.addObject("myname",myStudent.getName());
mv.addObject("myage",myStudent.getAge());
mv.addObject("myStudent",myStudent);
mv.setViewName("show");
//返回mv
return mv;
}
返回值是 String(表示视图)
表示视图,可以逻辑名称,也可以是完整视图路径,这个就是返回View部分,可以使用视图解析器,访问路径拼接
例:
@RequestMapping(value = "/returnString-view.do")
public String doReturnView(HttpServletRequest request,String name, Integer age){
//可以手动添加数据到request作用域
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//show : 逻辑视图名称,项目中配置了视图解析器
//框架对视图执行forward转发操作
return "show";
}
返回值是 Void
不能表示数据,也不能表示视图
在处理ajax的时候,可以使用void返回值。 通过HttpServletResponse输出数据,响应ajax请求。
ajax请求服务器端返回的就是数据,和视图无关。
处理器代码:
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnView(HttpServletResponse response, String name, Integer age) throws IOException {
//处理ajax,使用json做数据的格式
//service调用完成了,使用Student表示处理结果
Student student =new Student();
student.setName(name);
student.setAge(age);
String json="";
//把结果的对象转为json格式的数据
if(student!=null){
ObjectMapper om=new ObjectMapper();
json=om.writeValueAsString(student);
System.out.println("student转换的json==="+json);
}
//输出数据,响应ajax的请求
response.setContentType("application/json;charset=utf-8");
PrintWriter pw=response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
网页代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jQuery3.6.0.js"></script>
<script type="text/javascript">
$(function(){
$("button").click(function(){
//alert("button click")
$.ajax({
url:"returnVoid-ajax.do",
data:{
name:"zhangsan",
age:20
},
type:"post",
dataType:"json",
success:function(resp){
//resp从服务器端返回的是json格式的字符串{"name:"+"zhangsan","age"+20}
//jquery会把字符串转为json对象,赋值给resp形参
alert(resp.name+" "+resp.age)
}
})
})
})
</script>
</head>
<body>
<p>处理器方法返回String表示视图名称</p>
<form action="test/returnString-view.do" method="post">
姓名:<input type="text" name="name"> <br/>
年龄:<input type="text" name="age"> <br/>
<input type="submit" value="提交参数">
</form>
<br>
<button id="btn">发起ajax请求</button>
</body>
</html>
现在做ajax,主要使用json格式,主要步骤:
1.加入处理json的工具库的依赖,springmvc默认使用的jackson
<!--Jackson依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2.在springmvc配置文件之间加入注解驱动<mvc:annotation-driven />
等同于 json=om.writeValuesAsString(student);
注意:注解驱动有重名的 选择后缀是mvc的
3.在处理器方法的上面加入@ResponseBody注解
@ResponseBody
放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求
等同于
//response.setContextType("application/json;charset=utf-8");
PrintWriter pw=response.getWriter();
pw.println(json);
返回值是Object
对象有属性,属性就是数据,所以返回Object表示数据,和视图无关
可以使用对象表示数据,响应ajax请求
springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理:
1.<mvc:annotation-driven />
注解驱动
注解驱动实现的功能是 完成java对象到json,xml,text,二进制等数据格式的转换
<mvc:annotation-driven />
在加入到springmvc配置文件后,会自动创建HttpMessageConveter接口的7个实现类对象,其中MappingJackson2HMappingttpMessageConverter,使用jackson工具库中的ObjectMapper实现java对象转为json
HttpMessageConveter 接口:消息转换器
功能:定义了java转为json,xml等数据格式的方法
2.@ResponseBody注解
放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求的
作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
****和其他注解没有顺序关系
返回对象的处理流程:
1.框架会把返回Student类型,调用框架中的ArrayList<HttpMessageConverter>
中每个类的canWrite()方法,检查每个HttpMessageConverter接口的实现类能处理Student类型的数据–MappingJackson2HMappingttpMessageConverter
2.框架会调用实现类的write(),MappingJackson2HMappingttpMessageConverter的write()方法
把student对象转为json,调用jackson的ObjectMapper实现类转为json
3.框架会调用@ResponseBody把 2 的结果数据输出到浏览器,ajax请求处理完成
处理器代码:
/*
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
* */
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student doStudentJsonObject(String name, Integer age) {
//调用service,获取请求结果数据,Student对象表示结果数据
Student student =new Student();
student.setName("李四同学");
student.setAge(20);
return student;
}
网页代码:
<script type="text/javascript">
$(function(){
$("button").click(function(){
//alert("button click")
$.ajax({
url:"returnStudentJson.do",
data:{
name:"zhangsan",
age:20
},
type:"post",
dataType:"json",
success:function(resp){
//alert(resp)
//resp从服务器端返回的是json格式的字符串{"name:"+"zhangsan","age"+20}
//jquery会把字符串转为json对象,赋值给resp形参
alert(resp.name+" "+resp.age)
}
})
})
})
</script>
返回值是String(表示数据的)
区分返回值String是数据,还是视图,看有没有@ResponseBody注解
如果有@ResponseBody注解,返回String就是数据,反之就是视图
处理器代码:
@RequestMapping(value = "/returnStringData.do" , produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
return "hello springmvc 返回对象,表示数据";
}
响应结果中文乱码
在@RequestMapping中加入produces = "text/plain;charset=utf-8"
@RequestMapping(value = "/returnStringData.do" , produces = "text/plain;charset=utf-8")