目录
1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)
1.5 返回值类型:String(这里的String是数据)
1. 控制器controller方法的返回值
使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
第一种:ModelAndView
第二种:String
第三种:无返回值 void
第四种:返回自定义类型对象
1.1 返回值类型:ModelAndView
若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。当然,若要返回ModelAndView,则处理器方法中需要定义 ModelAndView 对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的 Ajax 异步响应),此时若返回ModelAndView,则将总是有一部分多余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。
代码部分在上一篇有详细的说明:https://blog.csdn.net/liuhaiyang98/article/details/119654927
1.2 返回值类型:String
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。
返回内部资源逻辑视图名:若要跳转的资源为内部资源,则视图解析器可以使用InternalRes
ourceViewResolver 内部资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后的部分。这个字符串与视图解析器中的 prefix、suffix 相结合,即可形成要访问的 URI。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liuhaiyang.damain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
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 {
//项目在不能配置视图解析器
@RequestMapping(value = "/return-string-view.do")
public String doreturnStringView2(HttpServletRequest req, String name,Integer age){
System.out.println("执行了doreturnStringView方法,name="+name+" age="+age);
//添加到前端,显示数据
req.setAttribute("myname",name);
req.setAttribute("myage",age);
//返回结果,forward,转发到show.jsp
return "show";
//返回结果,forward,转发到show.jsp 使用解析器或导致网站错误,如果使用完整路径,删除解析器
// return "/WEB-INF/view/show.jsp";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--spring的配置文件 声明组件扫描器-->
<context:component-scan base-package="com.liuhaiyang.controller"/>
<!-- 声明视图解析器;帮助处理视图 主要帮助我们处理重复的多余的冗余路径等-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定试图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀,试图文件的扩展名-->
<property name="suffix" value=".jsp"/> <!--表示所有的jsp文件-->
</bean>
<!-- 声明注解驱动:创建HttpMessageConverter接口的7个实现类对象-->
<mvc:annotation-driven />
</beans>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
<title>接受请求参数</title>
</head>
<body>
<p>控制器返回String-逻辑视图名称</p>
<form action="return-string-view.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交参数">
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--声明springmvc的核心对象-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果是自定义的文件,需要在这写自定义配置文件的位置 和监听器的是一样的-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在服务器启动时候创建对象,和容器的顺序 在启动时装载对象 随意给个值要求大于等于0 数值越小,创建的越早-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- url-pattern 作用:把一些请求交给servlet处理 就例如将/mymvc交给springmvc处理
使用中央调度器(DispatcherServlet) 1.使用扩展名方式,格式/*.xxx 例如:xxx.xml表示以xml结尾的都算
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 声明过滤器,框架提供的,解决post请求中的乱码问题-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 给过滤器属性赋值 和其他的赋值一样的-->
<init-param>
<!-- 项目使用的字符集编码-->
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<!-- 强制请求(request)对象使用encoding的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 强制应答(response)对象使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 强制所有的请求,先经过过滤器处理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
/show.jsp,显示request作用域中的数据<br>
<h2>name:<%=request.getAttribute("myname")%></h2>
<h2>age:${myage}</h2>
</body>
</html>
还需要一个jquery文件,需要的话 官网地址:
结果截图:
1.3返回值类型:void
对于处理器方法返回 void 的应用场景,AJAX 响应。
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。例如,对于 AJAX 的异步请求的响应。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liuhaiyang.damain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
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 {
/**
* 控制器方法返回void,响应ajax请求,使用HttpServletResponse输出数据
*/
@RequestMapping("/return-void-ajax.do")
public void returnVoidAjax(HttpServletResponse response, String name, Integer age) throws IOException {
System.out.println("处理void返回类型,name="+name+" age="+age);
//调用service得到结果
Student student=new Student();
student.setName(name+"同学");
student.setAge(age);
//把对象转换成为json
ObjectMapper om=new ObjectMapper();
String json= om.writeValueAsString(student);
System.out.println("服务器端对象转为json===="+json);
//输出json,响应Ajax 设置字符集
response.setContentType("application/json;charset=utf-8");
PrintWriter pw=response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
}
其他代码一样,就不展示了,展示不一样的
网页请求页面 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>控制器方法返回String-逻辑视图名称</title>
<script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
<script type="text/javascript" >
$(function (){
$("#btnAjax").on("click",function () {
$.ajax({
url:"return-void-ajax.do",
// url:"dostudentajax.do",
// url:"dolist.do",
// url:"doStringDate.do",
data:{
name:"lisi",
age:20
},
dataType:"json",
// dataType:"text",
success:function (resp) {
alert("resp====name="+resp.name+" age="+resp.age);
// $.each(resp,function (i,n) {
// alert("resp====name="+n.name+" age="+n.age);
// })
// alert(resp)
}
})
})
})
</script>
</head>
<body>
<button id="btnAjax">发起ajax请求</button>
</body>
</html>
运行结果截图:
1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)
处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。
其他代码和上面的返回值为void差不多
package com.liuhaiyang.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liuhaiyang.damain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
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 {
/**
*控制方法返回的是list<Student>----json array
*
* 与上面的语法一致
*/
@RequestMapping("/dolist.do")
@ResponseBody //这个注解作用是响应Ajax将json输出的 ,将student转换成为json字符串对象 本注解对应上面的输出那段代码
public List<Student> doAjaxJsonlist(String name,Integer age){
System.out.println("控制器方法返回的是自定义对象list<Student>,转换成为jsonarray"+name+"==="+age);
Student student1=new Student("张三",20);
Student student2=new Student("李四",21);
Student student3=new Student("王五",23);
List<Student> students=new ArrayList<>();
students.add(student1);
students.add(student2);
students.add(student3);
return students;
}
/**
*控制器方法返回String--数据
* 区分返回值String是数据还是试图: 方法上面有@RespinseBody注解就是数据,没有该注解就是视图
*
* 会出现乱码,原因是框架没有使用httpMessageConverter,而是用StringHttpMessageConverter
* 解决办法: 使用@RequestMapping的produces属性。
* produces属性:指定content-type的值
* 框架处理String返回值: 1.框架使用的StringHttpMessageConverter
* 2.StringHttpMessageConverter使用的是text/plain;charset=ISO-8859-1
*/
@RequestMapping(value = "/doStringDate.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
System.out.println("控制器方法返回的String,是数据");
return "hello SpringMVC注解式开发";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>控制器方法返回String-逻辑视图名称</title>
<script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
<script type="text/javascript" >
$(function (){
$("#btnAjax").on("click",function () {
$.ajax({
// url:"return-void-ajax.do",
url:"dostudentajax.do",
// url:"dolist.do",
// url:"doStringDate.do",
data:{
name:"lisi",
age:20
},
dataType:"json",
// dataType:"text",
success:function (resp) {
alert("resp====name="+resp.name+" age="+resp.age);
// $.each(resp,function (i,n) {
// alert("resp====name="+n.name+" age="+n.age);
// })
// alert(resp)
}
})
})
})
</script>
</head>
<body>
<p>控制器方法返回String-逻辑视图名称</p>
<form action="return-string-view.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="提交表单">
</form> <br>
<p>控制器方法返回String-完整视图路径</p>
<form action="return-string-view2.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="提交表单">
</form> <br> <br>
<button id="btnAjax">发起ajax请求</button>
</body>
</html>
结果跟上面的一样
1.5 返回值类型:String(这里的String是数据)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liuhaiyang.damain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
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--数据
* 区分返回值String是数据还是试图: 方法上面有@RespinseBody注解就是数据,没有该注解就是视图
*
* 会出现乱码,原因是框架没有使用httpMessageConverter,而是用StringHttpMessageConverter
* 解决办法: 使用@RequestMapping的produces属性。
* produces属性:指定content-type的值
* 框架处理String返回值: 1.框架使用的StringHttpMessageConverter
* 2.StringHttpMessageConverter使用的是text/plain;charset=ISO-8859-1
*/
@RequestMapping(value = "/doStringDate.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
System.out.println("控制器方法返回的String,是数据");
return "hello SpringMVC注解式开发";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>控制器方法返回String-逻辑视图名称</title>
<script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
<script type="text/javascript" >
$(function (){
$("#btnAjax").on("click",function () {
$.ajax({
// url:"return-void-ajax.do",
// url:"dostudentajax.do",
// url:"dolist.do",
url:"doStringDate.do",
data:{
name:"lisi",
age:20
},
// dataType:"json",
dataType:"text",
success:function (resp) {
// alert("resp====name="+resp.name+" age="+resp.age);
// $.each(resp,function (i,n) {
// alert("resp====name="+n.name+" age="+n.age);
// })
alert(resp)
}
})
})
})
</script>
</head>
<body>
<p>控制器方法返回String-逻辑视图名称</p>
<form action="return-string-view.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="提交表单">
</form> <br>
<p>控制器方法返回String-完整视图路径</p>
<form action="return-string-view2.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="提交表单">
</form> <br> <br>
<button id="btnAjax">发起ajax请求</button>
</body>
</html>
结果:
2.控制器类中的方法返回对象转为json的步骤
1.在pom.xml文件中加入 jackson 依赖,springmvc框架处理json时,默认使用的是jackson。
2.在springmvc配置文件中,加入注解驱动标签: <mvc:annotation-driven />。
3.在控制器方法的上面加入 @ResponseBody 注解,表示将返回值数据输出给浏览器。