## 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 有利于SEO,CSR 通过预渲染或服务端渲染来改善。 - **性能**: SSR 提供更快的首屏加载,CSR 交互更流畅。 - **用户体验**: CSR 可以提供更流畅的用户交互,SSR 用户体验取决于网络和服务器性能。 - **服务器负载**: SSR 可能增加服务器负载,CSR 主要负载在客户端。 ### 4.2 MVC设计模式(掌握) 参考[MVC&&JavaBean(PPT)](./resources/JavaBean与JSP开发模型.pptx) #### 4.2.1 MVC概念 > MVC(Model-View-Controller)是一种强调分离软件的业务逻辑和显示的软件设计模式。这种模式的核心在于实现关注点的分离,即将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。 #### 4.2.2 视图层、业务逻辑层和数据访问层的职责划分 - **模型 (Model)**: - 封装数据和业务规则。 - 通知视图数据变更。 - 可以包含数据访问对象 (DAO) 和业务逻辑类。 > 模型是应用程序中用于处理数据逻辑的部分。它直接管理数据、逻辑和规则,并提供数据访问的接口。模型不依赖于视图和控制器,即它不关心数据将如何被显示或操作。 - **视图 (View)**: - 显示数据给用户。 - 可以是JSP、HTML页面或使用模板引擎生成的页面。 - 接收用户输入并传递给控制器。 > 视图是应用程序中用于数据显示的部分。它实现了模型中数据的可视化。 - **控制器 (Controller)**: - 接收并解析用户输入。 - 调用模型处理业务逻辑。 - 选择视图并向用户展示结果。 > 控制器是模型和视图之间的协调者。它接收用户的输入,并调用模型和视图去完成用户的请求。控制器的存在使得视图与模型能够分离. #### 4.2.3 使用MVC模式的优点 - **分离关注点**: 将数据处理、业务逻辑和用户界面分离,降低耦合度。 - **提高可维护性**: 各层独立更新,易于定位问题和维护。 - **增强可测试性**: 每一层可以独立进行单元测试和集成测试。 - **提升可扩展性**: 可以独立扩展应用的某一部分而不影响其他部分。 - **促进代码复用**: 视图和控制器可以独立于模型变化,模型可以被多个视图重用。 #### 4.2.4 MVC模式的实现 - **框架支持**: 许多Web应用开发框架都支持,比如spring mvc。 示例:典型的MVC模式的实现:jsp+servlet+javabean ![](./resources/imgs/jsp_javabean_mvc.jpg) - JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。 - JSP作为视图层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。 - Servlet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。 ### 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方法。 - **总结**: JavaBean作为一种标准化的Java类,为数据的封装和组件的重用提供了便利。在Java Web开发中,JavaBeans常被用来处理数据传输和表单绑定的任务,是构建MVC架构的重要组成部分。 #### 4.3.2 Servlet基本概念(掌握) **Servlet 的基本概念** - **定义:** Servlet(Java Servlet的简称)是一种基于Java的Web组件,它运行在服务器端,用于接收客户端(通常是Web浏览器)的请求、处理这些请求,并生成响应。Servlet遵循特定的Java API,这些API定义了Servlet必须实现的方法和行为。Servlet通常用于处理HTTP协议的请求和响应,但也可以处理其他类型的请求。 - **生命周期:** Servlet 的生命周期包括初始化、服务请求和销毁三个阶段。Servlet 初始化时,容器会调用其 init() 方法;当请求到来时,容器会调用其 service() 或者 doGet(), doPost() 等方法;当 Servlet 不再需要时,容器会调用其 destroy() 方法。 - **继承关系**: Servlet 类通常需要继承 javax.servlet.http.HttpServlet 类,并重写其中的 doGet() 或 doPost() 等方法来处理具体的 HTTP 请求。也可以直接实现 javax.servlet.Servlet 接口,但这在实际开发中较少见。 **Servlet的主要特点包括:** * 基于Java:Servlet是用Java语言编写的,并且运行在支持Java的Web服务器或应用服务器上。 * 遵循Servlet API:Servlet实现了javax.servlet包中的Servlet接口,这个接口定义了所有Servlet必须遵守的生命周期方法,如init(), service(), destroy()等。 * 处理HTTP请求:Servlet主要用于处理HTTP请求,如GET、POST、PUT、DELETE等,但也可以处理其他类型的请求。 * 生成HTTP响应:Servlet可以生成HTTP响应,包括响应头、状态码和响应体。 * 运行在Web容器中:Servlet运行在Web容器(如Apache Tomcat、Jetty、WildFly)中,这些容器管理Servlet的生命周期,并负责将客户端请求路由到相应的Servlet。 * 可扩展性:Servlet API支持过滤器(Filters)、监听器(Listeners)和其他中间件组件,这些组件可以与Servlet一起工作,提供请求处理、事件处理和应用生命周期管理等功能。 * 平台无关性:由于Servlet是基于Java的,因此可以在任何支持Java的平台上运行,实现了跨平台的特性。 #### 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("
"); out.println("<%= new java.util.Date() %>
<%-- 使用JSP表达式输出日期 --%>Below is a simple message displayed using JSP.
<%-- 使用HTML注释 --%> <% String message = "Hello, JSP!"; // JSP脚本片段可以包含多行Java代码 %><%= message %>
<%-- 使用JSP表达式输出变量 --%> ``` ##### 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 表达式语言在页面中显示动态内容。 ```htmlWelcome to Thymeleaf.
``` 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${message!}
<#list users as user>