准备环境
安装 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"))