数据请求
RequestMapping注解
作用:建立请求URL和处理方法之间的对应关系
应用:可以作用在方法和类上
1. 作用在类上:第一级的访问目录
2. 作用在方法上:第二级的访问目录
3. 细节:路径可以不编写 / 表示应用的根目录开始
属性:
1. path :指定请求路径的url
2. value :value属性和path属性是一样的
3. mthod :指定该方法的请求方式
我们先来做一个简单的数据请求测试
我们以之前配置MVC时的测试为例(可以回看上一节配置介绍),我们在controller层下的HelloController类里写一个方法,并为其加RequestMapping注解
@RequestMapping("/test")
public String test(){
System.out.println("测试成功");
return "suc";
}
数据请求成功,此时RequestMapping注解仅作用在方法上,所以我们请求时只需1级路径,当我们将RequestMapping注解同时作用在类上时
我们想要访问到test方法就需要二级路径
接下来我们看一下RequestMapping的请求参数绑定,我们通过form表单进行数据提交,
(1). 绑定机制
1. 表单提交的数据都是k=v格式的 username=haha&password=123
2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
3. 要求:提交表单的name和参数的名称是相同的
(2). 支持的数据类型
1. 基本数据类型和字符串类型:提交表单的name和参数的名称是相同的
2. 实体类型(JavaBean):提交表单的name和JavaBean中的属性名称需要一致;如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
3. 集合数据类型(List、map集合等)
我们在model层创建两个实体类:User和Account:
public class Account {
private Double money;
}
public class User {
private String username;
private Integer age;
private Account account;
private List<Account> accounts;
}
我们在index页面用form表单提交数据,我们先写最基本的username和age
<h1>请求参数绑定入门程序</h1>
<form action="/MVCClass2/user/run1" method="get">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="submit"/>
</form>
在controller层接收数据
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/run1")
public String run1(String username,Integer age){
System.err.println(username);
System.err.println(age);
return "suc";
}
}
接下来我们通过对象的方式进行数据传递和接收,这里只需要改一下后台接收的入参即可
@RequestMapping("/run1")
public String save1(User user){
System.out.println(user.toString());
return "suc";
}
然后我们来传递特殊属性,实体类型和集合类型,后台接收数据无需改变,都是通过user对象接收,我们只需修改form表单的内容即可。
<h1>请求参数绑定入门程序(存在list集合)</h1>
<form action="/user/save3" method="post">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="text" name="account.money"/><br/>
<input type="text" name="accounts[0].money"/><br/>
<input type="text" name="accounts[1].money"/><br/>
<input type="submit"/>
</form>
数据响应
首先看最传统的数据响应,使用ModelAndView,当访问save3时数据便会直接返回到suc页面。
@RequestMapping("/save3")
public ModelAndView save3(){
System.out.println("执行了...");
// 创建mv对象
ModelAndView mv = new ModelAndView();
// 把一些数据,存储到mv对象中
mv.addObject("msg","用户名或者密码已经存在");
// 设置逻辑视图的名称
mv.setViewName("suc");
return mv;
}
第二种是使用servlet的请求转发和重定向机制
通过设置ServletAPI , 不需要视图解析器 .
1、通过HttpServletResponse进行输出
2、通过HttpServletResponse实现重定向
3、通过HttpServletResponse实现转发
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
@RequestMapping("/t1")
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.getWriter().println("Hello,Spring BY servlet API");
}
@RequestMapping("/t2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.sendRedirect("/MVCClass2/html/suc.html");
}
@RequestMapping("/t3")
public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//转发
req.setAttribute("msg","hello");
req.getRequestDispatcher("/html/suc.html").forward(req,rsp);
}
}
第三种是通过SpringMVC来实现转发和重定向 - 无需视图解析器;
测试前,需要将视图解析器注释掉
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
@RequestMapping("/t1")
public String test1(){
//转发
return "/html/suc.html";
}
@RequestMapping("/t2")
public String test2(){
//转发二
return "forward:/html/suc.html";
}
@RequestMapping("/t3")
public String test3(){
//重定向
return "redirect:/html/suc.html";
}
}
接下来我们使用ResponseBody响应json数据
首先导入相关依赖
<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>
index.html页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
// 页面加载
$(function(){
// 单击事件
$("#btn").click(function(){
// 发送ajax的请求
$.ajax({
type: "post",
url: "/MVCClass2/user/save6",
data:{username:"haha",age:"20"},
success:function(d){
// 编写很多代码
alert(d.username+" ‐ "+d.age);
}
});
});
});
</script>
</head>
<body>
<h3>异步的数据交互</h3>
<input type="button" value="ajax交互" id="btn">
</body>
</html>
controller层接收数据和响应,当我们使用@ResponseBody注解时,前台请求之后便不会跳转页面,而是返回一个json字符串数据
@RequestMapping("/save6")
@ResponseBody
public User save6(User user){
System.out.println(user);
// 模拟,调用业务层代码
user.setUsername("hello");
user.setAge(100);
// 把user对象转换成json,字符串,再响应。使用@ResposeBody注解 response.getWriter().print()
return user;
}