后端入门指南:从 Servlet 到数据库交互,搭建你的 “后台大脑”
大家好~在上一篇前端博客里,我们聊了如何用 HTML 搭骨架、CSS 穿皮肤、JavaScript 让页面动起来。但一个完整的网站,光有前端还不够 —— 用户登录的信息存在哪?商品数据怎么存储?表单提交后谁来处理?这些 “看不见的工作”,全靠后端来完成。
这篇博客就带大家入门后端核心知识,从 “服务器容器” Tomcat 到 “请求处理核心” Servlet,再到 “数据存储” JDBC 和 “会话管理” Cookie/Session,全是初学者必掌握的重点,每个知识点都配实操例子,跟着敲代码就能上手~
目录
(2)request 和 response 对象(请求与响应的核心)
五、会话管理:Cookie 与 Session(解决 HTTP 无状态)
(2)获取 Session 中的数据(其他 Servlet 中)
一、先搞懂:后端是什么?我们要学什么?
后端,简单说就是服务器端的代码,负责处理前端发送的请求(比如登录、提交表单)、操作数据(比如存用户信息到数据库)、返回响应结果(比如 “登录成功” 或商品列表)。
初学者入门后端,核心要掌握 4 块内容:
- 服务器容器:比如 Tomcat,是运行后端代码的 “舞台”;
- 请求处理:用 Servlet/JSP 接收前端请求,处理业务逻辑;
- 会话管理:用 Cookie/Session 解决 HTTP 无状态的问题(比如记住登录状态);
- 数据交互:用 JDBC 连接数据库,实现数据的增删改查。
接下来我们一步步拆解这些知识点,从环境搭建到代码实操,全是 “保姆级” 教程~
二、服务器容器:Tomcat 的安装与配置
后端代码不能像前端一样直接用浏览器打开,需要一个 “容器” 来运行 ——Tomcat 就是最常用的 Java 后端服务器容器(支持 Servlet/JSP),初学者建议用 Tomcat 7(兼容性好,学习资料多)。
1. Tomcat 是什么?为什么需要它?
简单说,Tomcat 就像一个 “服务员”:
- 前端发送请求(比如访问
http://localhost:8080/login),Tomcat 接收请求; - 找到对应的后端代码(比如 LoginServlet),让代码执行;
- 把代码的执行结果(比如 “登录成功”)返回给前端。
没有 Tomcat,你的 Servlet 代码根本跑不起来 —— 它是后端代码和浏览器之间的 “中间件”。
2. Tomcat 安装与目录结构
(1)下载与安装
- 官网下载:Apache Tomcat 7,选择对应系统的压缩包(Windows 选
32-bit/64-bit Windows Service Installer); - 安装时注意:端口默认 8080(如果被占用,后续可修改),JDK 路径要选对(Tomcat 需要依赖 JDK);
- 验证是否安装成功:双击
bin/startup.bat启动 Tomcat,打开浏览器访问http://localhost:8080,能看到 Tomcat 默认页面就说明成功了。
(2)核心目录解析(重点记 3 个)
| 目录 | 作用 | 关键文件 / 操作 |
|---|---|---|
bin |
启动 / 关闭 Tomcat 的脚本 | startup.bat(启动)、shutdown.bat(关闭) |
conf |
Tomcat 的配置文件 | server.xml(改端口)、web.xml(全局配置) |
webapps |
存放你的后端项目 | 把项目放到这里,启动 Tomcat 就能访问 |
(3)常见配置:修改端口(解决 8080 被占用)
如果启动 Tomcat 时提示 “8080 端口被占用”,修改conf/server.xml:
<!-- 找到这行,把port="8080"改成其他端口(比如8081) -->
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改完后重启 Tomcat,访问http://localhost:8081即可。
3. 在 MyEclipse 中集成 Tomcat(实操)
后端开发常用 MyEclipse(或 Eclipse),集成 Tomcat 后能直接在 IDE 中启动项目,步骤如下:
- 打开 MyEclipse,点击
Window > Preferences > MyEclipse > Servers > Tomcat > Tomcat 7.x; - 选择
Enable,在Tomcat home directory中选择你的 Tomcat 安装路径; - 点击
Apply,集成完成。
之后创建 Web 项目时,就能直接选择这个 Tomcat 作为服务器啦~
三、请求处理核心:Servlet 详解
Servlet 是 Java 后端的 “核心组件”,专门用来处理前端发送的 HTTP 请求(比如登录表单提交、商品查询)。简单说,前端是 “用户”,Servlet 就是 “服务员”—— 接收用户的 “需求”(请求),处理后给出 “答复”(响应)。
1. Servlet 是什么?为什么需要它?
举个例子:你在前端填写登录表单(用户名 + 密码),点击 “登录” 后,请求会发送到服务器。这时候就需要一个 Servlet 来处理:
- 接收表单中的用户名和密码;
- 验证用户名密码是否正确(比如和数据库中的数据对比);
- 返回结果:正确就跳转到首页,错误就提示 “用户名或密码错误”。
没有 Servlet,服务器就不知道如何处理前端的请求 —— 它是后端处理业务逻辑的 “入口”。
2. 第一个 Servlet:从创建到运行
我们用 MyEclipse 创建一个简单的 Servlet,实现 “接收请求并返回 Hello” 的功能,步骤如下:
(1)创建 Web 项目
- 右键
New > Web Project,项目名填FirstServlet,JDK 选 1.6/1.7,Java EE 版本选 Java EE 5; - 项目创建后,目录结构如下(重点关注
src和WebRoot/WEB-INF):src:写 Java 代码(Servlet 就在这里);WebRoot/WEB-INF:放配置文件(web.xml)和 jar 包(lib目录)。
(2)创建 Servlet 类
- 右键
src > New > Servlet,Package 填com.test.servlet,Class name 填HelloServlet; - 点击
Finish,MyEclipse 会自动生成 Servlet 代码,我们只需要重写service方法(处理请求的核心方法):
package com.test.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
// 处理请求的核心方法:req是请求对象(获取前端传过来的数据),resp是响应对象(返回数据给前端)
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 设置响应的编码格式(防止中文乱码)
resp.setContentType("text/html;charset=utf-8");
// 2. 获得输出流,向前端返回内容
resp.getWriter().print("<h1>Hello Servlet!这是后端返回的内容</h1>");
// 3. 打印日志(在控制台查看)
System.out.println("收到前端请求,已返回Hello消息");
}
}
(3)配置 Servlet(让 Tomcat 找到它)
Servlet 需要配置WebRoot/WEB-INF/web.xml,告诉 Tomcat “哪个请求对应哪个 Servlet”:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<!-- 1. 配置Servlet类 -->
<servlet>
<servlet-name>HelloServlet</servlet-name> <!-- 给Servlet起个名字 -->
<servlet-class>com.test.servlet.HelloServlet</servlet-class> <!-- Servlet的完整路径 -->
</servlet>
<!-- 2. 配置请求路径(URL) -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name> <!-- 和上面的名字一致 -->
<url-pattern>/hello</url-pattern> <!-- 前端访问的路径:http://localhost:8081/FirstServlet/hello -->
</servlet-mapping>
</web-app>
(4)部署并运行
- 右键项目
Run As > MyEclipse Server Application,选择集成的 Tomcat 7; - 启动成功后,打开浏览器访问:
http://localhost:8081/FirstServlet/hello(注意端口和项目名要和你的配置一致); - 页面显示
<h1>Hello Servlet!这是后端返回的内容</h1>,控制台打印 “收到前端请求,已返回 Hello 消息”,说明 Servlet 运行成功!
3. Servlet 的核心概念:生命周期与请求处理
(1)Servlet 生命周期(重点!面试常考)
Servlet 的一生分为 4 个阶段,由 Tomcat 管理:
- 实例化:第一次访问 Servlet 时,Tomcat 创建 Servlet 对象(只创建一次,单例模式);
- 初始化:调用
init()方法(初始化资源,比如连接数据库的配置); - 服务:调用
service()方法(处理请求,每次请求都会执行); - 销毁:Tomcat 关闭时,调用
destroy()方法(释放资源,比如关闭数据库连接)。
(2)request 和 response 对象(请求与响应的核心)
在service方法中,HttpServletRequest req和HttpServletResponse resp是两个核心对象:
- request(请求对象):获取前端传过来的数据,比如表单参数、请求路径;
// 1. 获取表单中的用户名(前端表单的name属性是"username") String username = req.getParameter("username"); // 2. 获取请求方式(GET/POST) String method = req.getMethod(); // 3. 获取请求路径(比如"/FirstServlet/hello") String uri = req.getRequestURI(); - response(响应对象):向前端返回数据,比如 HTML 内容、跳转页面;
// 1. 返回HTML内容 resp.getWriter().print("<h1>登录成功</h1>"); // 2. 重定向到首页(跳转到另一个页面) resp.sendRedirect("index.jsp");
4. 常见错误排查(初学者必看)
- 404 错误:路径不对!检查
web.xml中的url-pattern是否正确,浏览器访问的地址是否包含项目名(比如FirstServlet); - 405 错误:没重写
doGet/doPost或service方法!Tomcat 默认调用doGet,如果没重写就会报错,解决方法是重写service方法; - 500 错误:Java 代码报错!查看 MyEclipse 的控制台,找到报错的行(比如空指针、数组越界),修复代码即可。
四、HTTP 协议:理解请求与响应的 “规则”
前端和后端通信,靠的是 HTTP 协议(超文本传输协议)—— 它就像 “交通规则”,规定了请求和响应的格式、方式和特性。理解 HTTP 是后端入门的基础。
1. HTTP 的核心特性(3 个重点)
- 单向性:只有前端发请求,后端才会给响应(后端不会主动给前端发消息);
- 无状态:后端不记得之前的请求(比如第一次登录成功,第二次访问时,后端默认不知道你是谁);
- 长连接:HTTP 1.1 开始支持长连接,一次连接可以发送多次请求(减少连接开销)。
2. HTTP 请求的格式(前端发给后端)
一个完整的 HTTP 请求包含 3 部分:请求行、请求头、请求体,用浏览器 F12 的 Network 面板可以查看(以登录表单为例):
// 1. 请求行:请求方式 + 资源路径 + 协议版本
POST /FirstServlet/login HTTP/1.1
// 2. 请求头:浏览器信息、Cookie等
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Cookie: JSESSIONID=ABC123456789
// 3. 请求体:表单参数(POST方式在这里,GET方式在URL后面)
username=zhangsan&password=123456
GET 和 POST 的区别(重点!面试必问)
| 对比项 | GET | POST |
|---|---|---|
| 参数位置 | URL 后面(比如?username=zhangsan) |
请求体中(不显示在地址栏) |
| 数据大小 | 有限制(地址栏长度限制,一般 2KB) | 无限制(适合传大数据,比如文件) |
| 缓存 | 有缓存(相同 URL 会返回缓存结果) | 无缓存 |
| 安全性 | 不安全(参数暴露在地址栏) | 相对安全(参数在请求体中) |
| 用途 | 查询数据(比如搜索、获取列表) | 提交数据(比如登录、上传文件) |
3. HTTP 响应的格式(后端发给前端)
响应也包含 3 部分:响应行、响应头、响应体:
// 1. 响应行:协议版本 + 状态码 + 描述
HTTP/1.1 200 OK
// 2. 响应头:服务器信息、内容类型等
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
// 3. 响应体:后端返回的内容(比如HTML、JSON)
<h1>登录成功!欢迎你,zhangsan</h1>
常见 HTTP 状态码(记住 3 个)
- 200 OK:请求成功(后端正常处理并返回结果);
- 404 Not Found:资源不存在(路径错了,比如 Servlet 的
url-pattern配置错误); - 500 Internal Server Error:服务器内部错误(Java 代码报错,比如空指针)。
五、会话管理:Cookie 与 Session(解决 HTTP 无状态)
HTTP 是 “无状态” 的 —— 后端不记得你之前的请求。比如你登录成功后,刷新页面,后端默认不知道你是谁。这时候就需要 Cookie 和 Session 来 “记住” 用户状态。
1. Cookie:存在客户端的 “小纸条”
Cookie 是后端发给前端的 “小纸条”,前端会保存在本地(浏览器缓存中),下次访问时再把 “小纸条” 发给后端。
(1)创建并发送 Cookie(后端代码)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建Cookie(key=value形式)
Cookie userCookie = new Cookie("username", "zhangsan");
// 2. 设置Cookie的有效期(单位:秒,3600*24=1天)
userCookie.setMaxAge(3600*24);
// 3. 发送Cookie给前端
resp.addCookie(userCookie);
// 返回提示
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("<h1>Cookie已发送,下次访问会携带</h1>");
}
(2)获取前端传来的 Cookie(后端代码)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取所有Cookie
Cookie[] cookies = req.getCookies();
// 2. 遍历Cookie,找到我们需要的
String username = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue(); // 拿到"zhangsan"
break;
}
}
}
// 3. 根据Cookie判断是否登录
resp.setContentType("text/html;charset=utf-8");
if (username != null) {
resp.getWriter().print("<h1>欢迎回来," + username + "!</h1>");
} else {
resp.getWriter().print("<h1>请先登录!</h1>");
}
}
(3)Cookie 的特点
- 存储在客户端(浏览器),安全性低(用户可以修改或删除);
- 存储容量有限(一般 4KB),适合存少量数据(比如用户名、记住登录状态);
- 每次请求都会携带 Cookie,增加请求开销(不适合存大量数据)。
2. Session:存在服务器的 “身份卡”
Session 是存在服务器的 “身份卡”—— 后端给每个用户创建一个 Session 对象,存储用户信息(比如登录状态、购物车),并把 Session 的 ID 通过 Cookie 发给前端。下次前端访问时,携带 Session ID,后端就能找到对应的 Session 对象。
(1)创建并使用 Session(后端代码)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取Session(没有就创建)
HttpSession session = req.getSession();
// 2. 往Session中存数据(比如登录成功的用户名)
session.setAttribute("username", "zhangsan");
// 3. 获取Session ID(后端通过这个ID找到Session对象)
String sessionId = session.getId();
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("<h1>Session创建成功,ID:" + sessionId + "</h1>");
resp.getWriter().print("<h1>Session中存储的用户名:" + session.getAttribute("username") + "</h1>");
}
(2)获取 Session 中的数据(其他 Servlet 中)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取Session(如果没有,返回null)
HttpSession session = req.getSession(false);
resp.setContentType("text/html;charset=utf-8");
if (session != null && session.getAttribute("username") != null) {
String username = (String) session.getAttribute("username");
resp.getWriter().print("<h1>登录状态有效,欢迎你," + username + "!</h1>");
} else {
resp.getWriter().print("<h1>登录状态已失效,请重新登录!</h1>");
}
}
(3)Session 的特点
- 存储在服务器,安全性高(用户看不到也改不了数据);
- 存储容量无限制,适合存大量数据(比如购物车、用户权限);
- Session 有有效期(默认 30 分钟,可在
web.xml中配置),过期后自动销毁; - 依赖 Cookie(Session ID 通过 Cookie 传递),如果用户禁用 Cookie,Session 会失效(可通过 URL 重写解决)。
3. Cookie 与 Session 的区别(总结)
| 对比项 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务器 |
| 安全性 | 低(可修改、删除) | 高(仅服务器可访问) |
| 存储容量 | 有限(4KB) | 无限制 |
| 依赖关系 | 独立存在 | 依赖 Cookie(传递 Session ID) |
| 用途 | 存少量数据(用户名、记住登录) | 存大量数据(购物车、用户权限) |
六、JSP:简化后端页面生成
Servlet 处理业务逻辑很方便,但生成 HTML 页面很麻烦(需要用resp.getWriter().print()拼接标签)。JSP(Java Server Pages)就是为了解决这个问题 —— 它本质是 Servlet,但允许在 HTML 中嵌入 Java 代码,让页面生成更简单。
1. JSP 是什么?为什么说它是 Servlet?
JSP 页面的后缀是.jsp,第一次访问时,Tomcat 会把 JSP 编译成 Java 类(Servlet),然后执行。比如index.jsp会被编译成index_jsp.java,存放在 Tomcat 的work目录下。
一个简单的 JSP 页面(index.jsp)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<h1>这是JSP页面</h1>
<!-- 嵌入Java代码:输出当前时间 -->
<%
java.util.Date now = new java.util.Date();
out.print("<p>当前时间:" + now.toLocaleString() + "</p>");
%>
<!-- EL表达式:获取Session中的用户名(简化Java代码) -->
<p>登录用户:${sessionScope.username}</p>
</body>
</html>
访问这个页面时,Tomcat 会先编译它为 Servlet,然后执行,最终返回 HTML 给前端。
2. JSP 的核心语法(3 个重点)
(1)脚本段(嵌入 Java 代码)
用<% %>包裹 Java 代码,会被编译到 Servlet 的_jspService方法中:
<%
// 定义变量
String message = "Hello JSP";
// 循环输出
for (int i = 0; i < 3; i++) {
out.print("<p>" + message + i + "</p>");
}
%>
(2)表达式(输出变量或表达式结果)
用<%= %>包裹,直接输出结果(不用写out.print()):
<%= "当前页码:" + 1 %> <!-- 输出:当前页码:1 -->
<%= Math.random() %> <!-- 输出一个随机数 -->
(3)指令(配置 JSP 页面)
最常用的是page指令(设置编码、导入包)和include指令(引入其他页面):
<!-- page指令:设置编码和导入Java包 -->
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.List,java.util.ArrayList" %>
<!-- include指令:静态引入其他页面(把header.jsp的内容嵌入当前页面) -->
<%@ include file="header.jsp" %>
3. JSP 九大内置对象(不用创建直接用)
JSP 有 9 个内置对象,不用手动创建就能使用,最常用的有 4 个:
| 对象名 | 作用 | 例子 |
|---|---|---|
request |
获取请求数据 | String username = request.getParameter("username"); |
session |
会话管理 | session.setAttribute("username", "zhangsan"); |
out |
输出内容到页面 | out.print("<h1>登录成功</h1>"); |
application |
全局对象(整个项目共享) | application.setAttribute("onlineCount", 100); |
七、数据交互:JDBC 连接 MySQL 数据库
后端处理的核心是数据 —— 用户信息、商品数据都存在数据库中。JDBC(Java Database Connectivity)是 Java 连接数据库的标准 API,通过 JDBC 可以实现对数据库的增删改查。
1. 准备工作:导入 MySQL 驱动包
- 下载 MySQL 驱动包(
mysql-connector-java-5.1.47.jar,对应 MySQL 5.7); - 把驱动包复制到项目的
WebRoot/WEB-INF/lib目录下; - 右键驱动包
Build Path > Add to Build Path,完成导入。
2. JDBC 连接数据库的步骤(6 步)
以 “查询用户表(user)中的数据” 为例,代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 加载MySQL驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 建立数据库连接(URL格式:jdbc:mysql://主机名:端口号/数据库名)
String url = "jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8";
String username = "root"; // 数据库用户名
String password = "123456"; // 数据库密码
conn = DriverManager.getConnection(url, username, password);
// 3. 创建Statement对象(执行SQL语句)
stmt = conn.createStatement();
// 4. 执行SQL查询(查询user表中的所有数据)
String sql = "SELECT id, username, password FROM user";
rs = stmt.executeQuery(sql);
// 5. 处理查询结果(遍历ResultSet)
while (rs.next()) {
int id = rs.getInt("id");
String user = rs.getString("username");
String pwd = rs.getString("password");
System.out.println("ID:" + id + ",用户名:" + user + ",密码:" + pwd);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. 关闭资源(先关ResultSet,再关Statement,最后关Connection)
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
关键参数说明
- URL:
jdbc:mysql://localhost:3306/test_db,test_db是数据库名,useUnicode=true&characterEncoding=utf-8是防止中文乱码; - 用户名 / 密码:MySQL 的登录账号(默认是
root)和密码(安装 MySQL 时设置的); - SQL 执行:
executeQuery()执行查询(返回ResultSet),executeUpdate()执行增删改(返回影响的行数)。
3. 常见操作:增删改查(CRUD)
(1)新增数据(INSERT)
String sql = "INSERT INTO user(username, password) VALUES ('lisi', '654321')";
int rows = stmt.executeUpdate(sql); // 返回影响的行数(1表示成功)
System.out.println("新增了" + rows + "条数据");
(2)修改数据(UPDATE)
String sql = "UPDATE user SET password='111111' WHERE username='lisi'";
int rows = stmt.executeUpdate(sql);
System.out.println("修改了" + rows + "条数据");
(3)删除数据(DELETE)
String sql = "DELETE FROM user WHERE username='lisi'";
int rows = stmt.executeUpdate(sql);
System.out.println("删除了" + rows + "条数据");
八、后端学习建议:从入门到实践
- 先搭环境,再写代码:Tomcat、MySQL 的配置是基础,先确保环境能跑通(比如 Servlet 能返回 Hello、JDBC 能连接数据库);
- 理解原理,不要死记:比如 Servlet 的生命周期、Cookie/Session 的区别、GET/POST 的差异,理解后自然能记住;
- 多做小项目,串联知识点:比如做一个 “登录功能”—— 前端用 HTML 写登录表单,后端用 Servlet 处理请求,用 JDBC 验证用户名密码,用 Session 保存登录状态;
- 学会调试:用 MyEclipse 的断点调试 Servlet 代码,用浏览器 F12 查看 HTTP 请求 / 响应,用 MySQL 的 Navicat 查看数据是否正确;
- 循序渐进,不要贪多:先掌握 Servlet、HTTP、JDBC,再学框架(比如 SSM、Spring Boot)—— 框架是对基础的封装,基础学好了,框架上手会很快。
后端学习不像前端能即时看到页面效果,需要更多耐心去理解 “请求 - 处理 - 响应” 的流程,去排查代码中的错误。但只要跟着例子一步步敲,理解每个环节的作用,你会慢慢发现:后端其实就是 “接收请求、处理逻辑、操作数据、返回结果” 的循环,没那么复杂~
如果这篇总结对你有帮助,欢迎点赞收藏~后续可以分享更多后端进阶知识(比如框架、数据库优化),有疑问的地方也可以在评论区讨论呀!
更多推荐
所有评论(0)