处理器方法的返回值
使用@Controller注解的处理器的处理器方法,其返回值常用的有四种类型
第一种:ModelAndView :有数据和视图,对视图执行forward。
第二种:String :表示视图,可以逻辑名称,也可以是完整视图路径
第三种:无返回值void :不能表示数据,也不能表示视图
在处理Ajax的时候,可以使用void返回值。通过HttpServletResponse输出数据。响应ajax请求。
ajax请求服务器端返回的就是数据,和视图无关。
第四种:返回自定义类型对象 :代表的是数据,例如String,Integer,Map,List,Student等都是对象
对象有属性,属性就是数据。所以返回Object表示数据,和视图无关
可以使用对象表示的数据,响应ajax请求
根据不同的情况,使用不同的返回值
返回值ModeAndView
上面已写
返回值String
地址出现重复 和视图解析器
controller.java
/*
* 处理器方法返回Stirng---表示逻辑视图名称,需要配置视图解析器
*
* */
@RequestMapping(value = "/returnString-view.do")
public String doReturnView(HttpServletRequest request,String name,Integer age){
System.out.println("doReturnView,name="+name+" +age"+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){
System.out.println("doReturnView,name="+name+" +age"+age);
//可以自己手工添加数据到request作用域
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//show:逻辑视图名称,项目中配置了视图解析器
//框架对视图执行forward转发操作
return "/WEB-INF/View/show.jsp";
}
jsp
<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>
返回值void
ajax
controller.java
/*
*
- returnVoid-ajax.do
* 处理器方法返回Void响应ajax请求
* 手工实现ajax,json数据,到吗有重复的 1.java对象转为json;2.同学HttpServletResponse输出json数据
* */
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnVoidAjax(HttpServletResponse response,String name,Integer age) throws IOException {
System.out.println("doReturnView,name="+name+" +age"+age);
//处理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();
}
返回对象Object
做ajax,主要使用json的数据格式。实现步骤:
1.再加入json的工具库的依赖,springmvc默认使用的jackson。
2.在springmvc配置文件之间加入<mvc:annotation-driven>注解驱动。
json=om.writeValueAsString(student);
3.在处理器方法的而上面加入@ResponseBody注解
response.setContentType(“application/json;charset=utf-8”);
PrintWriter pw = response.getWriter();
pw.println(json);
springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理
1.mvc:annotation-driven注解驱动。
注解驱动实现的功能是 完成Java对象到json、xml、text,二进制等数据格式的转换。
在加入到springmvc配置文件后,会自动创建HttpMessageConverter接口
的7个实现类,包括MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java)
HttpMessageConverter接口:消息转换器。
功能定义了java转为json,xml等数据格式的方法。这个接口有很多实现类。
现在做ajax,主要使用json的数据格式,
实现步骤:
1.加入处理json的工具库的依赖,springmvc默认使用jackson。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2.在springmvc配置文件之间加入
<mvc:annotation-driven>
注解驱动。
json = om.writeValueAsString(student);
3.在处理器方法的上面加入@ResponseBody注解
//输出数据,响应ajax的请求
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的
内部原理
1.mvc:annotation-driven注解驱动。
注解驱动实现的功能是 完成java对象到json.xml.text,二进制等数据格式的转换。
HttpMessageConvetor接口:消息转换器 。
mvc:annotation-driven在加入到springmvc配置文件后,会自动创建HttpMessageConvetor接口的七个实现类对象。
包括 MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java对象转换为jason对象)
功能:定义了java对象转为json、xml等数据格式方法,这个接口有很多的实现类。
这些实现类完成java对象到json、,java对象 到xml,java对象到到二进制数据的转换
下面的两个方法是控制器 类把结果输出给浏览器时使用的:
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
1)canwrite作用检查处理器的返回值,能不能转为var2表示的数据格式。
检查student(lisi,20)能不能转为var2表示的数据格式。如果能转换为json,canWriter返回true
MediaType:表示数格式的 例如json、xml等等
2)write:把处理器方法的返回值对象,调用jackson中的ObjectMapper转为json字符串。
json = om.writeValueAsString(student);
2.@ResponseBody注解
放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求的。
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
/*
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
* @ResponseBody:
* 作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器。
* 位置:方法的定义上面。和其他注解没有顺序关系。
* 返回对象框架的处理流程:
* 1.框架会把返回值Student类型,调用框架的中ArrayList中每个类 conWrite()方法
* 检查那个HttpMessageConvertor接口的实现类能处理Student类型的数据–MappingJackson2HttpMessageConvertor
*
* 2.框架会调用实现类的write(),MappingJackson2HttpMessageConvertor的write()方法
* 把李四同学的饿student对象转为json,调用 Jackson的ObjectMappr实现转为json
* Content-Type: application/json;charset=utf-8
*
3.框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成
*/
@RequestMapping(value = "/doStudent.do")
@ResponseBody
public Student doSome(HttpServletResponse response,String name,Integer age) throws IOException {
Student student = new Student();
student.setName("李四同学");
student.setAge(20);
return student;
}
}
jsp
返回值List是JsonArray
<script type="text/javascript">
$(function (){
$("button").click(function (){
// alert("button click")
$.ajax({
url: "doStudentJsonArray.do",
data:{
name:"zhangsan",
age:20
},
type:"post",
dataType:"json",
success:function(resp){
//resp返回的是json格式的字符串
//jquery会把字符串转为json对象,赋值给resp形参
// alert(resp.name+" "+resp.age);
$.each(resp,function (i,n){
alert(n.name+""+n.age)
})
}
} )
})
})
</script>
返回值是String是文本数据
处理器方法返回的是String,String表示数据的,不是视图。
区分返回值String是数据,还是视图,看看有没有@ResponseBody注解
如果有@ResponseBody注解,返回String就是数据,反之就是视图
@RequestMapping("/returnStringData.do")
@ResponseBody
public String doStringData(String name,Integer age){
return "Hello SpringMVC返回对象表示数据";
}
text/plain;charset=ISO-8859-1
默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码
解决方案:给ReqeustMapping增加一个属性produces,使用这个属性指定新的contentType
@RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
return "Hello SpringMVC返回对象表示数据";
}
编码方式:text/plain;charset=utf-8
处理过程
- 1.框架会把返回值String类型,调用框架的中ArrayList中每个类 conWrite()方法*
- 检查那个HttpMessageConvertor接口的实现类能处理String类型的数据–StringHttpMessageConvertor**
- 2.框架会调用实现类的write(),StringHttpMessageConvertor的write()方法*
- 把字符串按照指定的编码来处理* Content-Type: text/plain;charset=utf-8*
- 3.框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成* */
解读url-pattern
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<!--
使用框架的时候,url-pattern可以使用两种值
1.使用扩展名方式,语法 *.xxxx,xxxx是自定义的扩展名。常用的方式 *.do,*.action,*.mvc等等
http://localhost:8080/myweb/some.do
http://localhost:8080/myweb/other.do
2.使用“/”
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
.do 结尾的会返回给中央处理器myweb处理