Java基础(①Tomcat + Servlet + JSP)

准备环境

安装 JDK(推荐 JDK 8 或 11)

配置好 JAVA_HOME 和 PATH

java -version 确认成功

安装 Tomcat

去 Tomcat 官网 下载 Tomcat 9/10,解压到本地

记住路径,比如 D:\apache-tomcat-9.0.XX

进入VS Code

打开命令面板(Ctrl+Shift+P)

输入Maven:New Project

选择一个 archetype(项目模板)

复制代码
maven-archetype-webapp

这是官方提供的最小 JSP/Servlet Web 应用模板

添加的依赖

你现在的 pom.xml 是 archetype 自动生成的最基础版本,只带了 junit 测试依赖。要让它能跑 Servlet + JSP ,你需要在 <dependencies> 里加上几个关键依赖

XML 复制代码
<dependencies>
    <!-- Servlet API:提供 HttpServlet、HttpServletRequest/Response 等类 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSP API:支持 JSP 页面编译 -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSTL 标签库(常用 JSP 标签,比如 <c:forEach>) -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- 你已有的 junit 测试依赖可以保留 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>

javax.servlet-api:让你能写 HttpServlet

javax.servlet.jsp-api:让 JSP 页面能被编译

jstl:JSP 常用标签库,简化页面逻辑

scope=provided:表示运行时由 Tomcat 提供,不会打进 war 包里

更新依赖

在项目根目录(有 pom.xml 的地方)执行:

XML 复制代码
mvn clean package

放到 Tomcat 运行

在项目根目录执行:

XML 复制代码
mvn clean package

生成 target/mywebapp.war

把 mywebapp.war 拷贝到 Tomcat 的 webapps/ 目录

启动 Tomcat(双击 bin/startup.bat 或 startup.sh

补全目录结构

src/main 下新建 java 目录(用来放 Java 源码):

XML 复制代码
mywebapp
├── src
│   └── main
│       ├── java          ← 新建这个目录
│       │   └── com
│       │       └── example
│       │           └── LoginServlet.java
│       └── webapp
│           ├── index.jsp
│           └── WEB-INF
│               └── web.xml
└── pom.xml

完整版 LoginServlet(仅支持 JSON)

java 复制代码
package com.example;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/api/login")
public class LoginServlet extends HttpServlet {

    private final ObjectMapper mapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");

        // 读取 JSON 请求体
        StringBuilder sb = new StringBuilder();
        try (BufferedReader reader = req.getReader()) {
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        }

        // 解析 JSON
        Map<String, String> data = mapper.readValue(sb.toString(), Map.class);
        String username = data.get("username");
        String password = data.get("password");

        // 构造返回结果
        Map<String, Object> result = new HashMap<>();
        if ("admin".equals(username) && "123456".equals(password)) {
            result.put("status", "success");
            result.put("message", "登录成功");

            Map<String, String> userInfo = new HashMap<>();
            userInfo.put("id", "1001");
            userInfo.put("name", "管理员");
            userInfo.put("email", "admin@example.com");
            result.put("user", userInfo);

            // 保存到 session
            HttpSession session = req.getSession();
            session.setAttribute("user", userInfo);
        } else {
            result.put("status", "fail");
            result.put("message", "用户名或密码错误");
        }

        // 输出 JSON 响应
        mapper.writeValue(resp.getWriter(), result);
    }
}

curl 示例

java 复制代码
curl -X POST http://localhost:8080/mywebapp/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123456"}'

JSESSIONID 就像寄存柜的小票号码
Session 数据(比如 {userId=1001, name="管理员"})就像你放在柜子里的东西
Tomcat 的内存 就是那一排排寄存柜

流程是这样的:

你第一次来(登录),Tomcat 给你开了一个柜子(新建 Session),并给你一张小票号码(JSESSIONID)

你下次再来,把小票号码交给服务员(浏览器带上 Cookie: JSESSIONID=...)

服务员(Tomcat)拿着号码去柜子里找,找到你之前的柜子(Session),取出里面的东西(session.getAttribute("user"))

相关推荐
一定要AK2 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao2 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao2 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4943 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
不吃香菜学java4 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
wuxinyan1234 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书4 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队4 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
洛_尘4 小时前
Java EE进阶:Linux的基本使用
java·java-ee
宸津-代码粉碎机4 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python