下面我用通俗 + 实战 + 面试友好的方式,系统讲清楚 Servlet 与 JSP 的使用简介及区别,非常适合你当前在学 Java Web / JSP + Servlet 项目 的阶段。
一、什么是 Servlet?
1️⃣ Servlet 简介
Servlet 是运行在 Web 服务器中的 Java 程序,用于接收浏览器请求、处理业务逻辑,并返回响应。
👉 本质:Java 类
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.getWriter().write("Hello Servlet");
}
}
2️⃣ Servlet 的主要作用
✔ 接收请求(Request)
✔ 处理业务逻辑
✔ 调用数据库 / Service
✔ 转发或重定向到 JSP
✔ 返回 JSON / HTML
👉 Servlet 是控制器(Controller)
3️⃣ Servlet 的执行流程
浏览器请求
↓
Tomcat 接收
↓
Servlet(doGet / doPost)
↓
业务处理
↓
响应浏览器
4️⃣ Servlet 的特点
| 特点 | 说明 |
|---|---|
| 面向 Java | 纯 Java 代码 |
| 可控性强 | 适合业务处理 |
| 不擅长页面 | 写 HTML 很痛苦 |
| 线程安全需注意 | 多线程共享实例 |
二、什么是 JSP?
1️⃣ JSP 简介
JSP(Java Server Pages)是用于生成动态网页的技术,本质上是 Servlet 的一种表现形式。
<%
out.println("Hello JSP");
%>
📌 JSP 在第一次访问时会被编译成 Servlet
2️⃣ JSP 的主要作用
✔ 展示数据(页面渲染)
✔ 接收请求参数(不推荐处理业务)
✔ 使用 EL / JSTL 渲染视图
👉 JSP 是视图(View)
3️⃣ JSP 的执行流程
浏览器请求 JSP
↓
Tomcat 将 JSP 转成 Servlet
↓
编译执行
↓
返回 HTML
4️⃣ JSP 的特点
| 特点 | 说明 |
|---|---|
| 写 HTML 方便 | 页面友好 |
| 混合 Java | 易混乱(scriptlet) |
| 性能稳定 | 编译后即 Servlet |
| 适合展示 | 不适合业务逻辑 |
三、Servlet 与 JSP 的核心区别(重点)
1️⃣ 本质区别
| 对比项 | Servlet | JSP |
|---|---|---|
| 本质 | Java 类 | Servlet |
| 主要职责 | 业务处理 | 页面展示 |
| 编写方式 | Java + 输出 HTML | HTML + Java |
| 使用场景 | Controller | View |
2️⃣ 使用方式对比
Servlet 写页面(很难受)
out.write("<html>");
out.write("<body>");
out.write("<h1>Hello</h1>");
out.write("</body>");
out.write("</html>");
JSP 写页面(舒服)
<h1>Hello</h1>
3️⃣ MVC 分层对比(面试重点)
Model → JavaBean / Service / DAO
View → JSP
Controller → Servlet
📌 Servlet + JSP = 经典 MVC 模式
四、Servlet 和 JSP 的协作方式(真实项目)
1️⃣ 正确使用方式 ✅
Servlet(控制器)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List<User> users = userService.findAll();
req.setAttribute("users", users);
req.getRequestDispatcher("/user.jsp").forward(req, resp);
}
JSP(视图层)
<c:forEach items="${users}" var="u">
<p>${u.name}</p>
</c:forEach>
📌 JSP 只做展示,不写业务逻辑
2️⃣ 错误示范 ❌(初学者常犯)
<%
Connection conn = DriverManager.getConnection(...);
// 写 SQL、业务逻辑
%>
💥 严重违反 MVC,维护地狱
五、Servlet 与 JSP 生命周期对比
| 生命周期 | Servlet | JSP |
|---|---|---|
| 创建 | init() | 转换成 Servlet |
| 执行 | service() | _jspService() |
| 销毁 | destroy() | destroy() |
📌 JSP 最终还是走 Servlet 生命周期
六、为什么现在“少写 JSP”?
传统模式
Servlet + JSP
现代模式
Spring Boot + REST + Vue / React
📌 JSP 常见用途:
- 老系统维护
- 教学 / 基础学习
- 后台管理系统(内嵌)
七、Servlet 与 JSP 面试高频问答
Q1:JSP 是不是 Servlet?
✅ 是,本质是 Servlet
Q2:为什么 WHERE 中不能写业务逻辑?
❌ 业务逻辑应该在 Servlet / Service
Q3:JSP 能访问数据库吗?
⚠️ 能,但不应该
Q4:forward 和 redirect 区别?
| 项目 | forward | redirect |
|---|---|---|
| 请求次数 | 1 次 | 2 次 |
| 地址栏 | 不变 | 改变 |
| 数据共享 | 可 | 不可 |
八、一句话总结(背下来)
Servlet 负责“做什么”,JSP 负责“怎么展示”
Servlet 是控制器,JSP 是视图
好,那我直接给你最常用、最有含金量的实战:
👉【Servlet + JSP + MySQL 登录 & 注册完整示例(标准 MVC)】
这是学习 / 作业 / 面试 / 毕设都能直接用的版本。
一、项目结构(标准 MVC)
login-demo/
│
├── src/
│ ├── com.example.servlet
│ │ ├── LoginServlet.java
│ │ └── RegisterServlet.java
│ │
│ ├── com.example.dao
│ │ └── UserDao.java
│ │
│ ├── com.example.entity
│ │ └── User.java
│
├── web/
│ ├── login.jsp
│ ├── register.jsp
│ ├── success.jsp
│ └── WEB-INF/web.xml
📌 职责清晰:
- Servlet:控制器
- DAO:数据访问
- JSP:页面展示
二、数据库设计(MySQL)
CREATE DATABASE login_demo;
USE login_demo;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE,
password VARCHAR(50)
);
三、实体类(Model)
User.java
public class User {
private int id;
private String username;
private String password;
// getter / setter
}
四、DAO 层(数据库操作)
UserDao.java
public class UserDao {
private Connection getConn() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/login_demo?useSSL=false&serverTimezone=UTC",
"root",
"123456"
);
}
// 登录校验
public User login(String username, String password) throws Exception {
String sql = "SELECT * FROM user WHERE username=? AND password=?";
Connection conn = getConn();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
User u = new User();
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
return u;
}
return null;
}
// 注册
public boolean register(String username, String password) throws Exception {
String sql = "INSERT INTO user(username,password) VALUES (?,?)";
Connection conn = getConn();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
return ps.executeUpdate() > 0;
}
}
📌 面试加分点:
- 使用
PreparedStatement(防 SQL 注入)
五、Servlet(Controller)
1️⃣ 登录 Servlet
LoginServlet.java
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
UserDao dao = new UserDao();
try {
User user = dao.login(username, password);
if (user != null) {
req.setAttribute("user", user);
req.getRequestDispatcher("success.jsp").forward(req, resp);
} else {
resp.sendRedirect("login.jsp?error=1");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2️⃣ 注册 Servlet
RegisterServlet.java
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
UserDao dao = new UserDao();
try {
dao.register(username, password);
resp.sendRedirect("login.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、JSP 页面(View)
1️⃣ 登录页面 login.jsp
<form action="login" method="post">
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
<%
if ("1".equals(request.getParameter("error"))) {
out.print("用户名或密码错误");
}
%>
2️⃣ 注册页面 register.jsp
<form action="register" method="post">
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
<button type="submit">注册</button>
</form>
3️⃣ 成功页面 success.jsp
<h2>欢迎你:${user.username}</h2>
📌 使用 EL 表达式(推荐)
七、执行流程(一定要懂)
浏览器
↓
login.jsp
↓
LoginServlet
↓
UserDao 查询数据库
↓
success.jsp
八、这个案例你能学到什么?(重点)
✅ Servlet 接收请求
✅ JSP 展示数据
✅ MVC 分层思想
✅ JDBC 基础
✅ 转发 vs 重定向
✅ 面试能完整讲清流程
九、面试一句话总结(直接背)
Servlet 负责业务控制,JSP 负责页面展示,DAO 负责数据访问,三者解耦构成 MVC
发表回复