Java web(02)

课程设计

  • Maven
  • SpringBoot Web
  • MySQL
  • SpringBoot Mybatis
  • SpringBoot Web开发篇
  • SpringBoot Web进阶篇

maven(没学懂...跳过了...)

介绍:一款用于管理和构建java项目的工具,是Apache 软件基金会的项目

  • 作用
    • 依赖管理
    • 同一项目结构
    • 项目构建
  • 项目结构
    • main (实际项目资源)
      • java(源代码)
      • resources 配置文件目录
    • test
      • java
      • resources
    • pom.xml (项目配置文件)

仓库:用于存储资源,管理各种jar包

  • 本地仓库:自己计算机上的一个目录
  • 中央仓库:由maven团队维护的全球唯一的
  • 远程仓库:一般由公式团队搭建的私有仓库

安装

  • 解压压缩包
  • 配置本地仓库
  • 配置阿里云私服
  • 配置环境变量

在IDEA集成中配置Maven

注:这个是单项目的配置,也可以在配置全局maven环境

创建maven项目

Maven坐标:

  1. 是资源的唯一标识,通过该坐标可以唯一定位资源位置
  2. 使用坐标来定义项目或引入项目中需要的依赖

Maven坐标组成

  1. groupid:定义当前Maven项目隶属组织名称(通常是域名反写)
  2. artifactid:定义当前Maven项目名称(通常是模块名称,例如order-service,goods-service)
  3. version:定义当前版本号

Web入门

Spring Boot: 可以帮助我们非常快速的构建应用程序,简化开发,提高效率

  • 创建一个Spring Boot工程
  • 勾选web开发相关的依赖项
  • 定义HelloController类,并添加hello方法
  • 运行测试

#小知识 连接VPN不如 用国内镜像快

java 复制代码
@RestController  
public class HelloController {  
    @RequestMapping("/hello")  
    public String hello() {  
        System.out.println("hello");  
        return "hello";  
    }  
}

HTTP协议

  • HTTP 概述
  • HTTP 请求协议
  • HTTP 响应协议
  • HTTP 协议解析

概念: Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

特点

  1. 基于TCP协议:面向连接,安全
  2. 基于请求-响应模型:一次请求对应一次响应
  3. HTTP协议是无状态的协议:对于事物处理没有记忆能力,即每次请求-响应都是独立的
    1. 缺点:多次请求间不能共享数据
    2. 优点:速度快

请求数据格式

请求行: 请求方式,资源路径,协议

请求头:

  1. Host:请求的主机名
  2. User - Agent:浏览器版本,例如 Chrome 浏览器的标识类似 Mozilla/5.0 ... Chrome/79,IE 浏览器的标识类似 Mozilla/5.0 (Windows NT ...) like Gecko
  3. Accept:表示浏览器能接收的资源类型,如 text/*,image/或者/* 表示所有;
  4. Accept - Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
  5. Accept - Encoding:表示浏览器可以支持的压缩类型,例如 gzip,deflate 等。
  6. Content - Type:请求主体的数据类型。
  7. Content - Length:请求主体的大小(单位:字节)。

请求体:

注:

  1. GET 请求参数在请求行中,没有请求体
  2. POST:请求参数在请求体中,请求大小没有限制

响应数据

响应行:(协议,状态码,描述)

响应头:

响应体:存放响应数据

状态码

  • 1xx:响应中 - 临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。
  • 2xx:成功 - 表示请求已经被成功接收,处理已完成。
  • 3xx:重定向 - 重定向到其他地方;让客户端再发起一次请求以完成整个处理。
  • 4xx:客户端错误 - 处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。
  • 5xx:服务器错误 - 处理发生错误,责任在服务端。如:程序抛出异常等。

响应头

  • Content-Type:表示该响应内容的类型,例如 text/html,application/json。
  • Content-Length:表示该响应内容的长度(字节数)。
  • Content-Encoding:表示该响应压缩算法,例如 gzip。
  • Cache-Control:指示客户端应如何缓存,例如 max-age=300 表示可以最多缓存 300 秒。
  • Set-Cookie:告诉浏览器为当前页面所在的域设置 cookie。

Tomcat

概念:Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范

目录结构说明

  • bin 可执行文件
  • conf 配置文件
  • lib Tomcat依赖的jar包
  • logs 日志文件
  • temp 临时文件
  • webapps 应用发布目录
  • work 工作目录

运行:双击 startup.bat

乱码问题:在conf/logging.properties 中log配置改为GBK

#问题 :本地服务器启动后,浏览器中访问不到,端口也改了,没用

小结

  • 起步依赖
  • 内嵌Tomcat服务器

请求响应

  • 请求(HttpServletRequest):获取请求数据
  • 响应(HttpServletResponse):设置响应数据
  • BS架构:Browser/Server:浏览器/服务器架构模式,应用程序的逻辑和数据都存储在服务端
  • CS架构:Client/Server,客户端/服务器架构模式

请求

  • apifox
  • 简单参数
    • 请求参数和形参名一致
    • 如果不一致用 @RequestParam 手动映射
  • 实体参数
  • 数组集合参数
    • 集合需要用 @RequestParam 绑定关系
  • 日期参数
  • Json参数 @RequestBody
  • 路径参数 @PathVariable

简单参数

只需要保证参数名和url中的参数名保持一致就可以得到数据

java 复制代码
//前端请求"http://localhost:8080/hello?name=changxin&age=25"
//前端发送的是post请求,后端向下面这样写也可以


@RestController  
public class HelloController {  
    @RequestMapping("/hello")  
    public String hello(@RequestParam(name = "name") String username,Integer age) {  
        System.out.println(username + ":" +age);  
        return "hello";  
    }  
}

小结

  1. SpingBoot中接收简单参数
    1. 请求参数名于方法形参变量名相同
    2. 会自动进行类型转换
  2. @RequestParam注解
    1. 方法形参名称与请求参数名称不匹配,通过改注解完成映射
    2. 该注解的required 属性默认是true,代表请求参数必须传递

实体参数

规则:请求参数名与形参对象属性名相同,然后就可以直接接收了

java 复制代码
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;  
    }  
}


@GetMapping("/hello2")  
public String hello2(User user) {  
    System.out.println(user.getName() + ":" +user.getAge());  
    return "hello2";  
}

数组集合参数

注:和上面那种情况类似,但是一个参数名接收多个参数

java 复制代码
// http://localhost:8080/hello3?arr=changxin&arr=20

// 数组案例
@GetMapping("/hello3")  
public String hello3(String[] arr) {  
    for(String item : arr){  
        System.out.println(item);  
    }  
    return "hello3";  
}

@GetMapping("/hello4")  
public String hello4(@RequestParam List<String> arr) {  
    for(String item : arr){  
        System.out.println(item);  
    }  
    return "hello4";  
}

小结:

  • 数组:请求参数名与形参中数组变量名相同,可以直接使用数组封装
  • 集合:请求参数中集合变量名相同,通过@RequsetParam绑定参数关系

日期时间参数

java 复制代码
@GetMapping("/hello5")  
public String hello5(@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDateTime localDateTime) {  
    System.out.println(localDateTime);  
    return "hello5";  
}

Json参数

  • @RequestMapping 更通用,可以处理多种 HTTP 方法(GET、POST、PUT、DELETE 等)
  • @GetMapping 是专门为 GET 请求设计的,使代码更简洁明了
java 复制代码
@RequestMapping("/hello6")  
public String hello6(@RequestBody User user) {  
    System.out.println(user);  
    return "hello6";  
}

注:注意上面的注解和get请求不一样

路径参数

java 复制代码
//http://localhost:8080/hello7/1


@RequestMapping("/hello7/{id}")  
public String hello7(@PathVariable Integer id) {  
    System.out.println(id);  
    return "hello7";  
}

注:路径参数可以有多个,在后面加括号就好

响应数据

@ResponseBody

  • 类型:方法注解,类注解
  • 位置:Controller方法上/类上
  • 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为iJSON格式响应
  • 说明:@RestController = @Controller + @ResponseBody

响应结果的同一性:将响应数据封装到一个对象中,然后然会该对象

该对象

  • 统一的字段,来向前端人员描述一些信息
    • code:0/1 描述失败或者成功
    • message: 补充说明
  • data字段,可以将返回的数据封装在这里

该对象,对外提供很多静态方法

  • succesd ---> 里面提供构造方法
  • failed

补充:SpringBoot项目的静态资源(html,css,js)默认存放目录为:static ,public , resources

分层解耦

  • 三层框架
  • 分层解耦
  • IOC & DI 入门
  • IOC详解
  • DI 详解

三层架构

优点:复用性强,便于维护,利于扩展

  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
  • service:业务逻辑层,处理具体的业务逻辑
  • dao : 数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的CRUD

分层解耦

  • 内聚:软件中各个功能模块内部的功能联系

  • 耦合:衡量软件中各个层/模块之间的依赖,关联的程度

  • 软件设计原则:高内聚低耦合

  • 控制反转:Inversion Of Control,简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转

  • 依赖注入:Dependency Injection,简称DI,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入

  • Bean对象:IOC容器中创建,管理的对象,称之为bean

IOC 和 DI 的入门

  1. @Component 将当前类交给IOC容器,成为IOC容器中的bean
  2. @Autowired 运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 --> 依赖注入
注解 说明 位置
@Component 声明 bean 的基础注解 不属于以下三类时,用此注解
@Controller @Component 的衍生注解 标注在控制器类上
@Service @Component 的衍生注解 标注在业务类上
@Repository @Component 的衍生注解 标注在数据访问类上(由于与 mybatis 整合,用的少)

注:

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
  • 使用以上四个注解都可以声明bean,但是在soringboot集成web开发中,声明控制器bean只能用@Controller

Bean组件扫描

  • 声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
  • @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包

依赖注入

如果同类型的bean存在多个:

  • @Primary
  • @Autowired + Qualifier("bean的名称")
  • @Resource(name="bean的名称")

@Resource 与 @Autowired区别

  • @Autowired 是spring框架提供的注解,而@Resource 是JDK提供的注解
  • @Autowired 默认是安装类型注入,而@Resource默认是按照名称注入