Java Web基础:Servlet与JSP

好的,各位靓仔靓女,欢迎来到“Java Web 基础:Servlet 与 JSP”技术讲座现场!我是你们的老朋友,也是你们今天的主讲人,江湖人称“代码小王子”。今天咱们不搞那些高大上的理论,就聊聊 Java Web 开发的“老两口”——Servlet 和 JSP。

别一听“老两口”就觉得枯燥,他们可是 Java Web 世界里不可或缺的灵魂人物,一个负责“搬砖”,一个负责“美化”,配合默契,相爱相杀,共同构建了无数精彩纷呈的网页应用。准备好了吗?让我们一起揭开他们的神秘面纱吧!😎

第一幕:Servlet——默默奉献的“搬砖工”

Servlet,你可以把它想象成一个勤勤恳恳的“搬砖工”,专门负责处理来自客户端的请求,然后根据请求的内容,进行相应的业务逻辑处理,最后再把处理结果返回给客户端。说白了,它就是个“中间人”,负责沟通客户端和服务器,并完成一些“脏活累活”。

1. 什么是 Servlet?

Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,用于处理 HTTP 请求并生成响应。它并非独立的进程,而是寄生在 Web 服务器中,由服务器负责管理其生命周期。

  • 官方定义: Servlet 是使用 Java Servlet API 实现的 Java 类,运行在支持 Servlet 规范的 Web 服务器中。
  • 通俗解释: Servlet 就像一个邮局分拣员,负责接收信件(HTTP 请求),根据信件上的地址(URL)进行分类,然后交给相应的处理人员(Java 代码)进行处理,最后再把处理结果(HTTP 响应)发送给收信人(客户端)。

2. Servlet 的生命周期

Servlet 的生命周期由 Web 服务器管理,大致分为以下几个阶段:

阶段 描述
加载与实例化 当服务器第一次收到对该 Servlet 的请求时,或者服务器启动时(如果配置了自动加载),服务器会加载 Servlet 类,并创建 Servlet 实例。
初始化 服务器调用 Servlet 的 init() 方法,进行一些初始化操作,例如读取配置文件、建立数据库连接等。init() 方法只会被调用一次。
请求处理 当客户端发送请求到该 Servlet 时,服务器会调用 Servlet 的 service() 方法,根据 HTTP 请求的方法(GET、POST 等),调用对应的 doGet()doPost() 方法来处理请求。service() 方法会被多次调用。
销毁 当服务器关闭或 Servlet 需要被卸载时,服务器会调用 Servlet 的 destroy() 方法,释放资源。destroy() 方法只会被调用一次。

3. 如何编写一个 Servlet?

编写 Servlet 非常简单,只需要以下几步:

  1. 创建一个 Java 类,继承 javax.servlet.http.HttpServlet 类。 HttpServlet 类是 Servlet API 中专门用于处理 HTTP 请求的类,它提供了一些方便的方法,例如 doGet()doPost() 等。
  2. 重写 doGet()doPost() 方法,处理 GET 或 POST 请求。 在这些方法中,你可以编写你的业务逻辑代码,例如从数据库中读取数据、进行计算等。
  3. 配置 Servlet。 你需要在 web.xml 文件(或者使用注解)中配置 Servlet,指定 Servlet 的名称、URL 映射等信息。

代码示例:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello") // 使用注解配置 Servlet
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型为 HTML
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");

        // 获取 PrintWriter 对象,用于向客户端输出内容
        PrintWriter out = response.getWriter();

        // 输出 HTML 内容
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello, Servlet! 👋</h1>");
        out.println("<p>这是一个简单的 Servlet 示例。</p>");
        out.println("</body>");
        out.println("</html>");

        // 关闭 PrintWriter
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理 POST 请求
        doGet(request, response); // 这里简单地调用 doGet 方法处理 POST 请求
    }
}

web.xml 配置(如果未使用注解):

<web-app>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

4. Servlet 的优点与缺点

  • 优点:
    • 灵活性: Servlet 可以处理各种复杂的业务逻辑,具有很高的灵活性。
    • 性能: Servlet 运行在服务器端,可以充分利用服务器的资源,提高性能。
    • 可扩展性: Servlet 可以方便地进行扩展,满足不断变化的需求。
  • 缺点:
    • 代码复杂: Servlet 的代码通常比较复杂,需要编写大量的 Java 代码。
    • 维护困难: Servlet 的代码与 HTML 代码混合在一起,维护起来比较困难。
    • 开发效率低: Servlet 的开发效率相对较低,需要花费较多的时间。

第二幕:JSP——精通化妆的“设计师”

JSP,你可以把它想象成一个精通化妆的“设计师”,专门负责美化网页,让网页看起来更加漂亮、更加吸引人。它在 Servlet 的基础上,增加了对 HTML 代码的支持,使得开发者可以更加方便地编写网页。

1. 什么是 JSP?

JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在 HTML 页面中嵌入 Java 代码,从而实现动态内容的生成。

  • 官方定义: JSP 是一种基于 Java 的动态网页技术,它允许开发者在 HTML 页面中嵌入 Java 代码,从而实现动态内容的生成。
  • 通俗解释: JSP 就像一个化妆师,它可以在 HTML 页面上涂脂抹粉,让页面看起来更加漂亮。同时,它还可以根据不同的情况,动态地调整页面的内容,让页面更加个性化。

2. JSP 的工作原理

JSP 的工作原理可以用一句话概括:JSP 页面会被 Web 服务器编译成 Servlet。

具体来说,当 Web 服务器收到对 JSP 页面的请求时,它会首先检查该 JSP 页面是否已经被编译成 Servlet。如果还没有被编译,服务器会调用 JSP 引擎将 JSP 页面编译成一个 Servlet。然后,服务器会像处理普通的 Servlet 一样,调用该 Servlet 的 service() 方法来处理请求,并生成响应。

3. JSP 的语法

JSP 的语法主要包括以下几种:

  • 指令(Directives): 用于设置 JSP 页面的属性,例如页面编码、导入类等。常用的指令有 pageincludetaglib 等。
  • 声明(Declarations): 用于声明 JSP 页面中使用的变量和方法。
  • 脚本表达式(Expressions): 用于在 JSP 页面中输出变量的值。
  • 脚本代码(Scriptlets): 用于在 JSP 页面中编写 Java 代码。
  • 注释(Comments): 用于在 JSP 页面中添加注释。

代码示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Hello JSP</title>
</head>
<body>
    <h1>Hello, JSP! 👋</h1>
    <p>这是一个简单的 JSP 示例。</p>

    <%-- Java 代码 --%>
    <%
        String name = "代码小王子";
        int age = 18;
    %>

    <%-- 输出变量的值 --%>
    <p>姓名:<%= name %></p>
    <p>年龄:<%= age %></p>

    <%-- 使用表达式 --%>
    <p>你好的两倍是:<%= age * 2 %></p>

    <%-- 循环输出 --%>
    <ul>
        <% for (int i = 1; i <= 5; i++) { %>
            <li>第 <%= i %> 项</li>
        <% } %>
    </ul>
</body>
</html>

4. JSP 的优点与缺点

  • 优点:
    • 开发效率高: JSP 的开发效率相对较高,可以快速地编写网页。
    • 易于维护: JSP 的代码与 HTML 代码分离,维护起来比较容易。
    • 可重用性: JSP 可以方便地进行重用,提高开发效率。
  • 缺点:
    • 代码复杂: JSP 的代码中混合了 Java 代码和 HTML 代码,容易造成代码混乱。
    • 性能: JSP 页面需要被编译成 Servlet,会影响性能。
    • 安全性: JSP 页面中可能存在安全漏洞,需要注意安全性。

第三幕:Servlet + JSP——珠联璧合的“黄金搭档”

Servlet 和 JSP 各有优缺点,单独使用都有一定的局限性。因此,在实际开发中,通常会将 Servlet 和 JSP 结合起来使用,Servlet 负责处理业务逻辑,JSP 负责展示页面,形成一种“Model-View-Controller”(MVC)的设计模式。

1. MVC 设计模式

MVC 是一种常用的软件设计模式,它将应用程序分为三个部分:

  • Model(模型): 负责处理数据和业务逻辑。
  • View(视图): 负责展示数据。
  • Controller(控制器): 负责接收用户的请求,调用模型处理数据,然后将处理结果传递给视图进行展示。

在 Java Web 开发中,通常使用 Servlet 作为 Controller,负责接收用户的请求,调用 Model 处理数据,然后将处理结果传递给 JSP 作为 View 进行展示。

2. Servlet + JSP 的工作流程

Servlet + JSP 的工作流程大致如下:

  1. 客户端发送 HTTP 请求到 Servlet。
  2. Servlet 接收到请求后,调用 Model 处理数据。
  3. Model 处理完数据后,将处理结果返回给 Servlet。
  4. Servlet 将处理结果存储到 request 或 session 作用域中。
  5. Servlet 将请求转发(forward)或重定向(redirect)到 JSP 页面。
  6. JSP 页面从 request 或 session 作用域中获取数据,并进行展示。
  7. JSP 页面生成 HTML 响应,返回给客户端。

代码示例:

Servlet:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 模拟从数据库中获取用户信息
        String username = "代码小王子";
        int age = 18;

        // 将用户信息存储到 request 作用域中
        request.setAttribute("username", username);
        request.setAttribute("age", age);

        // 将请求转发到 user.jsp 页面
        request.getRequestDispatcher("/user.jsp").forward(request, response);
    }
}

JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>用户信息</title>
</head>
<body>
    <h1>用户信息</h1>
    <p>姓名:${username}</p>
    <p>年龄:${age}</p>
</body>
</html>

3. ServletContext, ServletConfig, and Session

这三个对象在Servlet和JSP中扮演着重要的角色,理解它们对于构建健壮的Web应用至关重要。

  • ServletContext: 整个Web应用的“大管家”,它在Web应用启动时创建,并在Web应用关闭时销毁。所有Servlet和JSP都可以访问同一个ServletContext。你可以把ServletContext看作是Web应用的全局存储,可以用来存储一些共享的信息,例如数据库连接池、应用程序配置等。使用 getServletContext() 方法获取。

    • 特点: 全局唯一,生命周期长(随Web应用启动和停止)。
    • 用途: 存储全局配置信息,共享资源,记录日志等。
  • ServletConfig: 每个Servlet的“小助手”,它在Servlet初始化时创建,并在Servlet销毁时销毁。每个Servlet都有自己的ServletConfig对象,其中包含了该Servlet的初始化参数。 你可以把ServletConfig看作是Servlet的局部配置,可以用来存储一些Servlet特有的信息,例如Servlet的名称、初始化参数等。使用 getServletConfig() 方法获取。

    • 特点: 每个Servlet独有,生命周期与Servlet一致。
    • 用途: 获取Servlet的初始化参数。
  • HttpSession: 每个用户的“专属空间”,它在用户第一次访问Web应用时创建,并在用户会话结束时销毁。每个用户都有自己的HttpSession对象,可以用来存储用户的会话信息,例如用户名、登录状态、购物车内容等。使用 request.getSession() 方法获取。

    • 特点: 每个用户独有,生命周期与用户会话一致。
    • 用途: 存储用户会话信息,实现用户登录、购物车等功能。

总结:

Servlet 和 JSP 是 Java Web 开发的基石,掌握它们对于构建 Web 应用至关重要。Servlet 负责处理业务逻辑,JSP 负责展示页面,两者配合使用,可以构建出功能强大、界面美观的 Web 应用。希望今天的讲座能够帮助大家更好地理解 Servlet 和 JSP,并在实际开发中灵活运用它们。

划重点:

  • Servlet 是“搬砖工”,负责处理请求。
  • JSP 是“设计师”,负责美化页面。
  • Servlet + JSP 是“黄金搭档”,共同构建 Web 应用。
  • ServletContext 是“大管家”,ServletConfig 是“小助手”,HttpSession 是“专属空间”。

好了,今天的讲座就到这里,感谢大家的聆听!如果大家还有什么问题,可以在评论区留言,我会尽力解答。下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注