mirror of
https://gitee.com/many2many/java-web.git
synced 2025-01-11 22:50:54 +08:00
277 lines
12 KiB
Markdown
277 lines
12 KiB
Markdown
## 1. Web开发的基本概念
|
||
|
||
|
||
> Web应用是基于 Web 技术开发的应用程序,用户可以通过浏览器访问和使用,而无需下载和安装应用。Web应用可以在不同的设备和平台上运行,无需针对不同的操作系统进行开发和维护,具有较好的跨平台兼容性。
|
||
|
||
> Java Web开发是指使用Java语言来构建和维护可以在Web浏览器上运行的应用程序的过程。这些应用程序通常由服务器端组件和客户端组件组成,服务器端负责处理业务逻辑并提供数据给客户端,而客户端则负责显示数据并允许用户与之交互。
|
||
|
||
## 2. web前端开发基础
|
||
|
||
### HTTP协议
|
||
|
||
**URL: Uniform Resource Locator 统一资源定位符**
|
||
> URL是URI的子集,URL包含访问资源所需的协议类型(如HTTP、HTTPS、FTP)和资源的位置.
|
||
|
||
#### HTTP请求包结构
|
||
|
||
一个完整的HTTP请求包通常包含三部分:
|
||
- 请求行:包含请求方法Method、请求的URL和HTTP版本。
|
||
- 请求头:包含一系列键值对,提供了关于请求的额外信息,如客户端类型、接受的内容类型等。
|
||
- 请求体:请求体并不是所有HTTP请求都有的部分;主要用于包含要发送给服务器的数据,如表单数据、上传的文件内容等.
|
||
|
||
![](./imgs/http-request-struct.png)
|
||
|
||
|
||
#### HTTP请求方法
|
||
|
||
- Get: 获取资源
|
||
- Post: 创建资源
|
||
- Put: 更新资源
|
||
- Delete: 删除资源
|
||
|
||
#### HTTP常见状态码
|
||
- **200 OK:** 请求成功。
|
||
- **403 Forbidden:** 请求失败,服务器拒绝执行请求。
|
||
- **404 Not Found:** 请求失败,服务器上没有请求的资源。
|
||
- **500 Internal Server Error:** 请求失败,服务器出现未知的内部错误。
|
||
|
||
#### Cookie
|
||
|
||
HTTP 是 `无状态协议`。
|
||
|
||
Cookie是为了解决HTTP协议无状态的问题而设计的一种持久化机制,它允许服务器在用户浏览器上存储数据。Cookie 的数据保存在用户浏览器中,服务器可以通过 Cookie 识别用户,从而实现用户个性化。
|
||
|
||
Cookie 主要用于以下三个方面:
|
||
- 会话状态管理
|
||
- 个性化设置
|
||
- 浏览器行为跟踪
|
||
|
||
### HTML/CSS/JavaScript基础
|
||
|
||
#### HTML5基础知识
|
||
|
||
HTML 元素的定义:
|
||
![](../resources/imgs/grumpy-cat-small.png)
|
||
- 开始标签(Opening tag):包含元素的名称(本例为 p),被左、右角括号所包围。开头标签标志着元素开始或开始生效的地方。在这个示例中,它在段落文本的开始之前。
|
||
- `内容`(Content):元素的内容,本例中就是段落的文本。
|
||
- 结束标签(Closing tag):与开始标签相似,只是其在元素名之前包含了一个斜杠。这标志着该元素的结束。没有包含关闭标签是一个常见的初学者错误,它可能会产生奇特的结果。
|
||
|
||
元素也可以拥有属性,属性看起来像这样:
|
||
![](./imgs/grumpy-cat-attribute-small.png)
|
||
属性包含元素的额外信息,这些信息不会出现在实际的内容中。在上述例子中,`class` 属性用于设置 HTML 元素的类名。
|
||
|
||
#### CSS
|
||
|
||
在HTML文档中,使用`link`标签可以将外部CSS文件链接到网页中,以定义样式。 使用`style`标签,在HTML文档中直接定义样式。
|
||
|
||
css的选择器:
|
||
|
||
| 选择器类型 | 解释 | 示例 |
|
||
| ------------ |-----------------------------------|-----------------------------------------------------------------------|
|
||
| **元素选择器** | 也叫标签选择器,通过标签名选取元素 | `div { color: red; }` 选取所有 `<div>` 元素,将文本颜色设置为红色。 |
|
||
| **类选择器** | 通过类名选取元素 | `.class-name { font-weight: bold; }` 选取具有类名为 `class-name` 的元素,使其字体加粗。 |
|
||
| **ID选择器** | 通过ID名称选取唯一元素 | `#id-name { background-color: yellow; }` 选取ID为 `id-name` 的元素,背景色设为黄色。 |
|
||
| **通配符选择器** | 匹配所有元素 | `* { margin: 0; padding: 0; }` 选取所有元素,清除默认的外边距和内边距。 |
|
||
|
||
css的块级元素和行内元素:
|
||
- **块级元素**:块级元素会独占一行,其宽度默认为父元素的100%。常见的块级元素有`<div>`, `<p>`等。
|
||
- **行内元素**:行内元素不会独占一行,其宽度默认为内容宽度。常见的行内元素有`<span>`, `<a>`等。
|
||
|
||
#### JavaScript
|
||
|
||
javascript中定义变量的关键字有:`let`, `const`, `var` . 其中`const`用于声明一个常量。
|
||
|
||
##### DOM操作
|
||
|
||
**选择元素**:
|
||
- document.getElementById(): 根据元素ID获得对应的dom对象。
|
||
- document.getElementsByClassName(): 根据元素类名获得对应的dom对象列表。
|
||
- document.querySelector(): 根据选择器获得对应的dom对象。
|
||
|
||
例如,在DOM操作中,用于获取元素的ID为example的方法是: document.getElementById("example")。
|
||
|
||
综合示例, 实现一个计数器:
|
||
|
||
```html
|
||
<html>
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>计数器</title>
|
||
</head>
|
||
<body>
|
||
<h1>计数器: <span id="counter"> 0 </span></h1>
|
||
<button id="button">增加</button>
|
||
|
||
<script>
|
||
let number = 0;
|
||
// 获取id为counter的元素
|
||
const counter = document.getElementById('counter');
|
||
// 获取id为button的元素
|
||
const button = document.getElementById('button');
|
||
|
||
// 为按钮绑定点击事件, 点击后number自增并更新到span中
|
||
button.addEventListener('click', function() {
|
||
number++;
|
||
counter.innerText = number;
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|
||
```
|
||
JavaScript中,回调函数是一种函数,作为参数传递给另一个函数,并在这个函数内部被调用。在上面的例子中,`button.addEventListener('click', function() {})` 中第二个参数就是一个回调函数。
|
||
|
||
##### AJAX
|
||
AJAX 技术主要用于实现页面的部分更新。 AJAX 请求的响应数据的格式,常用的有:JSON 、XML。
|
||
|
||
通过浏览器访问服务器资源时,服务器端返回的数据很多形式,常见的有JSON、XML、HTML等。
|
||
|
||
XML 是一种用于定义文档结构和存储数据的标记语言。常用于不同系统之间的数据交换。广泛用于Web服务、配置文件、数据交换等多种场景.
|
||
|
||
JSON是一种轻量级的数据交换格式,广泛用于Web应用的数据交换格式,特别是在Ajax应用中。
|
||
|
||
在JavaScript中,可使用 `JSON.parse()` 方法将JSON字符串转换为JavaScript对象。
|
||
|
||
在js中可以使用 XMLHttpRequest 对象来发送AJAX请求. 在javascript 新版本中, `fetch` API 用来替代 `XMLHttpRequest`,它提供了更简洁的语法和基于 `Promise` 的接口。 使用Fetch API 的时候,需要注意 response.json() 方法返回的是一个 `Promise` 对象。
|
||
|
||
|
||
## 3. Servlet
|
||
|
||
MVC(Model-View-Controller)设计模式是一种软件架构模式,用于将应用程序的逻辑、数据和用户界面分离,以提高代码的可维护性和可扩展性。
|
||
- 模型(Model):负责管理应用程序的数据和业务逻辑。
|
||
- 视图(View):负责显示数据,即用户界面。
|
||
- 控制器(Controller):负责处理用户输入,协调模型和视图之间的交互。
|
||
|
||
Java Web开发中常用的Servlet容器是 `Tomcat`,是一个开放源代码的Servlet容器。
|
||
|
||
JSP页面中包含Html代码和Java代码。 使用标签`<% %>` 在JSP页面中嵌入Java代码片段, 使用`<%= %>` 输出变量。
|
||
|
||
Servlet的doGet()方法是处理HTTP GET请求的,doPost()方法是处理HTTP POST请求的。
|
||
|
||
JavaBean的必要特征:
|
||
- 具有一个公共的无参构造器
|
||
- 属性通过公共的`getter`和`setter`方法进行访问.(JavaBean的属性应该通过标准的getter和setter方法暴露.)
|
||
- 不包含复杂的业务逻辑,主要用于保存数据
|
||
|
||
## 4. Spring Boot
|
||
|
||
### 构建工具
|
||
|
||
Maven和Gradle都可以作为Spring Boot项目的构建工具来使用。
|
||
|
||
使用Gradle构建Spring Boot项目时,配置项目依赖时,需要在gradle的配置文件`build.gradle` 中的配置块`dependencies` 部分添加依赖.
|
||
|
||
### Spring Boot基础
|
||
|
||
Spring Boot 是一个基于Spring框架的轻量级框架,它简化了Spring应用的创建和开发过程。
|
||
|
||
Spring Boot 不仅能用于开发Web应用, Spring Boot提供了丰富的功能和特性,使得开发者能够更快地构建和运行现代化的应用程序。
|
||
|
||
Spring Boot提供了内嵌的Servlet服务器`Tomcat`,开发者无需单独部署Servlet容器即可运行Spring Boot应用。 Spring Boot应用默认的监听端口是 `8080`。
|
||
|
||
Spring Boot应用默认使用的配置文件是 `application.yml` 或 `application.properties` 。
|
||
|
||
### Spring Boot应用的启动类
|
||
|
||
spring boot应用的入口类(启动类),此类上必须要有注解 `@SpringBootApplication`,入口类示例如下:
|
||
```java
|
||
@SpringBootApplication
|
||
public class MyApp {
|
||
public static void main(String[] args) {
|
||
SpringApplication.run(MyApp.class, args);
|
||
}
|
||
|
||
}
|
||
```
|
||
|
||
### Spring Boot中控制器类中常用注解
|
||
|
||
* @Autowired注解的作用是 `自动注入依赖的Bean实例`。
|
||
|
||
* @RestController注解用于创建RESTful风格的控制器,自动将返回对象转换为JSON。
|
||
|
||
* @RequestMapping注解用于定义请求路径和请求方法。
|
||
|
||
* @GetMapping注解用于定义GET请求路径。
|
||
|
||
* @PostMapping注解用于定义POST请求路径。
|
||
|
||
* @RequestBody注解获取HTTP请求的请求体.
|
||
|
||
* @PathVariable注解用于获取URL路径中的参数.
|
||
|
||
RestController类示例:
|
||
|
||
```java
|
||
// 注解Restcontroller表明这个类是控制器类
|
||
@RestController
|
||
// 注解RequestMapping可设置父路径
|
||
@RequestMapping("/api/users")
|
||
public class UserController {
|
||
// GetMapping注解表示此方法对应的是Get请求. {id}表示从路径中获取用户id
|
||
@GetMapping("{id}")
|
||
public User getUser(@PathVariable Long id) {
|
||
// 根据用户ID获取用户信息的逻辑
|
||
}
|
||
//@PutMapping 注解表示对应Post请求
|
||
@PostMapping
|
||
public User create( @RequestBody User user) {
|
||
// 创建新用户的逻辑
|
||
}
|
||
}
|
||
```
|
||
|
||
### JPA
|
||
|
||
JDBC是Java编程语言中用于和数据库交互的一组API。它提供了一个通用的接口,使得Java应用程序能够连接到各种不同的数据库管理系统(DBMS),执行查询和更新操作,并处理返回的结果集。
|
||
|
||
JPA是一个Java持久化标准,用于将Java对象持久化到关系数据库中 。JPA不是一个ORM框架,而是一个规范。在spring boot中,我们使用spring data jpa来实现JPA。
|
||
|
||
ORM (对象关系映射,Object-Relational Mapping) 是一种编程技术,用于将对象模型映射到关系型数据库模型。 ORM框架的主要目的是简化数据库操作,提高开发效率。
|
||
|
||
@Entity 注解用于标记一个类为实体类,表示该类将映射到数据库中的表。
|
||
|
||
@Table 注解用于指定实体类对应的数据库表名。
|
||
|
||
JpaRepository接口提供了基本的CRUD(创建、读取、更新和删除)操作方法,以及分页和排序功能。
|
||
|
||
我们需要为实体类创建一个接口,继承JpaRepository接口,并指定实体类和主键类型,这样Spring Data JPA就会自动为该接口生成实现类,并提供相应的数据库操作方法。
|
||
|
||
|
||
以下为JPA的示例:
|
||
|
||
实体类User:
|
||
```java
|
||
// 使用注解Entity声明User类是一个实体类
|
||
@Entity
|
||
public class User{
|
||
// id是主键,需要添加注解id
|
||
@id
|
||
// 主键自增
|
||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||
Long id;
|
||
|
||
//用户名,在数据库表中对应的字段名user_name,需要使用注解Column
|
||
@Column(name = "user_name")
|
||
String name;
|
||
|
||
// 密码
|
||
String password;
|
||
|
||
// 年龄
|
||
Integer age;
|
||
}
|
||
```
|
||
|
||
实现实体类User的数据库接口UserRepository:
|
||
|
||
```java
|
||
|
||
public interface UserRepository extends JpaRepository<User, Long> {
|
||
// 根据用户名查找用户
|
||
User findByName(String name);
|
||
// 查找大于指定年龄的用户
|
||
List<User> findByAgeGreaterThan(Integer age);
|
||
}
|
||
```
|
||
|