本文提供了详细的JAVA Web项目教程,涵盖了从环境搭建到项目部署的全过程。内容包括Java Web开发环境的搭建、常用开发工具的使用、Web应用的基本结构和数据库操作等。此外,文章还介绍了MVC架构和Spring MVC的实际应用,以及前端技术的基础知识。最后,文章详细讲解了项目部署和调试的技巧。
Java Web开发基础Java Web开发环境搭建
Java Web开发环境包含了一系列的软件工具和库,用于创建和部署Web应用程序。以下步骤将指导你如何搭建Java Web开发环境。
1. 安装Java开发工具包(JDK)
首先,你需要安装Java开发工具包(JDK),这是编写和运行Java应用程序的基础。
-
下载JDK
打开Oracle官方网站(https://www.oracle.com/java/technologies/javase-downloads.html)或OpenJDK官方网站(https://openjdk.java.net/),下载适合你操作系统的JDK安装包。 - 安装JDK
安装过程中,按照提示完成安装。安装完成后,设置环境变量JAVA_HOME
和PATH
指向JDK的安装目录。
# 设置环境变量
export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH
2. 安装Web服务器(Tomcat)
Tomcat是Java的一个开源Web服务器,常用于开发和测试Java Web应用程序。
-
下载Tomcat
访问Tomcat官方网站(https://tomcat.apache.org/),下载适合你操作系统的Tomcat版本。 - 配置Tomcat
解压下载的Tomcat安装包到指定目录,并设置环境变量CATALINA_HOME
指向Tomcat的安装目录。
export CATALINA_HOME=/path/to/tomcat
- 启动Tomcat
启动Tomcat服务器,可以通过bin/startup.sh
脚本启动。
cd $CATALINA_HOME/bin
./startup.sh
常用开发工具介绍
开发Java Web应用程序通常需要使用集成开发环境(IDE)来提高开发效率。以下是几个常用的IDE工具:
1. Eclipse
Eclipse是一款免费且开源的IDE,支持多种编程语言,包括Java。
-
安装Eclipse
访问Eclipse官方网站(https://www.eclipse.org/downloads/),下载适合你操作系统的Eclipse版本,并安装。 - 配置Eclipse
在Eclipse中配置Java开发环境,确保Java Development Tools (JDT)
插件已安装。
2. IntelliJ IDEA
IntelliJ IDEA是一款商业化的IDE,提供全面的开发工具和功能。
-
下载IntelliJ IDEA
访问JetBrains官方网站(https://www.jetbrains.com/idea/),注册并下载试用版或购买专业版。 - 配置IntelliJ IDEA
安装完成后,在IntelliJ IDEA中配置Java开发环境,确保已安装Java
插件。
Web应用的基本结构
Java Web应用程序通常由以下几部分组成:
1. Web应用的目录结构
一个基本的Java Web应用程序通常包含以下目录结构:
WebRoot
|-- WEB-INF
|-- classes
|-- lib
|-- web.xml
-
WebRoot
应用程序的根目录,包含所有的HTML、CSS、JavaScript文件,以及静态资源文件。 -
WEB-INF
包含Web应用程序的配置文件和类文件。lib
目录用于存放第三方库,classes
目录用于存放编译后的.class
文件。 - web.xml
应用程序的部署描述符文件,用于配置Servlet、过滤器(Filter)、监听器(Listener)等。
2. 配置文件web.xml
web.xml
文件是Web应用程序的配置文件,位于WEB-INF
目录下。以下是web.xml
文件的基本结构:
<web-app>
<display-name>MyFirstWebApp</display-name>
<description>My First Web Application</description>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
-
servlet
配置Servlet的名称和实现类。 - servlet-mapping
配置要映射的URL路径。
Servlet的基本概念和使用
Servlet是Java平台上的一个服务器端组件,用于扩展Web服务器的功能,提供动态Web内容。
1. Servlet的生命周期
Servlet的生命周期包括三个主要阶段:初始化(Initialization)、服务(Service)、销毁(Destruction)。
-
初始化
当Servlet被加载到容器中时,会调用init()
方法进行初始化。 -
服务
当客户端请求Servlet时,容器会调用service()
方法处理请求。 - 销毁
当Servlet不再被使用时,容器会调用destroy()
方法进行清理。
2. 编写Servlet
以下是一个简单的Servlet示例代码:
package com.example;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, World!</h1>");
}
}
-
@WebServlet("/myServlet")
使用@WebServlet
注解定义Servlet的URL路径。 - doGet()
处理HTTP GET请求。
JSP的基础语法和标签
JSP(JavaServer Pages)是Java平台上的动态Web内容技术,允许在HTML页面中嵌入Java代码。
1. JSP标签
JSP标签是一种特殊的标记,用于插入动态内容或执行特定的操作。
-
脚本元素
<% %>
:Java代码段
<%! %>
:声明变量或方法
<%= %>
:输出表达式的值 - 指令元素
<%@ page %>
:定义页面属性
<%@ include %>
:包含文件
<%@ taglib %>
:引入标签库
2. 编写JSP页面
以下是一个简单的JSP页面示例代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My First JSP Page</title>
</head>
<body>
<h1>Welcome to My First JSP Page!</h1>
<p>The current date is <%= new java.util.Date() %></p>
</body>
</html>
-
<%@ page %>`
定义页面的属性,如语言和内容类型。 - <%= new java.util.Date() %>
输出当前日期。
Servlet与JSP的集成使用
在Java Web开发中,Servlet经常用于处理请求,而JSP页面则用于生成响应内容。
1. Servlet和JSP的协同工作
Servlet处理业务逻辑,而JSP页面负责生成动态的HTML页面。
-
Servlet处理请求
Servlet处理客户端的请求,并调用相应的服务方法。 - JSP生成响应
Servlet将数据传递给JSP页面,JSP页面生成动态的HTML内容返回给客户端。
2. 示例代码
以下是一个简单的Servlet和JSP集成的示例:
Servlet代码:
package com.example;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("message", "Hello, World!");
request.getRequestDispatcher("/jspPage.jsp").forward(request, response);
}
}
JSP页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
-
request.getAttribute()
Servlet将数据传递给JSP页面。 - request.getRequestDispatcher()
Servlet转发请求到JSP页面。
JDBC连接数据库的基本方法
JDBC(Java Database Connectivity)提供了一组API用于在Java应用程序中连接和操作数据库。
1. JDBC连接数据库的基本步骤
-
加载驱动
加载数据库驱动类,建立与数据库的连接。 -
建立连接
建立到数据库的连接,使用DriverManager.getConnection()
方法。 -
执行SQL语句
创建Statement
对象或PreparedStatement
对象执行SQL语句。 - 处理结果集
处理从数据库返回的结果集。
2. 示例代码
以下是一个简单的JDBC连接数据库的示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 建立连接
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 执行SQL语句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 4. 处理结果集
while (rs.next()) {
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
Class.forName("com.mysql.jdbc.Driver")
加载MySQL数据库驱动。 - DriverManager.getConnection(url, user, password)
建立到数据库的连接。
3. 数据库操作的示例
以下是一个数据库操作的完整示例,包括插入、查询和删除操作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DatabaseExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 插入操作
insertData(conn, "John Doe", 30);
// 查询操作
queryData(conn);
// 删除操作
deleteData(conn, 123);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void insertData(Connection conn, String name, int age) throws Exception {
String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, name);
stmt.setInt(2, age);
stmt.executeUpdate();
}
}
private static void queryData(Connection conn) throws Exception {
String sql = "SELECT * FROM users";
try (PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
}
}
}
private static void deleteData(Connection conn, int id) throws Exception {
String sql = "DELETE FROM users WHERE id = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, id);
stmt.executeUpdate();
}
}
}
数据库连接池的概念与使用
数据库连接池是一种资源管理和优化技术,用于提高数据库操作的性能和效率。
1. 数据库连接池的优势
-
减少连接创建和释放的时间
数据库连接的创建和释放需要一定的时间,而连接池可以重用已有的连接,减少连接的创建和释放时间。 -
提高资源利用率
连接池可以管理多个数据库连接,确保数据库连接的高效利用。 - 避免资源耗尽
数据库连接池可以限制连接的数量,防止过多的连接导致资源耗尽。
2. 示例代码
以下是一个简单的数据库连接池的示例,使用HikariCP连接池:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class HikariCPExample {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10);
HikariDataSource dataSource = new HikariDataSource(config);
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
HikariConfig
配置连接池参数,如最大连接数和数据库URL。 - HikariDataSource
创建一个连接池数据源。
MVC架构的基本概念
MVC(Model-View-Controller)是一种软件架构模式,用于分离应用程序的不同组件。
1. MVC架构的组成
-
Model
数据模型,负责应用程序的数据处理和业务逻辑。 -
View
视图层,负责用户界面的展示,与用户交互。 - Controller
控制器,负责接收用户的请求,调用Model处理数据,并将结果传递给View展示。
2. MVC架构的优点
-
分离关注点
分离应用程序的不同组件,使代码更清晰、更易于维护。 -
可重用性
MVC架构使得组件可以重用,提高了开发效率。 - 灵活性
MVC架构使得不同组件之间解耦,便于进行扩展和修改。
Struts与Spring MVC简介
1. Struts简介
Struts是一个开源的MVC框架,用于开发Java Web应用程序。
-
Struts架构
Struts使用ActionServlet作为控制器,ActionForm作为表单控制器,Action作为业务逻辑控制器。 - Struts配置
Struts配置文件struts-config.xml
用于配置Action、Form Bean、Forward等。以下是一个简单的struts-config.xml
配置示例:
<struts-config>
<action-mapping>
<action path="/hello" class="com.example.HelloAction">
<forward name="success" path="/jspPage.jsp"/>
</action>
</action-mapping>
</struts-config>
- Action类
定义业务逻辑的Action类示例:
package com.example;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class HelloAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setAttribute("message", "Hello, World!");
return mapping.findForward("success");
}
}
2. Spring MVC简介
Spring MVC是一个基于Spring框架的MVC实现,用于开发Java Web应用程序。
-
Spring MVC架构
Spring MVC使用DispatcherServlet作为控制器,HandlerMapping和HandlerAdapter用于处理请求,ViewResolver用于解析视图。 - Spring MVC配置
Spring MVC配置文件dispatcher-servlet.xml
用于配置视图解析器、控制器等。以下是一个简单的dispatcher-servlet.xml
配置示例:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
3. 实战:使用Spring MVC构建简单的Web应用
1. 创建Spring MVC项目
-
新建Spring MVC项目
使用IDE创建一个Spring MVC项目,配置DispatcherServlet
。 - 配置web.xml
在web.xml
文件中配置DispatcherServlet
。
<web-app>
<display-name>My First Spring MVC App</display-name>
<description>My First Spring MVC Application</description>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2. 配置Spring MVC配置文件
- 配置视图解析器
在Spring MVC配置文件中配置视图解析器,解析视图模板。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
3. 创建Controller
- 创建Controller
创建一个控制器类,使用@Controller
注解标记为控制器。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/world")
@ResponseBody
public String helloWorld() {
return "Hello, World!";
}
}
4. 创建视图
- 创建JSP视图
创建一个JSP页面,用于展示数据。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World JSP</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
- 传递数据到视图
在控制器方法中传递数据到视图。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/world")
public ModelAndView helloWorld() {
ModelAndView modelAndView = new ModelAndView("helloWorld");
modelAndView.addObject("message", "Hello, World!");
return modelAndView;
}
}
- 视图解析
视图解析器将视图解析为实际的JSP文件路径。
HTML和CSS的基本使用
HTML(HyperText Markup Language)是Web页面的结构语言,CSS(Cascading Style Sheets)是Web页面的样式语言。
1. HTML基础
-
标签
HTML使用标签定义内容,如<html>
、<head>
、<body>
、<div>
、<p>
等。 - 属性
在标签中使用属性来定义一些行为,如id
、class
、src
等。
2. 示例代码
以下是一个简单的HTML页面示例:
<!DOCTYPE html>
<html>
<head>
<title>My First HTML Page</title>
</head>
<body>
<h1>Welcome to My First HTML Page!</h1>
<p>This is a paragraph.</p>
</body>
</html>
3. CSS基础
-
选择器
使用选择器定义样式,如element
、#id
、.class
等。 - 属性
使用属性定义样式,如color
、background-color
、font-size
等。
4. 示例代码
以下是一个简单的CSS样式示例:
body {
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}
h1 {
color: #333;
font-size: 2em;
}
p {
color: #666;
font-size: 1.2em;
}
JavaScript基础与DOM操作
JavaScript是一种脚本语言,用于在Web页面上添加交互性。
1. JavaScript基础
-
变量
使用var
、let
或const
声明变量。 -
函数
使用function
定义函数。 - DOM操作
使用DOM(Document Object Model)操作Web页面的元素。
2. 示例代码
以下是一个简单的JavaScript示例,实现一个按钮点击事件:
<!DOCTYPE html>
<html>
<head>
<title>My First JavaScript Page</title>
</head>
<body>
<h1>Welcome to My First JavaScript Page!</h1>
<button id="myButton">Click me!</button>
<script>
document.getElementById("myButton").addEventListener("click", function() {
alert("Button clicked!");
});
</script>
</body>
</html>
使用前端框架(如Bootstrap)美化页面
Bootstrap是一个流行的前端框架,用于快速开发响应式Web页面。
1. 引入Bootstrap
- 引入Bootstrap CSS
在HTML页面中引入Bootstrap的CSS文件。
<!DOCTYPE html>
<html>
<head>
<title>My First Bootstrap Page</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<h1>Welcome to My First Bootstrap Page!</h1>
<button class="btn btn-primary">Click me!</button>
</body>
</html>
- 引入Bootstrap JS
在HTML页面中引入Bootstrap的JS文件。
<!DOCTYPE html>
<html>
<head>
<title>My First Bootstrap Page</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<h1>Welcome to My First Bootstrap Page!</h1>
<button class="btn btn-primary">Click me!</button>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
2. 使用Bootstrap组件
- 按钮组件
使用Bootstrap按钮样式。
<button class="btn btn-primary">Primary Button</button>
<button class="btn btn-secondary">Secondary Button</button>
- 导航栏组件
使用Bootstrap导航栏样式。
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Brand</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Contact</a>
</li>
</ul>
</div>
</nav>
- 表单组件
使用Bootstrap表单样式。
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
项目部署与调试
Web应用的打包与部署
1. 打包Web应用
- 打包WAR文件
使用IDE或命令行工具将Web应用程序打包为WAR(Web Application ARchive)文件。
mvn package
- 部署WAR文件
将打包好的WAR文件部署到Web服务器(如Tomcat)。
cp myapp.war /path/to/tomcat/webapps/
- 启动Tomcat
启动Tomcat服务器,访问部署的应用程序。
cd /path/to/tomcat/bin
./startup.sh
常见问题排查与解决
1. 404错误
-
原因
服务器无法找到请求的资源。 - 解决方法
检查web.xml
文件中的URL配置,确保URL路径正确。
2. 500错误
-
原因
服务器发生内部错误,通常是由于代码中的异常未被捕获。 - 解决方法
查看服务器日志,找到异常信息并修复代码。
代码调试与性能优化技巧
1. 调试技巧
- IDE调试
使用IDE的调试工具进行代码调试,设置断点、单步执行等。
// 示例代码调试
public static void main(String[] args) {
int a = 10;
int b = 20;
int result = a + b;
System.out.println(result);
}
- 日志输出
在代码中添加日志输出,帮助定位问题。
import java.util.logging.Logger;
public class Example {
private static final Logger logger = Logger.getLogger(Example.class.getName());
public static void main(String[] args) {
logger.info("Starting example...");
// 业务代码
logger.info("Example finished.");
}
}
2. 性能优化技巧
- 减少资源加载
减少HTTP请求次数,合并CSS和JavaScript文件。
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script>
- 压缩资源
对CSS和JavaScript文件进行压缩,减小文件大小。
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8eX9n05n9/jo2j85q/eRkL4rtIr9oBh21ZYtqWzaUzYhW1+3X0TzvW8u" crossorigin="anonymous">
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSkWLWsYAkjR+822M" crossorigin="anonymous"></script>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-KyZXEAgDFuqNz08g" crossorigin="anonymous"></script>
- 缓存策略
使用浏览器缓存或CDN缓存静态资源,减少服务器请求。
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8eX9n05n9/jo2j85q/eRkL4rtIr9oBh21ZYtqWzaUzYhW1+3X0TzvW8u" crossorigin="anonymous">
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSkWLWsYAkjR+822M" crossorigin="anonymous"></script>
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-KyZXEAgDFuqNz08g" crossorigin="anonymous"></script>
通过以上步骤,你可以从零开始搭建一个完整的Java Web应用,并掌握从基本概念到实战应用的全过程。希望这篇文章对你有所帮助,祝你学习愉快!
共同学习,写下你的评论
评论加载中...
作者其他优质文章