案例思路

本案例是转账的案例。这里直接使用接口的方式,不实现具体的页面,通过接口调用的方式来模拟。最终将实现,在没有 Spring 的情况下实现各种功能。

添加依赖

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.21</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
    </dependency>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.6</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.1_2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.39</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>9.0.39</version>
    </dependency>
</dependencies>

什么是 Servlet?

Servlet 是 Java EE 技术的一部分,用于创建动态 Web 应用程序。它是一种在服务器端运行的小型 Java 程序,用于处理客户端的请求和生成动态响应。Servlet 的核心作用是扩展服务器的功能,特别是处理基于 HTTP 的请求。

Servlet 的核心概念

  • Servlet 容器:Servlet 是由 Servlet 容器(如 Tomcat、Jetty 等)管理的
  • 请求-响应模型:Servlet 使用 HTTP 请求和响应模型来处理客户端请求
  • 生命周期:加载和实例化 → 初始化(init())→ 服务(service())→ 销毁(destroy())

Servlet 的特点

  • 平台无关性:基于 Java 技术,可在任何支持 Java 的 Web 服务器上运行
  • 高效性:使用线程处理请求,避免每个请求创建新进程的开销
  • 安全性:Java 提供内置的安全机制
  • 便捷性:通过标准的 API 和 Java 的强大功能开发动态 Web 应用

Servlet 的工作原理

  1. 客户端请求:浏览器发送 HTTP 请求到 Web 服务器
  2. 容器分发:Web 服务器将请求交给 Servlet 容器
  3. 处理请求:Servlet 容器调用 service() 方法,根据请求类型调用 doGet() 或 doPost()
  4. 返回响应:容器将响应发送回客户端

Servlet 代码编写

package wzk;

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

@WebServlet(name="wzkServlet", urlPatterns = "/wzkServlet")
public class WzkServlet extends HttpServlet {

    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, IOException {
        System.out.println("doGet!");
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().print("hello!");
    }

}

启动类

package wzk;

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;

import java.io.File;

public class WzkStart {

    public static void main(String[] args) throws LifecycleException {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(Integer.getInteger("port", 8999));
        tomcat.getConnector();
        Context context = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());
        WebResourceRoot resources = new StandardRoot(context);
        resources.addPreResources(
                new DirResourceSet(resources, "/WEB-INF/classes",
                        new File("target/classes").getAbsolutePath(), "/"));
        context.setResources(resources);

        tomcat.start();
        tomcat.getServer().await();
    }

}

运行代码

运行 WzkStart,控制台输出:

11月 18, 2024 4:12:41 下午 org.apache.jasper.servlet.TldScanner scanJars
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
11月 18, 2024 4:12:41 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8999"]

访问项目

访问地址:http://localhost:8999/wzkServlet

返回结果:hello!

数据库

创建新表

CREATE TABLE `wzk_account` (
  `card` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `money` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

插入数据

INSERT INTO wzk_account VALUES('1', 'wzk', 500);
INSERT INTO wzk_account VALUES('2', 'icu', 500);