文章目录:
1.2 返回值类型:String(这里的String是视图)
1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)
1.5 返回值类型:String(这里的String是数据)
1.控制器controller方法的返回值
使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
1. 第一种:ModelAndView
2. String
3. void
4. 返回自定义类型对象
参考我的这篇文章即可:https://blog.csdn.net/weixin_43823808/article/details/115280620
若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中需要定义 ModelAndView 对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多余:要么Model多余,要么 View 多余。即此时返回 ModelAndView 将不合适。
1.2 返回值类型:String(这里的String是视图)
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。
1.2.1 控制器类
package com.songzihao.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.songzihao.entity.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; @Controller public class MyController { /** * 控制器方法返回String,表示逻辑名称,需要项目中配置视图解析器 */ @RequestMapping(value = {"/return-string-view.do"}) public String doReturnStringView1(HttpServletRequest request,String name, Integer age) { System.out.println("执行了MyController的doReturnStringView1方法,name=" + name + ",age=" + age); //处理数据 request.setAttribute("myName",name); request.setAttribute("myAge",age); //使用视图解析器,返回结果,forward,转发到show.jsp return "show"; //如果不使用视图解析器,则需要写成下面这样 //return "/WEB-INF/view/show.jsp"; } }
1.2.2 springmvc配置文件
<?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"> <!-- springmvc的配置文件 --> <!-- 声明组件扫描器 --> <context:component-scan base-package="com.songzihao.controller" /> <!-- 声明视图解析器,帮助处理视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀:指定试图文件的路径 --> <property name="prefix" value="/WEB-INF/view/" /> <!-- 后缀:试图文件的扩展名 --> <property name="suffix" value=".jsp" /> </bean> </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>
1.2.4 web.xml
<?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>DispatcherServlet</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> <!-- tomcat服务器创建对象的顺序,数值(大于等于0)越小,创建对象的时间就越早 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <!-- 把一些请求交给指定的servlet处理 1.使用扩展名方式,格式:*.xxx, xxx是自定义的扩展名 例如:*.do *.action *.mvc , 不能使用 *.jsp!!! 2.使用斜杠 "/" --> <!-- 意思是将 *.do 的请求交给 DispatcherServlet 处理 --> <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>
package com.songzihao.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.songzihao.entity.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; @Controller public class MyController { /** * 控制器方法返回void,响应ajax请求,使用HttpServletResponse输出数据 */ @RequestMapping(value = {"/return-void-ajax.do"}) public void returnVoidAjax(HttpServletResponse response,String name, Integer age) throws IOException { System.out.println("处理void返回类型:name=" + name + ",age=" + age); 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(); } }
<%@ page contentType="text/html;charset=utf-8" language="java" %> <html> <head> <title>接受请求参数</title> <script type="text/javascript" src="js/jquery-3.6.0.js"></script> <script type="text/javascript"> $(function () { $("#myButton").on("click",function () { $.ajax({ url: "return-void-ajax.do", //url: "doStudentJson.do", //url: "doStringData.do", data: { name: "张起灵", age: 20 }, dataType: "json", //dataType: "text", success: function (resp) { // resp=XMLHttpRequest.responseText; alert("name===" + resp.name + ",age===" + resp.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/><br/> <button id="myButton">提交ajax请求</button> </body> </html>
1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)
package com.songzihao.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.songzihao.entity.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; @Controller public class MyController { /** * 控制器方法返回Student-----json * * 框架处理模式: * 1. 框架根据控制器方法的返回值类型,找到HttpMessageConverter接口的实现类, * 最后找到的是MappingJackson2HttpMessageConverter * * 2. 使用实现类MappingJackson2HttpMessageConverter,执行它的write()方法, * 把Student对象转为了json格式的数据 * * 3. 框架使用@ResponseBody注解,把2中的json数据输出给了浏览器 * 设置了content-type: application/json;charset=utf-8 */ @RequestMapping(value = "/doStudentJson.do") @ResponseBody public Student doAjaxJson(String name,Integer age) { System.out.println("控制器方法返回自定义对象Student,转为Json:" + name + "," + age); Student student=new Student(); student.setName(name); student.setAge(age); return student; } }
<?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"> <!-- springmvc的配置文件 --> <!-- 声明组件扫描器 --> <context:component-scan base-package="com.songzihao.controller" /> <!-- 声明视图解析器,帮助处理视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀:指定试图文件的路径 --> <property name="prefix" value="/WEB-INF/view/" /> <!-- 后缀:试图文件的扩展名 --> <property name="suffix" value=".jsp" /> </bean> <!-- 声明注解驱动,创建HttpMessageConverter接口的7个实现类对象 --> <mvc:annotation-driven /> </beans>
<%@ page contentType="text/html;charset=utf-8" language="java" %> <html> <head> <title>接受请求参数</title> <script type="text/javascript" src="js/jquery-3.6.0.js"></script> <script type="text/javascript"> $(function () { $("#myButton").on("click",function () { $.ajax({ //url: "return-void-ajax.do", url: "doStudentJson.do", //url: "doStringData.do", data: { name: "张起灵", age: 20 }, dataType: "json", //dataType: "text", success: function (resp) { // resp=XMLHttpRequest.responseText; alert("name===" + resp.name + ",age===" + resp.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/><br/> <button id="myButton">提交ajax请求</button> </body> </html>
1.5 返回值类型:String(这里的String是数据)
package com.songzihao.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.songzihao.entity.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; @Controller public class MyController { /** * 控制器方法返回String,这里是数据 * * 区分返回值String是数据还是视图 * 1.方法上面有 @ResponseBody 注解,就是数据 * 2.方法上面没有 @ResponseBody 注解,就是视图 * * 框架处理String返回值 * 1.框架使用StringHttpMessageConverter * 2.StringHttpMessageConverter默认的字符集编码是ISO_8859_1 * 3.使用 @RequestMapping 注解中的produces属性进行修改:produces = "text/plain;charset=utf-8" */ @RequestMapping(value = {"/doStringData.do"},produces = "text/plain;charset=utf-8") @ResponseBody public String doStringData(String name,Integer age) { System.out.println("控制器方法返回String,是数据"); return "Hello SpringMVC注解式开发"; } }
<?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"> <!-- springmvc的配置文件 --> <!-- 声明组件扫描器 --> <context:component-scan base-package="com.songzihao.controller" /> <!-- 声明视图解析器,帮助处理视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀:指定试图文件的路径 --> <property name="prefix" value="/WEB-INF/view/" /> <!-- 后缀:试图文件的扩展名 --> <property name="suffix" value=".jsp" /> </bean> <!-- 声明注解驱动,创建HttpMessageConverter接口的7个实现类对象 --> <mvc:annotation-driven /> </beans>
<%@ page contentType="text/html;charset=utf-8" language="java" %> <html> <head> <title>接受请求参数</title> <script type="text/javascript" src="js/jquery-3.6.0.js"></script> <script type="text/javascript"> $(function () { $("#myButton").on("click",function () { $.ajax({ //url: "return-void-ajax.do", //url: "doStudentJson.do", url: "doStringData.do", data: { name: "张起灵", age: 20 }, //dataType: "json", dataType: "text", success: function (resp) { // resp=XMLHttpRequest.responseText; //alert("name===" + resp.name + ",age===" + resp.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/><br/> <button id="myButton">提交ajax请求</button> </body> </html>
2.控制器类中的方法返回对象转为json的步骤
1. 在pom.xml文件中加入 jackson 依赖,springmvc框架处理json时,默认使用的是jackson。
2. 在springmvc配置文件中,加入注解驱动标签: <mvc:annotation-driven />。
3. 在控制器方法的上面加入 @ResponseBody 注解,表示将返回值数据输出给浏览器。