响应数据与结果视图
返回值分类
1)字符串
结果视图:控制器请求处理方法返回值字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
@RequestMapping("/testReturnString")
public String testReturnString() {
System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
return "success";
}
如 return "success",则视图解析器解析的视图是success.jsp
响应数据:
在控制器请求方法中将数据存入request域,
User user = new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(30);
model.addAttribute("user1",user);
取出数据:在结果视图success.jsp:将isELignored设为false,通过表达式${}取出数据
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<%--user1为键--%>
${user1.username}
${user1.password}
</body>
</html>
2)void
视图:
当无return返回值时,默认返回的结果视图的jsp文件的文件名为@RequestMapping的末端路径,如@RequestMapping("/hello"),则默认视图文件为hello.jsp,除此之外,使用Servlet 原始 API 可以作为控制器中方法的参数
/**
* 是void
* 请求转发一次请求,不用编写项目的名称
* 重定向是两次请求,request.getContextPath()获取项目的名称
*/
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
//在controller方法形参上定义request和response,用来指定相应结果
/**1.使用request转向页面,
*返回视图路径写完整,因为自己编写的转发方法不会去调用视图解析器
*/
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 2.也可以使用response页面重定向
// response.sendRedirect(request.getContextPath()+"/index.jsp");
// 3.可以通过response直接进行响应
// 设置解决中文乱码“你好”
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你好");
return;
}
3)ModelAndView
数据视图一起返回:
/**
* 返回ModelAndView
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("小凤");
user.setPassword("456");
user.setAge(30);
// 把user对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("user",user);
// 跳转到哪个页面
mv.setViewName("success");
return mv;
}
转发与重定向(重定向是客户端行为,转发是服务器端行为)
都无法使用视图解析器。
forward转发:
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
return "forward:/WEB-INF/pages/success.jsp";
相当于:request.getRequestDispatcher("url").forward(request,response),
若定向到RequestMapping请求路径, 如return "forward:heeee"; 而某个方法的注解修饰为:@RequestMapping(path="/heeee"),且满足请求要求,这样相当于一次执行两个请求,共享request域(数据共享)
redirect重定向:
客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问某个jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求该jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)
//允许重定向到RequestMapping请求路径
return "redirect:testReturnModelAndView";
相当于response.sendRedirect(url);需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
同时,允许重定向到RequestMapping请求路径,但请求相互独立,不共享request域与数据。
@ResponseBody响应json数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
// 页面加载,绑定单击事件
$(function(){
$("#btn").click(function(){
// alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe","password":"123","age":30}',
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
</head>
<body>
<button id="btn">发送ajax的请求</button>
</body>
</html>
<!--前端控制器,配置哪些静态资源不拦截-->
<!--/**指当前目录下所有文件,location相对路径是在webapp下-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
控制器方法:
@ResponseBody:该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端
<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>
@RequestMapping("/testResponseJson")
public @ResponseBody Account testResponseJson(@RequestBody Account account) {
……
……
return account;
}
修饰参数的注解用于将传入请求的json数据转换成对象,修饰返回值类型的注解用于将对象转换成json返回响应。