【04】SpringMVC笔记–响应类型
文章目录
一、响应类型:
1. 返回 String 类型
例如:比如响应了一个字符串“success”。那么MVC框架就会根据配置的视图解析器寻找到对应的jsp文件,跳转到了WEB-INF/pages/
目录下的"success.jsp
"
springmvc.xml
配置的视图解析器
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
Controller类
@Controller
@RequestMapping("/user")
public class UserController {
//测试返回值为String类型
@RequestMapping("testReturnString")
public String testReturnString(Model model){
return "success";
}
}
2. 无返回值 void
- 默认会跳转到以该方法名为名的.jsp文件。例如 访问方法testVoid 则跳转到testVoid.jsp
- 或使用原生Servlet api进行
– 转发
– 重定向
– 直接输出响应流
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 测试无返回值:void
* 默认:会跳转到以该方法名为名的.jsp文件。例如 访问方法testVoid ===>默认响应跳转到testVoid.jsp
* 其他:
* 手动:1. 转发
* 2. 重定向
* 3. 直接响应输出流
*/
@RequestMapping("testReturnVoid")
public void testReturnVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
//转发
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//重定向 ---不可访问WEB-INF目录
response.sendRedirect(request.getContextPath()+"/index.jsp");
//输出流
//response.getWriter().write("helloWorld!!!");
}
}
3. 返回 ModelAndView 类型
ModelAndView对象。是SpringMVC提供的一个对象。里面可以封装需要返回的对象与视图名称
addObject()
:,底层是存到了request域中setViewName()
:,设置跳转视图名称(上面直接返回字符串进行跳转的,底层就是在使用这个方法
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 测试返回ModelAndView
*/
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
//创建ModelAndView对象
ModelAndView mv = new ModelAndView();
User user = new User();
//存到request域中,使用ModelAndView的方法
mv.addObject("user",user);
//设置跳转页面
mv.setViewName("success");
//注:手动返回"success",底层也是使用ModelAndView对象 ,也是使用视图解析器
return mv;
}
}
4. 响应json数据
- 前台表单异步提交一个json数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery.min.js" type="text/javascript"></script>
<script>
$(function () {
//异步提交表单
$("#login_form").submit(function () {
//把表单数据转为json
var formObject = {};
var formArray =$(this).serializeArray();
$.each(formArray,function(i,item){
formObject[item.name] = item.value;
});
$.ajax({
url: '${pageContext.request.contextPath}/fore/userLogin',
type: 'POST',
contentType: 'application/json; charset=UTF-8',
async: false,
dataType: 'json',
data: JSON.stringify(formObject),
success: function (info) {
if (!info.flag) {
$("#check_error").html(info.info);
} else {
// alert("登录成功");
location.href = "${pageContext.request.contextPath}/fore/home";
}
}
});
return false;
});
});
</script>
</head>
<body>
<form action="#" method="post" id="login_form">
<!-- 表单字段...-->
</form>
</body>
</html>
- 如果提交的键值对的键和某个JavaBean的属性名相同。可以在控制器方法参数提供该Bean对象接收json数据
- 如果需要返回的数据也是json,需要在添加相关jar包。(使用的maven工程,所以添加如下依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
- Controller
返回json
数据,需要在控制器方法的返回值前使用@ResponseBody
注解,、会自动将返回的对象转为json
格式并放到响应体中
/**
* 模拟异步请求响应
* 接受的Json数据会被直接封装到User对象中,由于我们引入了json的jar包。
* mvc框架会自动将对象转换为json返回。
* 我们只需返回User对象即可。
*/
@RequestMapping("/testAjax")
@ResponseBody
public User testAjax(@RequestBody User user){
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setName("Yangx");
user.setAge(21);
// 做响应,spirngMVC框架会自动将其转换为json数据,然后返回给浏览器
return user;
}
二、转发与重定向
SpringMVC提供的方式:根据返回的字符串关键字进行转发,或重定向
- 转发:"
forward:
"+跳转页面路径 - 重定向:"
redirect:
"+跳转页面路径
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("testForwardOrRedirect")
public String testForwardOrRedirect(Model model){
//转发
//return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:/index.jsp";
}
}