java-web/docs/chapter04.md
2024-08-07 03:27:35 +08:00

483 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 4. 基于Java的Web应用后端开发技术
### 4.1 Web应用的系统架构介绍(了解)
#### 4.1.1 应用系统架构演进
- **单体架构**:
- **定义**: 单体架构是指将Web应用的所有功能集成在一个单一的应用程序中通常部署为单一的服务单元。
- **优点**: 开发简单,部署方便。
- **缺点**: 扩展性差,维护困难,部署更新时需要重启整个应用。
- **客户端/服务器架构 (C/S)**:
- **定义**: 架构模式将应用分为客户端和服务器两端,客户端负责展示和用户交互,服务器端负责数据处理和存储。
- **优点**: 强交互性,数据安全。
- **缺点**: 需要客户端软件,维护成本高。
- **浏览器/服务器架构 (B/S)**:
- **定义**: 用户通过浏览器访问服务器资源,所有的应用逻辑均在服务器端执行。
- **优点**: 跨平台,易于维护和升级。
- **缺点**: 过度依赖客户端浏览器和网络环境。
- **微服务架构**:
- **定义**: 将复杂应用拆解为一组小型、松散耦合的服务,每个服务围绕特定业务功能构建,可以独立部署和扩展。
- **优点**: 高度模块化,易于开发和维护,服务可独立扩展。
- **缺点**: 管理复杂性增加,需要有效的服务间通信和管理策略。
#### 4.1.2 服务器端渲染与客户端渲染
- **服务器端渲染 (SSR)**:
- **定义**: 服务器处理请求时生成完整的HTML内容然后发送给客户端。
- **优点**: 有利于SEO首屏加载速度快。
- **缺点**: 服务器负载增加,对动态内容响应较慢。
- **客户端渲染 (CSR)**:
- **定义**: 应用的初始加载只请求必要的数据然后客户端JavaScript动态生成页面内容。
- **优点**: 减轻服务器负担,交互响应快。
- **缺点**: SEO效果不佳首屏加载速度依赖于客户端性能。
- **两者的区别**:
- **SEO**: SSR 有利于SEOCSR 通过预渲染或服务端渲染来改善。
- **性能**: SSR 提供更快的首屏加载CSR 交互更流畅。
- **用户体验**: CSR 可以提供更流畅的用户交互SSR 用户体验取决于网络和服务器性能。
- **服务器负载**: SSR 可能增加服务器负载CSR 主要负载在客户端。
### 4.2 MVC设计模式掌握
参考[MVC 架构详解](https://www.freecodecamp.org/chinese/news/the-model-view-controller-pattern-mvc-architecture-and-frameworks-explained/)
参考[MVC&&JavaBean(PPT)](./resources/JavaBean与JSP开发模型.pptx)
#### 4.2.1 MVC模式概念
- **MVC (Model-View-Controller)**:
- **定义**: MVC是一种用于分离应用的输入、处理和输出的软件架构模式以提高应用的模块化。
- **模型 (Model)**: 负责数据和业务逻辑,是应用的状态。
- **视图 (View)**: 负责展示数据(模型),是应用的界面。
- **控制器 (Controller)**: 负责接收用户输入并调用模型和视图去完成用户的请求。
#### 4.2.2 视图层、业务逻辑层和数据访问层的职责划分
- **模型 (Model)**:
- 封装数据和业务规则。
- 通知视图数据变更。
- 可以包含数据访问对象 (DAO) 和业务逻辑类。
- **视图 (View)**:
- 显示数据给用户。
- 可以是JSP、HTML页面或使用模板引擎生成的页面。
- 接收用户输入并传递给控制器。
- **控制器 (Controller)**:
- 接收并解析用户输入。
- 调用模型处理业务逻辑。
- 选择视图并向用户展示结果。
#### 4.2.3 使用MVC模式的优点
- **分离关注点**: 将数据处理、业务逻辑和用户界面分离,降低耦合度。
- **提高可维护性**: 各层独立更新,易于定位问题和维护。
- **增强可测试性**: 每一层可以独立进行单元测试和集成测试。
- **提升可扩展性**: 可以独立扩展应用的某一部分而不影响其他部分。
- **促进代码复用**: 视图和控制器可以独立于模型变化,模型可以被多个视图重用。
#### 4.2.4 MVC模式的实现
- **框架支持**: 许多Web框架如Spring MVC实现了MVC模式。
- **流程**:
1. 用户通过视图发送请求。
2. 控制器接收请求并解析。
3. 控制器调用模型进行处理。
4. 模型更新后,控制器选择视图并返回响应。
### 4.3 Servlet基础知识
#### 4.3.1 JavaBean技术(掌握)
参考[MVC&&JavaBean(PPT)](./resources/JavaBean与JSP开发模型.pptx)
- **定义**: JavaBean是一种符合特定规范的Java类用于封装数据和行为。这些类通常用于表示简单的数据容器或小型应用程序组件。JavaBean的设计旨在方便集成到各种Java应用中特别是在Java Web应用中作为数据传输对象Data Transfer Objects, DTOs
- **特点**:
- **公共无参构造器**: JavaBean必须有一个公共的无参数构造器这样它们可以被反射创建。
- **属性**: JavaBean的属性应该通过标准的getter和setter方法暴露。属性名一般遵循驼峰命名规则例如`firstName`的getter方法为`getFirstName()`setter方法为`setFirstName(String firstName)`。
- **序列化**: JavaBean通常是可以序列化的这意味着它们可以通过实现`Serializable`接口来保存状态或者在网络间传输。
- **简单**: JavaBean通常不包含复杂的业务逻辑而是专注于数据的存储和检索。
- **使用场景**:
- **数据传输对象**: 在Web应用中JavaBeans常被用来封装从数据库或其他数据源获取的数据然后传递给视图层进行展示。
- **配置文件**: JavaBeans可以用作配置文件的模型例如在Spring框架中JavaBeans可以用来表示XML配置文件中的bean定义。
- **表单绑定**: 在Web应用中JavaBeans可以用来绑定表单数据简化数据的处理过程。
- **组件**: JavaBeans可以用作桌面应用中的组件如Swing组件就是基于JavaBean规范设计的。
- **示例**: 下面是一个简单的JavaBean示例用于表示一个用户对象
```java
public class User implements Serializable {
private String name;
private int age;
// 公共无参构造器
public User() {}
// Getter and Setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
```
这个简单的`User`类遵循了JavaBean的规范拥有两个属性`name`和`age`以及对应的getter和setter方法。
- **与EJB的区别**:
- JavaBeans通常是轻量级的用于封装数据而Enterprise JavaBeans (EJB) 是更重量级的企业级组件,包含业务逻辑,通常还涉及事务管理、安全性等方面。
- JavaBeans可以在任何Java环境中使用而EJB通常部署在应用服务器上。
- **总结**: JavaBean作为一种标准化的Java类为数据的封装和组件的重用提供了便利。在Java Web开发中JavaBeans常被用来处理数据传输和表单绑定的任务是构建MVC架构的重要组成部分。
#### 4.3.2 Servlet基本概念和原理(掌握)
- **Servlet**:
- 运行在服务器端的Java EE组件生成动态响应。
- 遵循Servlet API规范实现javax.servlet.Servlet接口。
- **Servlet生命周期**:
1. **实例化**: 容器创建Servlet实例。
2. **初始化**: 调用init()方法。
3. **服务**: 调用service()方法处理请求。
4. **销毁**: 请求完成后调用destroy()方法。
5. **垃圾回收**: Servlet实例被容器回收。
#### 4.3.3 Servlet API (掌握)
- **javax.servlet**: 定义了Servlet的主要接口和类。
- **javax.servlet.http**: 包含处理HTTP Servlet请求的类和接口。
- **HttpServletRequest**: 表示客户端发送的请求信息。
- **HttpServletResponse**: 表示服务器返回给客户端的响应信息。
#### 4.3.4 Servlet配置和映射(掌握)
- **web.xml配置**: 在传统的Servlet应用中通过web.xml配置Servlet的映射关系。
- **注解配置**: 使用@WebServlet等注解在Servlet类上直接配置映射。
#### 4.3.5 Servlet事件监听器(了解)
- **ServletContextListener**: 监听ServletContext的创建和销毁。
- **HttpSessionListener**: 监听HttpSession的创建和销毁。
- **其他监听器**: 用于监听请求、会话、上下文等事件。
#### 4.3.6 Servlet过滤器(了解)
- **Filter**: 用于在请求到达Servlet之前或响应发送给客户端之后执行过滤任务。
- **FilterChain**: 用于调用下一个过滤器或目标资源Servlet
#### 4.3.7 使用Servlet完成前端请求 (掌握)
- **示例**: 创建一个处理表单提交的Servlet。
```java
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户名和密码
if ("expectedUser".equals(username) && "expectedPassword".equals(password)) {
response.getWriter().write("Login successful!");
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Login failed!");
}
}
}
```
#### 4.3.8 Servlet安全(了解)
- **认证和授权**: Servlet容器提供认证和授权机制。
- **安全考虑**: 防止SQL注入、跨站脚本XSS和其他安全威胁。
#### 4.3.9 Servlet与现代Web框架(了解)
- **Spring框架**: 提供了更高级的Web开发特性如依赖注入、声明式事务管理等。
- **Spring MVC**: 扩展了Servlet API提供了更简洁的控制器实现方式。
#### 4.3.10 Servlet容器Tomcat介绍及使用 (了解)
- **定义**: Tomcat是一个免费的开放源代码的Servlet容器它实现了Servlet和JavaServer Pages (JSP) 规范同时也提供了HTTP服务器的功能。Tomcat由Apache Software Foundation (ASF) 开发和维护。
- **特点**:
- **轻量级**: Tomcat相对较小且易于部署适合开发和测试环境。
- **免费开源**: 它是一个开放源代码项目,任何人都可以下载和使用。
- **广泛支持**: Tomcat支持最新的Servlet和JSP规范。
- **跨平台**: Tomcat可以在多种操作系统上运行包括Windows、Linux、Mac OS等。
- **易于配置**: Tomcat通过XML配置文件进行配置易于理解和修改。
- **可扩展性**: Tomcat可以通过插件和其他扩展来增强功能。
- **安装和配置**:
- **下载**: 从官方网站 (https://tomcat.apache.org/) 下载最新版本的Tomcat。
- **解压**: 将下载的压缩包解压到一个目录中。
- **配置环境变量**: 可选地,设置`CATALINA_HOME`环境变量指向Tomcat的安装目录。
- **启动**: 在命令行中运行`bin/startup.sh` (Linux) 或 `bin/startup.bat` (Windows)。
- **部署应用**:
- **WAR文件**: 将应用打包成WAR文件然后将其放置在`webapps`目录下。
- **解压部署**: 如果应用已经是一个WAR文件Tomcat会自动解压它并部署。
- **目录部署**: 也可以将应用作为一个目录放置在`webapps`目录下。
- **配置文件**:
- **server.xml**: 位于`conf`目录下是Tomcat的主要配置文件用于配置端口、连接器等。
- **web.xml**: 位于每个Web应用的`WEB-INF`目录下用于配置该应用的具体细节如Servlet映射等。
- **context.xml**: 位于`conf`目录下,用于配置全局的上下文参数。
- **示例**: 部署一个简单的Servlet应用。
(1) **创建Servlet**:
```java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloWorldServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body></html>");
}
}
```
(2) **配置web.xml**:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
```
(3) **部署应用**:
- 创建一个目录,例如`myapp`,并将上述文件放入其中。
- 将`myapp`目录复制到Tomcat的`webapps`目录下。
- 重启Tomcat。
(4) **访问应用**:
- 在浏览器中输入`http://localhost:8080/myapp/hello`。
(5) **管理界面**:
- Tomcat自带了一个管理界面可以用来管理应用、查看日志等。
- 通过`http://localhost:8080/manager/html`访问管理界面(需要启用管理界面并配置用户名密码)。
(6) **日志文件**:
- Tomcat的日志文件位于`logs`目录下,包括访问日志和错误日志等。
(7) **性能调优**:
- 通过配置文件(如`server.xml`)调整连接器设置、线程池大小等。
- 使用外部日志框架如Log4j替换默认的日志系统。
### 4.4 后端模板引擎技术介绍(了解)
#### 4.4.1 JSP的介绍和示例
##### JSP技术概述
- **JSP (JavaServer Pages)**:
- **定义**: JSP是一种动态网页技术允许Java代码嵌入HTML页面中由服务器在请求时处理这些代码生成动态内容。
- **运行机制**: JSP页面首次请求时被编译成Servlet之后像Servlet一样处理请求。
##### JSP组成元素
- **JSP指令元素**: 用于控制JSP的编译和行为如页面指令`<%@ page %>`。
- **JSP脚本元素**:
- **脚本片段**: `<% %>`内编写Java代码。
- **表达式**: `<%= %>`输出Java表达式结果。
- **JSP声明**: `<%! %>`内声明变量和方法。
- **JSP注释**:
- HTML注释被发送到客户端显示在源码中。
- JSP注释`<%-- --%>`,不被发送到客户端。
- **JSP动作元素**: 使用XML语法控制JSP的执行流程如包含其他页面`<jsp:include>`。
##### JSP内置对象
- JSP技术提供了一些预定义的对象用于简化开发
- `request`: 封装客户端请求信息。
- `response`: 封装响应信息发送给客户端。
- `session`: 跟踪用户会话状态。
- `application`: 代表整个Web应用的范围。
- `out`: 输出内容到响应对象。
- `config`: 访问Servlet的配置信息。
- `pageContext`: 提供对所有JSP内置对象的访问。
- `exception`: 处理页面级异常。
##### JSP的生命周期
**编译阶段**: JSP页面首次请求时被编译成Servlet类。
**初始化阶段**: Servlet的`init()`方法被调用。
**执行阶段**: 对每个请求调用Servlet的`service()`方法。
**销毁阶段**: Servlet的`destroy()`方法被调用,准备卸载。
##### JSP的使用场景
- **生成动态内容**: 根据数据库查询结果动态生成网页。
- **页面导航**: 根据用户输入重定向到不同的页面。
- **表单处理**: 接收和处理HTML表单数据。
##### JSP示例
- **示例**: 创建一个显示当前日期和消息的JSP页面。
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>JSP Example</title>
</head>
<body>
<h1>The Current Date and Time is:</h1>
<p><%= new java.util.Date() %></p>
<%-- 使用JSP表达式输出日期 --%>
<h1>Welcome to JSP!</h1>
<p>Below is a simple message displayed using JSP.</p>
<%-- 使用HTML注释 --%>
<%
String message = "Hello, JSP!";
// JSP脚本片段可以包含多行Java代码
%>
<p><%= message %></p>
<%-- 使用JSP表达式输出变量 --%>
</body>
</html>
```
##### JSP与Servlet的关系
- JSP本质上是一种Servlet它在服务器上被编译成Servlet类。
- Servlet可以作为JSP的底层支持处理HTTP请求和生成响应。
##### JSP的最佳实践
- **避免业务逻辑**: 尽量将业务逻辑放在后端Java类中保持JSP页面的简洁。
- **使用表达式和脚本**: 利用JSP表达式输出数据使用脚本片段编写控制逻辑。
- **模板和标签**: 使用标签库和自定义标签减少页面模板的重复代码。
#### 4.4.2 Thymeleaf的介绍和示例
- **定义**: Thymeleaf 是一个适用于现代Web应用的服务器端模板引擎。
- **特性**:
- **自然模板**: 允许HTML标记保持完整即使在没有数据的情况下也能在浏览器中正确显示。
- **易于前后端分离**: 前端开发者可以在不依赖后端的情况下构建和测试页面。
- **内建方言扩展**: 提供多种方言如标准方言、Spring方言等以满足不同场景的需求。
- **静态资源处理**: 支持直接在HTML中引用静态资源无需额外配置。
- **与JSP的比较**:
- **静态资源处理**: 在JSP中静态资源如CSS、JavaScript和图片文件通常需要通过特殊的标签或表达式来引用。而在Thymeleaf中可以直接像普通HTML那样引用静态资源。
- **浏览器兼容性**: Thymeleaf的一个重要特点是它能够在没有后端服务器的情况下被浏览器正常解析。这意味着开发人员可以在本地开发环境中预览页面而无需每次刷新都请求服务器数据。相比之下JSP页面需要服务器环境的支持才能被正确解析和渲染。
- **前后端分离**: Thymeleaf的设计允许前端开发者在没有后端数据的情况下构建和测试页面这有助于前后端团队并行工作提高开发效率。而JSP通常需要后端的支持才能显示动态内容。
- **示例**: 使用 Thymeleaf 表达式语言在页面中显示动态内容。
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}">Thymeleaf Example</title>
</head>
<body>
<h1 th:text="${greeting}">Hello, Thymeleaf!</h1>
<p th:text="${message}">Welcome to Thymeleaf.</p>
<!-- 示例: 静态资源引用 -->
<link rel="stylesheet" href="/css/style.css" th:href="@{/css/style.css}" />
<script src="/js/app.js" th:src="@{/js/app.js}"></script>
</body>
</html>
```
Thymeleaf 提供了一个更现代且高效的模板解决方案,尤其适合前后端分离的开发模式。
相比于传统的 JSP 技术Thymeleaf 在开发效率和浏览器兼容性方面具有明显的优势。
Thymeleaf也是spring mvc的默认模板引擎。
#### 4.4.3 Freemarker介绍
- **定义**: Freemarker 是一个强大的模板引擎用于生成文本输出特别适合生成HTML网页。它可以应用于多种应用场景包括Web开发、邮件模板生成等。
- **特性**:
- **高性能**: 由于其设计上的优化Freemarker能够快速地处理大量的数据并生成所需的输出。
- **宏支持**: 提供了宏定义功能,使得模板可以复用代码片段,便于维护和扩展。
- **复杂的模板逻辑**: 支持复杂的条件语句、循环结构以及其他高级编程特性,使得开发者能够灵活地控制输出内容。
- **与Thymeleaf的比较**:
- **模板语法**: Freemarker的模板语法更加接近于编程语言提供了丰富的控制结构如`#foreach`、`#if`等这使得编写复杂的逻辑更为容易。而Thymeleaf则倾向于提供一种更为简洁和接近HTML的语法使得模板更容易阅读和维护。
- **前后端分离**: Thymeleaf的设计更加倾向于支持前后端分离的工作流程允许前端开发者在没有后端数据的情况下构建和测试页面。Freemarker虽然也可以在客户端渲染但其主要还是作为服务器端模板引擎使用。
- **浏览器兼容性**: Thymeleaf的一个显著优势是在没有后端服务器的情况下浏览器也能正确解析其模板。Freemarker通常需要服务器环境的支持才能完全发挥作用。
- **示例**: 使用Freemarker表达式语言在页面中显示动态内容。
```freemarker
<!DOCTYPE html>
<html>
<head>
<title>${title!}</title>
</head>
<body>
<h1>${greeting!}</h1>
<p>${message!}</p>
<!-- 示例: 列表循环 -->
<#list users as user>
<div>User: ${user.name}</div>
</#list>
</body>
</html>
```
Freemarker 提供了一个强大且灵活的模板解决方案,特别适用于需要复杂逻辑处理的场景。与 Thymeleaf 相比Freemarker 更加注重性能和逻辑的灵活性,但 Thymeleaf 在前后端分离和支持静态资源方面具有优势。
### 4.5 流行的Java Web开发框架介绍(了解)
#### 4.5.1 Spring
- **定义**: Spring 是一个开源的Java平台提供全面的基础设施支持。
- **核心特性**:
- 依赖注入 (DI) 使得组件之间的耦合度降低。
- 面向切面编程 (AOP) 用于实现方法间的横切关注点。
- 事务管理简化了应用程序中事务的配置和使用。
#### 4.5.2 Micronaut
- **定义**: Micronaut 是一个现代的、基于Java的平台用于构建模块化、易于测试的微服务。
- **优势**:
- 快速启动和运行,适合微服务架构。
- 支持编译时注解处理和AOTAhead-of-Time编译。
#### 4.5.3 Quarkus
- **定义**: Quarkus 是一个用于Java的全栈框架专注于开发者体验和性能。
- **优势**:
- 快速的启动时间和运行时性能。
- 原生支持Kubernetes和容器化适合云环境