一、简单参数的接受
1、原始方法获取参数(了解即可)
Controller方法形参中声明HttpServerRequest对象
调用对象的getParameter(参数名)
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
//获取请求参数
String name = request.getParameter("name");
String agestr = request.getParameter("age");
int age = Integer.parseInt(agestr);
System.out.println(name+":"+age);
return "ok";
}
2、SpringBoot中接受简单参数
请求参数名与方法形参变量名相同
会自动进行类型转换
@RequestMapping("/simpleParam")
public String simpleParam(String usename, Integer age){
System.out.println(usename+":"+age);
return "ok";
}
url:http://localhost:8080/simpleParam?name=Tom&age=10
3、@RequestParam注解
方法形参名称与请求参数名称不匹配时,通过该注释完成映射
该注释的required属性默认是true,代表请求参数必须传递(不对,我实验了,返回的是 null:10)
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name") String usename, Integer age){
System.out.println(usename+":"+age);
return "ok";
}
二、实体参数的接收:请求参数名与形参对象属性名相同,定义POJO接收即可
//复杂实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "OK";
}
其中User对象、Address对象如下:
public class User {
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
}
URL:http://localhost:8080/complexPojo?name=T&age=1&address.province=北京&address.city=北京
三、数组集合参数
数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接受参数
//数组参数
@RequestMapping("/arrayPojo")
public String arrayPojo(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
URL:http://localhost:8080/arrayPojo?hobby=game&hobby=java&hobby=sing
输出结果为:
集合参数:
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数
@RequestMapping("/listPojo")
public String listPojo(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
调试URL:http://localhost:8080/listPojo?hobby=game&hobby=java&hobby=sing
输出结果为:
四、日期参数
使用@DataTimeFormat完成日期参数格式转换
//日期参数
@RequestMapping("/dateParam")
public String dataParam(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
调试URL:http://localhost:8080/dateParam?updateTime=2024-04-17 21:07:06
输出结果为:
五、JSON参数
JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接受参数,需要使用@RequestBody标识
调试设置:
//JSON参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
System.out.println(user);
return "OK";
}
输出结果为:
六、路径参数
通过URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数
//路径参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id) {
System.out.println(id);
return "OK";
}
【注】:使用{id}表示一个动态的数
调试设置:
输出结果为:
当传递多个路径参数时:
输出结果为:
七、分层解耦
Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
service:业务逻辑层,处理具体的业务逻辑。
dao:数据访问层,负责数据访问操作,包括数据的增删改查。
内聚:软件中各功能模块内部的功能联系。
耦合:衡量软件中各个层、模块间的依赖、关联程度。
软件设计原则:高内聚低耦合
解耦合:1、需要把service对象交给容器管理(控制反转) 2、容器要为程序提供它所依赖的资源(依赖注入)
控制反转:Inversion Of Control,简称IOC。对象的创建控制权由陈虚谷自身转移到外部(容器)。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源。
Bean对象:在IOC容器中创建、管理的对象。称之为bean。
1、IOC控制反转
bean的声明:要把某个对象交给IOC容器管理,需要在对应的类上加上如下注释:
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
使用以上四个注释都可以声明bean,但在springboot集成web开发中,声明控制器bean只能用@Controller(而且@RestController包含了@Controller+@ResponseBody)
bean组件扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
@ComponentScan注解虽然没有显性配置,但实际上已经包含在启动类注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
2、DI依赖注入
@Autowired注解,默认按照类型进行,如果存在多个相同类型的bean,将会报错。
解决方案:
(1)@Primary
想让谁生效就在类上直接加上此注释
(2)@Qualifier
@Autowird+@Qualifier(”bean的名称“)
(3)@Resource
@Resource(name=”bean的名称“)【bean的名称默认为类名首字母小写】
【@Resource与@Autowired区别】
@Autowired是spring框架提供的注释,耳@Resource是JDK以供的注解
@Autowired默认按照类型注入,而@Resource默认是按照名称注入的