1、springboot入门程序撰写并启动
SpringBootWeb快速入门:
1)在IDEA中创建一个新项目,选择“Spring Initializr”
2)勾选加入进来的依赖,选择“web”下的“Spring Web”,下载需要时间,可能等个一两分钟。
3)定义HelloController类,添加方法hello,并添加注释
4)运行测试,在运行类下点击主方法绿色三角运行
*如果报错“请删除该文件或确保该文件位于正确的类路径子目录中。”,大概是因为SpringBoot版本和Java版本不兼容,可以查一下相应版本并在pom.xml文件下进行修改,再点击右上角m浮标进行保存,再次运行就好啦。
运行成功的控制台就长这样啦:
再打开浏览器,输入“localhost:8080/hello”(默认8080端口号),就会出现:
如果访问到了服务端的这个方法,并在控制台输出了“Hello SpringBoot~”,浏览器也能看到“Hello SpringBoot~”,说明没问题啦。
2、使用postman练习参数的获取。
0)入门程序返回
1)简单参数&实体参数
简单参数:
原始方法获取请求参数:
在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手段获取。(l了解即可)
在postman中返回”OK“,测试成功:
控制台打印出tom的性别和年龄:
SpringBoot中接收简单参数:
参数名与形参变量名相同,定义形参即可接收参数。
控制台成功输出Tom:20
利用Post方式输出,在body中选择x-www-form-urlencoded,添加关键字并send:
控制台输出Tom姓名和年龄:
@RequestParam注解
*一定要保证请求参数名和Controller方法的形参名一致才能自动接收成功(name和age),否则控制台显示为null.
如果不一致则添加注解@RequestParam手动映射:
*@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。
如果该参数是可选的,可以将required属性设置为false:
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age){
System.out.println(username + ":" + age);
return "OK";
}
实体参数:
简单实体对象:
请求参数名与形参对象属性名相同,定义POJO接收即可(封装):
首先编写Pojo包里的User类:
package com.example.springtest.Pojo;
public class User {
private String name;
private Integer age;
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
再在RequestController中编写:
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
在Postman中发起get请求:
再次运行,点击Postman中的”send“得到结果:
复杂实体对象:
请求参数名与形参对象属性名相同,按照对象层次届贵关系即可接收嵌套Pojo属性参数。
(User的属性有name,age和address,address中又包含属性privince和city)
先编写Address类:
package com.example.springtest.Pojo;
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 + '\'' +
'}';
}
}
再修改User类:
package com.example.springtest.Pojo;
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 +
'}';
}
}
再在RequestController中编写:
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "OK";
}
在Postman中写get方法:
再次运行,点击Postman中的”send“得到结果:
2)数组集合参数
使用数组进行封装:
请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。
首先在RequestController中编写:
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
运行,然后在postman中发出get请求:
控制台返回:
使用集合进行封装:
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系。
首先在RequestController中编写:
@RequestMapping("/listParam")
//需要添加注解@RequestParam
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
运行,然后在postman中发出get请求:
控制台返回:
3)日期参数&json参数
日期参数:
使用@DataTimeFormat注解完成日期参数格式转换。
首先在RequestController中编写:
//5.日期参数
@RequestMapping("/dataParam")
//需要添加注解@DateTimeFormat来明确日期的格式
//pattern格式大小要和这里一样,不然会报错
public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
运行,然后在postman中发出get请求:
控制台返回:
json参数:
JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识将json格式的数据封装到一个实体类中。
上面已经编写过了User和Address类,然后在RequestController中编写:
//6.json参数
@RequestMapping("/jsonParam")
//添加注解@RequestBody
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
运行,然后在postman中发出post请求,body中选择raw中的json格式,填写json格式的请求参数:
控制台返回:
4)路径参数
通过请求URL直接传递参数,使用(…)来标识该路径参数,需要使用@PathVariable获取路径参数。
首先在RequestController中编写:
请求路径不能写成/path/1,这个参数应该是动态的,
//7.路径参数
//换成/path/{id}表示不是一个固定值,而是一个路径参数
@RequestMapping("/path/{id}")
//使用@PathVariable注解
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
运行,然后在postman中发出get请求:
控制台返回:
当在postman中路径改为/path/10,则控制台返回:
如果传递多个路径参数,则在请求路径当中用/分隔写第二个参数即可,代码修改为:
//7.路径参数
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id,@PathVariable String name){
System.out.println(id + " " + name);
return "OK";
}
请求路径改为:
控制台则显示:
5)@ResponseBody&统一响应结果
@ResponseBody:
类型-方法注解,类注解。
位置-Controller方法上/类上.
作用-将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转化为json格式响应。
说明-@RestController = @Controller + @ResponseBody;
响应-字符串:
首先在ResponseController中编写:
@RequestMapping("/helloSpring")
public String hello(){
System.out.println("Hello SpringBoot~");
return "Hello SpringBoot~";
}
运行,然后在postman中发出get请求,响应成功:
响应-对象json:
首先在ResponseController中编写:
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr = new Address();
addr.setProvince("Hubei");
addr.setCity("Wuhan");
return addr;
}
运行,然后在postman中发出get请求,响应成功,返回json格式数据:
响应-集合json:
首先在ResponseController中编写:
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr = new Address();
addr.setProvince("Hubei");
addr.setCity("Wuhan");
return addr;
}
public List<Address> listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("Hubei");
addr.setCity("Wuhan");
Address addr2 = new Address();
addr.setProvince("Hunan");
addr.setCity("Changsha");
list.add(addr);
list.add(addr2);
return list;
}
运行,然后在postman中发出get请求,响应成功,返回json格式数组:
统一响应结果Result(code,msg,data):
使用实体对象result进行接收,在Pojo包下编写Result类:
package com.example.springtest.Pojo;
/**
* 统一响应结果封装类
*/
public class Result {
private Integer code ;//1 成功 , 0 失败
private String msg; //提示信息
private Object data; //数据 data
//无参构造
public Result() {
}
//有参构造
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//getset方法
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
//静态方法
public static Result success(Object data){
return new Result(1, "success", data);
}
public static Result success(){
return new Result(1, "success", null);
}
public static Result error(String msg){
return new Result(0, msg, null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
将上面在ResponseController中编写的进行修改:
@RequestMapping("/helloSpring")
public Result hello(){
System.out.println("Hello SpringBoot~");
//return new Result(1,"success","Hello SpringBoot~");//创建Result对象
return Result.success("Hello SpringBoot~");//直接调用静态方法
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr = new Address();
addr.setProvince("Hubei");
addr.setCity("Wuhan");
return Result.success(addr);
}
@RequestMapping("/listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("Hubei");
addr.setCity("Wuhan");
Address addr2 = new Address();
addr.setProvince("Hunan");
addr.setCity("Changsha");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
运行,在postman中分别返回响应:(我上面写错啦传值的时候addr2写成了addr所以下面addr2里面是null,不过不要紧大概意思是这样的)
/helloSpring:
/getAddr:
/listAddr:
使得响应给前端的数据格式是统一的,使项目更加容易管理。
6)案例
3、体会前端页面向后端发送数据的过程。并且自己尝试将之前的注册页面的信息发送到服务端。
1)product.html的操作代码,输入产品名称和价格,点击“增加商品”按钮,页面返回“ok”。服务台返回用户输入的值。相关页面如下:
product.html放在static目录下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="font-size: 30px">
<form action="addProduct">
产品名称 :<input type="text" name="name" value=""><br />
产品价格: <input type="text" name="price" value=""><br />
<input type="submit" value="增加商品">
</form>
</body>
</html>
ProductController.java放在Controller文件夹下:
package com.example.springtest.controller;
import com.example.springtest.Pojo.Product;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class ProductController {
@RequestMapping("/addProduct1")
public String simpleParam1(HttpServletRequest request){
String name = request.getParameter("name");
String ageStr = request.getParameter("price");
int price = Integer.parseInt(ageStr);
System.out.println("addProduct1:" + name + ":" + price);
return "OK";
}
@RequestMapping("/addProduct")
public String simpleParam(String name,Integer price){
System.out.println("您输入的信息是:" + name + ":" + price);
return "OK";
}
@RequestMapping("/addProduct2")
public String simpleParam2(Product product){
System.out.println(product);
return "OK";
}
}
product.java放在Pojo文件夹下:
package com.example.springtest.Pojo;
public class Product {
private String name;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
打开浏览器,输入localhost:8080/product.html出现页面:
控制台返回:
2)自己尝试将之前的注册页面的信息发送到服务端。
首先在static目录下编写1.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="Register" method="post">
<ul style="list-style: none; line-height: 30px">
<li>
输入用户姓名:
<input type="text" name="name" />
<br />
</li>
<li>
选择性别:
<input name="sex" type="radio" value="boy" />
男
<input name="sex" type="radio" value="girl" />
女
</li>
<li>
选择密码提示问题:
<select name="question">
<option value="母亲生日">
母亲生日
</option>
<option value="宠物名称">
宠物名称
</option>
<option value="电脑配置">
电脑配置
</option>
</select>
</li>
<li>
请输入问题答案:
<input type="text" name="key" />
</li>
<li>
请选择个人爱好:
<div style="width: 400px">
<input name="like" type="checkbox" value="dangce" />
唱歌跳舞
<input name="like" type="checkbox" value="web" />
上网冲浪
<input name="like" type="checkbox" value="hill" />
户外登山
<br />
<input name="like" type="checkbox" value="sports" />
体育运动
<input name="like" type="checkbox" value="reading" />
读书看报
<input name="like" type="checkbox" value="movie" />
欣赏电影
</div>
</li>
<li>
<input type="submit" value="提交" />
</li>
</ul>
</form>
</body>
</html>
其次在Pojo文件夹下编写People.java文件:
package com.example.springtest.Pojo;
public class People {
private String name;
private String sex;
private String question;
private String key;
private String like;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getLike() {
return like;
}
public void setLike(String like) {
this.like = like;
}
public void out() {
System.out.println("People{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", question='" + question + '\'' +
", key='" + key + '\'' +
", like='" + like + '\'' +
'}');
}
}
最后在Controller文件夹下编写RegisterController.java文件:
package com.example.springtest.controller;
import com.example.springtest.Pojo.People;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RegisterController {
@RequestMapping("/Register")
public String Register(People people){
people.out();
return "OK";
}
}
打开浏览器,输入localhost:8080/1.html出现页面:
控制台中返回: