注解开发
环境起步设置配置文件
注解扫描器
springmvc.xml文件中添加
<context:component-scan base-package="top.byfree.controller"/>
base-package写要扫描的包名
注册驱动
<mvc:annotation-driven/>
这行配置可以帮我们自动注册处理器映射器和处理器适配器两个bean
基础注解介绍
注解名 | 作用 |
---|---|
@Controller | 写在类上,表明这个类由spring容器管理 |
@Scope | 设置类的实例创建是单例还是原型模式,默认是单例的 |
@RequestMapping | 在类上使用,起到限定范围作用。在方法上使用,设置访问路径。最终的访问路径是类上的+方法上的 |
@RequestParam | 用于校订参数 |
@RequestHeader | 获取请求头中的信息 |
@RequestBody | 用于请求json的传参,在方法体上是相应json,在参数前是接收参数,具体使用需要导包,具体细节下面讲解 |
传参
方式一:逐个接收
案例演示
请求
<a href="springMvc/a?name=jelly&age=17">点击我吖!</a>
接收
@RequestMapping("/a") // 设置请求路径
public String handleRequest(
String name,
int age,
Model model
){
model.addAttribute("name", name);
model.addAttribute("age", age);
return "WEB-INF/pages/success.jsp";
}
这里的Model是固有参数,可以向服务器存储数据,在跳转的页面可以使用el表达式获取
name和age就是逐个传递的参数
跳转
<html>
<head>
<title>success</title>
</head>
<body>
<h3>跳转成功</h3>
<h3>${name}</h3>
<h3>${age}</h3>
</body>
</html>
细节:请求的参数和接收的参数名称必须对应一致
那我就是想让他们不一样可不可以
可以使用@RequestParam矫正参数
@RequestMapping("/a") // 设置请求路径
public String handleRequest(
@RequestParam("name") String n,
@RequestParam("age") int a,
Model model
){
model.addAttribute("name", n);
model.addAttribute("age", a);
return "WEB-INF/pages/success.jsp";
}
真正的参数名变成了n和a只需要在注解@RequestParam设置和请求对应的参数就可以了
方式二:集合或者数组接收
请求复选框请求
<form action="springMvc/b" method="post">
<input type="checkbox" name="ch1" value="ch1">吃饭
<input type="checkbox" name="ch1" value="ch2">睡觉
<input type="checkbox" name="ch1" value="ch3">玩游戏
<input type="checkbox" name="ch1" value="ch4">呵呵呵
<input type="submit" value="提交">
</form>
数组接收
@RequestMapping(value = "/b") // 设置请求路径
public String ck(
@RequestParam("ch1") String[] a,
Model model
){
model.addAttribute("s", a);
return "/WEB-INF/pages/success.jsp";
}
集合接收
@RequestMapping(value = "/b") // 设置请求路径
public String ck(
@RequestParam List<String> ch1,
Model model
){
model.addAttribute("s", ch1);
return "/WEB-INF/pages/success.jsp";
}
必须要添加@RequestParam注解不然会找不到用那个集合
方式三:bean接收
大白话就是将请求来的数据映射到一个对象中
请求
<form action="springMvc/b" method="post">
<input type="text" name="uname">姓名
<input type="text" name="age">年龄
<input type="submit" value="提交">
</form>
实体类
public class User implements Serializable {
private String uname;
private Integer age;
}
略写了get/set方法,实际情况不可以省略不然没法自动映射
接收
@RequestMapping(value = "/b") // 设置请求路径
public String ck(
User user,
Model model
){
model.addAttribute("user", user);
return "/WEB-INF/pages/success.jsp";
}
这样传进来的uname和age会自动映射成一个user对象,注意这里的uname和age必须和user类的属性对应
方式四:bean接收域属性问题(就是引用对象)
大白话就是接收的属性中有几个属性是对象的属性,但是这个对象又是一个属性
这种解决方式,是在前段表单中写表达式实现的。其实这个表达式功能很强大,之前的集合传参也可以使用这个表达式实现,具体不在赘述
请求
<form action="springMvc/b" method="post">
<input type="text" name="uname">姓名
<input type="text" name="age">年龄
<input type="text" name="p.name">对象
<input type="submit" value="提交">
</form>
p.name p代表的是在user类中的属性的类Partner的名称name是Partner的属性
实体类
public class User implements Serializable {
private String uname;
private Integer age;
private Partner p;
}
public class Partner implements Serializable {
private String name;
}
记得写get/set方法
接收
@RequestMapping(value = "/b") // 设置请求路径
public String ck(
User user,
Model model
){
model.addAttribute("user", user);
return "/WEB-INF/pages/success.jsp";
}
方式五:路径传参(restful风格传参)
请求地址
http://localhost:8080/springMvc/jelly/17/b
要接收的就是这里的jelly和17
接收
@RequestMapping(value = "/{name}/{age}/b") // 设置请求路径
public String ck(
@PathVariable("name") String n,
@PathVariable("age") int a,
Model model
){
System.out.println(n + "---" + a);
return "/WEB-INF/pages/success.jsp";
}
使用的是@PathVariable注解,这个注解也可以矫正参数
方式六:json接收
需要引入解析json的包jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.3</version>
</dependency>
需要前段发起ajax请求
<html>
<head>
<title>ajax</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
<script>
var jq=jQuery.noConflict();
jq(function () {
jq("#myBtn").click(function () {
var data = {
uname : "jelly",
age : "23"
};
jq.ajax({
url: "${pageContext.request.contextPath}/springMvc/a",
type: "POST",
contentType: "application/json",
data: JSON.stringify(data)
});
})
})
</script>
</head>
<body>
<button id="myBtn">点我啊</button>
</body>
</html>
接收并封装成一个user对象
@RequestMapping(value = "/a")
public void handleRequest(
@RequestBody User a
){
System.out.println(a);
}
接收时只需要在参数前加一个@RequestBody注解即可