一、处理器方法返回值为List数组
项目结构
1.在上文原有基础上修改MyController类
package com.it.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.it.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@Controller
public class MyController {
// 处理器方法返回String--表示逻辑视图名称,需要配置视图解析器
@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";
}
//处理器方法返回String,表示完整视图路径,此时不能配置视图解析器
@RequestMapping(value = "/returnString-view2.do")
public String doReturnView2(HttpServletRequest request, String name, Integer age){
//手动添加数据到request作用域
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//完整视图路径,项目中不能配置视图解析器
return "/WEB-INF/view/show.jsp";
}
//处理器方法返回void,响应ajax请求
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnVoidAjax(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);
}
//输出数据,响应ajax请求
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out=response.getWriter();
out.println(json);
out.flush();
out.close();
}
//处理器方法返回一个Student,通过框架转为json,响应ajax请求
/**
* @ResponseBody:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
* 位置:方法的定义上面。和其它注解不区分先后顺序
*
* 返回对象框架的处理流程:
*1.框架会返回Student类型,调用框架中的ArrayList<HttpMessageConverter>中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据。--MappingJackson2HttpMessageConverter
*
* 2.框架会调用现类的write(),MappingJackson2HttpMessageConverter的write()方法
* 把李四同学的student对象转为json,调用Jackson的ObjectMapping实现转为json
* contentType:application/json;charset=utf-8
*
* 3.框架会调用 @ResponseBody把2步骤的结果数据输出到浏览器,ajax请求处理完成
*/
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student doStudnetJsonObject(String name,Integer age){
//调用service,获取请求结果的数据,Student对象表示结果数据
Student student=new Student();
student.setName("小明");
student.setAge(20);
return student;//会被框架转为json
}
@RequestMapping(value = "/returnStudentJsonArray.do")
@ResponseBody
public List<Student> doStudnetJsonObjectArray(String name,Integer age){
List<Student> list=new ArrayList<>();
//调用service,获取请求结果的数据,Student对象表示结果数据
Student student=new Student();
student.setName("小明");
student.setAge(20);
list.add(student);
student=new Student();
student.setName("张山");
student.setAge(20);
list.add(student);
return list;//会被框架转为json
}
}
2..在上文原有基础上修改index.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("#btn2").click(function () {
// alert("按钮单击了")
$.ajax({
url:"returnStudentJsonArray.do",
type:"post",
success:function (resp) {
//resp从服务器端返回的是json格式的字符串{"name":"张山","age":22}
//jquery会把字符串转为json对象,赋值给resp形参
//[{"name":"小明","age":20},{"name":"张山","age":20}]
//alert(resp.name+" "+resp.age);因为是数组,所以需要循环遍历
$.each(resp,function (i,n) {
alert(n.name+" "+n.age)
})
}
})
})
})
</script>
</head>
<body>
<h2>处理器方法的返回值</h2>
<p>处理器方法返回String,表示视图名称</p>
<form action="returnString-view.do" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交参数"/>
</form>
<p>处理器方法返回String,表示视图完整路径</p>
<form action="returnString-view2.do" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交参数"/>
</form>
<br>
<p>处理器方法的返回值为void</p>
<button id="btn">发起ajax请求</button>
<br>
<p>处理器方法的返回值为Student对象</p>
<button id="btn1">发起ajax请求</button>
<br>
<p>处理器方法的返回值为List数组</p>
<button id="btn2">发起ajax请求</button>
</body>
</html>
3.其他文件保持不变
项目结果
点击发起ajax请求,循环遍历数组中的数据
二、处理器方法的返回值为String数据
若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但是
返 回 的 字 符 串 中 带 有 中 文 字 符 , 则 接 收 方 页 面 将 会 出 现 乱 码 。 此 时 需 要 使 用
@RequestMapping
的
produces
属性指定字符集。
produces
,产品,结果,即该属性用于设置输出结果类型。
index.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("#btn3").click(function () {
// alert("按钮单击了")
$.ajax({
url:"returnStringData.do",
type:"post",
success:function (resp) {
//resp从服务器端返回的是json格式的字符串{"name":"张山","age":22}
//jquery会把字符串转为json对象,赋值给resp形参
//[{"name":"小明","age":20},{"name":"张山","age":20}]
//alert(resp.name+" "+resp.age);因为是数组,所以需要循环遍历
// $.each(resp,function (i,n) {
// alert(n.name+" "+n.age)
// })
alert("返回的是文本数据:"+resp)
}
})
})
})
</script>
</head>
<body>
<h2>处理器方法的返回值</h2>
<p>处理器方法返回String,表示视图名称</p>
<form action="returnString-view.do" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交参数"/>
</form>
<p>处理器方法返回String,表示视图完整路径</p>
<form action="returnString-view2.do" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交参数"/>
</form>
<br>
<p>处理器方法的返回值为void</p>
<button id="btn">发起ajax请求</button>
<br>
<p>处理器方法的返回值为Student对象</p>
<button id="btn1">发起ajax请求</button>
<br>
<p>处理器方法的返回值为List数组</p>
<button id="btn2">发起ajax请求</button>
<br>
<p>处理器方法的返回值为String数据</p>
<button id="btn3">发起ajax请求</button>
</body>
</html>
MyController类
package com.it.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.it.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@Controller
public class MyController {
// 处理器方法返回String--表示逻辑视图名称,需要配置视图解析器
@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";
}
//处理器方法返回String,表示完整视图路径,此时不能配置视图解析器
@RequestMapping(value = "/returnString-view2.do")
public String doReturnView2(HttpServletRequest request, String name, Integer age){
//手动添加数据到request作用域
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//完整视图路径,项目中不能配置视图解析器
return "/WEB-INF/view/show.jsp";
}
//处理器方法返回void,响应ajax请求
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnVoidAjax(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);
}
//输出数据,响应ajax请求
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out=response.getWriter();
out.println(json);
out.flush();
out.close();
}
//处理器方法返回一个Student,通过框架转为json,响应ajax请求
/**
* @ResponseBody:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
* 位置:方法的定义上面。和其它注解不区分先后顺序
*
* 返回对象框架的处理流程:
*1.框架会返回Student类型,调用框架中的ArrayList<HttpMessageConverter>中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据。--MappingJackson2HttpMessageConverter
*
* 2.框架会调用现类的write(),MappingJackson2HttpMessageConverter的write()方法
* 把李四同学的student对象转为json,调用Jackson的ObjectMapping实现转为json
* contentType:application/json;charset=utf-8
*
* 3.框架会调用 @ResponseBody把2步骤的结果数据输出到浏览器,ajax请求处理完成
*/
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student doStudnetJsonObject(String name,Integer age){
//调用service,获取请求结果的数据,Student对象表示结果数据
Student student=new Student();
student.setName("小明");
student.setAge(20);
return student;//会被框架转为json
}
@RequestMapping(value = "/returnStudentJsonArray.do")
@ResponseBody
public List<Student> doStudnetJsonObjectArray(String name,Integer age){
List<Student> list=new ArrayList<>();
//调用service,获取请求结果的数据,Student对象表示结果数据
Student student=new Student();
student.setName("小明");
student.setAge(20);
list.add(student);
student=new Student();
student.setName("张山");
student.setAge(20);
list.add(student);
return list;//会被框架转为json
}
/**
* 处理器方法返回的是String,String表示数据的,不是视图。
* 区分返回值String是数据还是视图,看有没有@ResponseBody注解
* 如果有@ResponseBody注解,返回String就是数据,反之就是视图。
*/
@ResponseBody
@RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8")
public String doStringData(String name,Integer age){
return "Hello springmvc 返回对象,表示数据";
}
}
点击发起请求
响应头的Context-Type是在@RequestMapping中的produces属性定义的,text/plain;charset=utf-8;
如果不定义响应类型,输出为的中文字符全部为?,不能正确的显示出来。