这里教程直接教学Springboot而跳过了ssm,为了先着手开发所以决定后期再补一下springmvc的内容,先跟着教程走,到后面做“元集”时如果用到边做边学,(make it work first)。
本篇是一些零散的入门web知识:
1 Maven
JavaWeb开发常用maven来进行管理。此处按照视频所说规定,之后的java都统一使用11版本的JDK,和Maven协同。
Maven需单独安装,配合IDEA使用。
Maven的作用:
- 依赖管理,(jar包),避免版本冲突问题
- 提供标准、统一的项目结构,如下:
- src下:
- main: —实际项目资源
- java —java源代码目录
- resources —配置文件目录
- test —测试项目资源
- java
- resources
- pom.xml —项目配置文件
- 自动化项目构建:编译、测试、打包、发布
注:此处为简单的maven使用,后期还有高级用法
2 HTTP
基于TCP
基于请求:一次请求对应一次响应
2.1 请求协议
请求行:
请求数据的第一行:请求方式(GET、POST),资源路径,协议
- 请求方式 – GET: 请求参数在请求行中,没有请求体,如: /brand/findAll?name=OPPO&status=1。GET 请求大小是有限制的
- 请求方式 – POST: 请求参数在请求体中,POST 请求大小是没有限制的
请求头:
第二行开始,格式 key:value
请求体:
POST请求,存放请求参数
2.2 相应协议
相应行:
相应数据第一行:协议,状态码,描述
常用状态码:
- 200 OK:处理成功
- 404 Not Found:请求资源不存在
- 502 Internal Server Error:服务器发生不可预期的错误:
响应头:
第二行开始,格式 key:value
响应体:
最后一部分,存放响应数据
2.3 解析协议
无视,框架\web服务器软件 会实现。
3 Tomcat
轻量级web应用服务器,封装了对HTTP协议数据的操作。被整合进Springboot。
4 请求
此处使用apifox作为接口测试工具。
4.1 简单参数
1.原始方法获取请求参数:
- Controller方法形参中声明HttpServletRequest对象
- 调用对象的getParameter(参数名)
@RestController
public class exercise1 {
//原始方式
@RequestMapping("/exercise1")
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方式:
- 请求名与方法形参变量名相同
- 会自动进行类型转换
@RestController
public class exercise1 {
//Springboot方式
@RequestMapping("/exercise1")
public String simpleParam(String name,Integer age){
System.out.println(name+"--"+age);
return "OK";
}
}
3.@RequestParam注解
- 方法形参名称与请求参数名称不匹配,通过该注解完成映射
- 该注解的required属性默认是true,代表请求参数必须传递
@RestController
public class exercise1 {
//Springboot方式
@RequestMapping("/exercise1")
public String simpleParam(@RequestParam(name = "name",required = false) String username, Integer age){
System.out.println(username+"--"+age);
return "OK";
}
}
4.2 实体参数
简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可。
POJO:仅包含自身的属性以及自身属性的getter和setter方法。
@RestController
public class SimplePojo {
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
}
复杂实体对象:有类的嵌套,在内部类的属性前加上“外部类名称.”
4.3 数组参数:
复选框多数时传递的是一个数组:
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
此处 请求url为:“http://localhost:8080/arrayParam?hobby=java&hobby=C++&hobby=Go”,而后端收不到“++”。
修改为“http://localhost:8080/arrayParam?hobby=java&hobby=C%2B%2B&hobby=Go”就正常了
4.4 集合参数:
- 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系。
@RequestMapping("/arraylistParam")
public String arrayParam(@RequestParam ArrayList<String> hobby){
System.out.println(hobby);
return "OK";
}
4.5 日期时间类参数:
前端和后端需要统一传递格式。:@DateTimeFormat(pattren=”yyyy-MM-dd HH:mm:ss”)
@RequestMapping("/timeParam")
public String timeParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime time){
System.out.println(time);
return "OK";
}
4.6 JSON参数:
JSON参数:JSON参数键名于形参对象属性名相同,定义POJO类型形参即可接收参数,需要用@RequestBody 标识
JSON数据需要放在请求体中,所以使用POST方法而非GET,(raw)
{
"name":"张三",
"age":"18",
"myinfo":{
"info1":"INFO1111",
"info2":"INFO2222"
}
}
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user.toString());
return "OK";
}
4.7 路径参数:
参数成为了URL的一部分。
路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要用@PathVariable 获取路径参数
URL:http://localhost:8080/path/137
@RequestMapping("/path/{id}")
public String pathVariableParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
也可以多个:
URL:http://localhost:8080/path/137/123
@RequestMapping("/path/{id1}/{id2}")
public String pathVariableParam(@PathVariable Integer id1,@PathVariable Integer id2){
System.out.println(id1);
System.out.println(id2);
return "OK";
}
5 响应
@ResponseBody
- 类型:方法注解、类注解
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
- @RestController=@Controller+@ResponseBody;
统一响应结果:
统一响应结果旨在为系统不同功能模块、不同接口返回的数据格式设定一个统一的规范。
Result(code,meg,data)
Result.java:示例
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;
}
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 +
'}';
}
}
应用示例:
需要提前引入dom4j依赖,引入工具类.
EmpController.java:
package org.example.springbootdemo.Controller;
import org.example.springbootdemo.Controller.Request.pojo.Result;
import org.example.springbootdemo.demos.web.Emp;
import org.example.springbootdemo.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
@RequestMapping("/listEmp")
public Result list(){
//1.加载解析xml
String file =this.getClass().getClassLoader().getResource("emp.xml").getFile();
List<Emp> empList= XmlParserUtils.parse(file, Emp.class);
//2.对数据进行转换
empList.stream().forEach(emp -> {
String gender= emp.getGender();
if("1".equals(gender))
emp.setGender("男");
else
emp.setGender("女");
});
empList.stream().forEach(emp->{
String job= emp.getJob();
if("1".equals(job))
emp.setJob("讲师");
else if("2".equals(job))
emp.setJob("班主任");
else
emp.setJob("就业指导");
});
//3.响应
return Result.success(empList);
}
}