菜鸟-创作你的创作

Servlet与JSP使用简介及区别详解

下面我用通俗 + 实战 + 面试友好的方式,系统讲清楚 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️⃣ 本质区别

对比项ServletJSP
本质Java 类Servlet
主要职责业务处理页面展示
编写方式Java + 输出 HTMLHTML + Java
使用场景ControllerView

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 生命周期对比

生命周期ServletJSP
创建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 区别?

项目forwardredirect
请求次数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

📌 职责清晰:


二、数据库设计(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;
    }
}

📌 面试加分点:


五、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

退出移动版