第一种:返回String类型
1、返回String类型的演示代码如图所示:
@RequestMapping("/returnString")
public String returnString() {
return "/returnDemo/returnString";
// 返回视图的的路径
// <property name="prefix" value="/WEB-INF/jsp"></property>
// <property name="suffix" value=".jsp"></property>
// 指向 /WEB-INF/jsp/returnDemo/returnString.jsp
}
2、由于spring¬mvc.xml中关于视图解析部分的配置,如图所示:
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<!-- 跳转的时候只用写jsp的名字,不用带后缀,因为默认后缀“.jsp”,路径为“/WEB-INF/jsp” -->
<!-- WEB-INF目录是受保护的目录,在浏览器中是无法访问的 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp"></property>
<property name="suffix" value=".jsp"></property>
</bean>
3、返回的视图为 /WEB¬INF/jsp/returnDemo/returnString.jsp页面,如图所示:
第二种:返回ModelAndView类型
1、返回ModelAndView类型的演示代码。ModelAndView相对于String的返回类型的优势,可以携带参数传递到页面。如图所示:
/**
* 注意ModelAndView 引用的是 org.springframework.web.servlet.ModelAndView
*
* @return
*/
@RequestMapping("/returnModelAndView")
public ModelAndView returnModelAndView() {
ModelAndView mv = new ModelAndView("/returnDemo/returnModelAndView");
// 指向//WEB-INF/jsp/returnDemo/returnModelAndView.jsp
// 传递参数到视图**(传递参数的名称,传递参数的值)
mv.addObject("strName", "ModelAndView传递参数到视图 aabbcc");
return mv;
}
2、jsp页面可以通过EL表达式获取ModelAndView传递的参数,如图所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'returnModelAndView.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
returnModelAndView的视图<br>
${strName}
</body>
</html>
第三种:返回void类型
1、返回void类型一般配合PrintWriter使用,和Servlet用法类似。如图所示:
/**
* 和 servlet用法一致,通过流去返回内容,一般使用较少,无需创建jsp
*
* @param pw
*/
@RequestMapping("/returnVoid")
public void returnVoid(PrintWriter pw) {
pw.write("Hello World,returnVoid");
pw.close();
}
第四种:返回Object类型
1、SpringMVC返回json需要使用 jackson ,需要向项目中添加相关的包,如图所示:
PS:jackson的相关jar包下载(提取码:puvm)
2、编写Controller的方法
SpingMVC中返回JSON格式代码如下,说明如图所示:
package com.gx.web;
import net.sf.json.JSONSerializer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.gx.po.User;
@Controller
@RequestMapping("/JsonDemo")
public class JsonDemoController {
@RequestMapping("/form")
public String form() {
return "/jsonDemo/form";
}
@ResponseBody
@RequestMapping(value = "/retrunJson", produces = "application/json")
public Object retrunJson(User user) {
System.out.println("userName=" + user.getUserName());
System.out.println("password=" + user.getPassword());
user.setUserName(user.getUserName() + "_Json数据");
return JSONSerializer.toJSON(user);
}
}
3、编写JSP
在JSP页面中使用JQuery的ajax请求刚刚编写的方法,jsp页面代码说明如图所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set value="${pageContext.request.contextPath}" scope="page" var="ctx"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'form.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!-- 注意:js、css等插件放在WebRoot目录下,如果放在WEB-INF下浏览器是不能直接访问的 -->
<script type="text/javascript" src="${ctx}/js/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$.post("${ctx}/JsonDemo/retrunJson.do",{userName:"小明",password:"123"},function(data){
console.log(data);
},"json");/* 尽量指定"json"格式,不然date返回可能是字符串 */
</script>
</body>
</html>
4、测试
在浏览器中访问http://127.0.0.1:8080/Demo05SpringMVC/JsonDemo/toForm.do, 测试结果如图所示:
附前三种Controller详细源码:
package com.gx.web;
import java.io.PrintWriter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/ReturnDemo")
public class ReturnDemoController {
@RequestMapping("/returnString")
public String returnString() {
return "/returnDemo/returnString";
// 返回视图的的路径
// <property name="prefix" value="/WEB-INF/jsp"></property>
// <property name="suffix" value=".jsp"></property>
// 指向 /WEB-INF/jsp/returnDemo/returnString.jsp
}
/**
* 注意ModelAndView 引用的是 org.springframework.web.servlet.ModelAndView
*
* @return
*/
@RequestMapping("/returnModelAndView")
public ModelAndView returnModelAndView() {
ModelAndView mv = new ModelAndView("/returnDemo/returnModelAndView");
// 指向//WEB-INF/jsp/returnDemo/returnModelAndView.jsp
// 传递参数到视图**(传递参数的名称,传递参数的值)
mv.addObject("strName", "ModelAndView传递参数到视图 aabbcc");
return mv;
}
/**
* 和 servlet用法一致,通过流去返回内容,一般使用较少,无需创建jsp
*
* @param pw
*/
@RequestMapping("/returnVoid")
public void returnVoid(PrintWriter pw) {
pw.write("Hello World,returnVoid");
pw.close();
}
}