一、Servlet 前后端交互核心概念
在 Java Web 中,Servlet 是处理客户端请求的核心组件,前后端交互的核心是:
-
`HttpServletRequest`(`req`):接收前端传递的请求数据(如表单参数、URL参数);
-
`HttpServletResponse`(`resp`):将后端处理结果返回给前端(如文本、HTML、JSON)。
二、方式1:Form 表单提交(同步交互)
Form 表单是最基础的前后端交互方式,通过 `action` 指定后端 Servlet 地址,`method` 指定请求方式(GET/POST)。
2.1 登录功能实现(Form + Servlet)
(1)前端登录页面(login.html)
```html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<!-- action:后端Servlet地址;method:请求方式 -->
<form action="/sev0910/login" method="post">
<label>用户名:</label>
<input type="text" name="username" placeholder="请输入用户名">
<br>
<label>密码:</label>
<input type="password" name="password" placeholder="请输入密码">
<br>
<input type="submit" value="登录">
</form>
</body>
</html>
```
(2)后端 LoginServlet 处理请求
```java
java
package com.qcby.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:映射Servlet的访问路径(与Form的action对应)
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 通过req获取前端传递的参数(name属性对应)
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2. 模拟登录校验(实际项目中需查数据库)
if ("admin".equals(username) && "123456".equals(password)) {
// 3. 通过resp向前端返回结果
resp.getWriter().write("success");
} else {
resp.getWriter().write("error");
}
}
}
```
2.2 注册功能实现(含多类型表单元素)
(1)前端注册页面(register.html)
```html
java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/sev0910/register" method="post">
<label for="name">用户名:</label>
<input type="text" id="name" name="username">
<br>
<label for="password">密码:</label>
<input type="password" id="password" name="password">
<br>
<!-- 单选框:name相同表示同一组 -->
<label>性别:</label>
<input type="radio" id="male" name="gender" value="male" checked>
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
<br>
<!-- 复选框 -->
<input type="checkbox" id="subscribe" name="subscribe" checked>
<label for="subscribe">订阅推送</label>
<br>
<!-- 下拉选择框 -->
<label for="country">国家:</label>
<select id="country" name="country">
<option value="CN">中国</option>
<option value="US">美国</option>
<option value="UK">英国</option>
</select>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
```
(2)后端 RegisterServlet 处理请求
```java
java
package com.qcby.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("/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取表单所有参数(与前端name属性对应)
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String subscribe = req.getParameter("subscribe");
String country = req.getParameter("country");
// 打印参数(实际项目中需存入数据库)
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
System.out.println("性别:" + gender);
System.out.println("订阅:" + subscribe);
System.out.println("国家:" + country);
}
}
```
三、方式2:AJAX 异步交互(jQuery 实现)
Form 表单提交会刷新页面,而 AJAX 可以实现异步无刷新交互,通常结合 jQuery 简化代码。
3.1 引入 jQuery
在 HTML 中引入 jQuery 库(通过 CDN 或本地文件):
```html
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
```
3.2 登录功能的 AJAX 实现
(1)前端登录页面(ajax-login.html)
```html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX登录页面</title>
<!-- 引入jQuery -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<label>用户名:</label>
<input type="text" id="username" placeholder="请输入用户名">
<br>
<label>密码:</label>
<input type="password" id="password" placeholder="请输入密码">
<br>
<!-- 按钮绑定点击事件 -->
<input type="button" onclick="login()" value="登录">
<script>
function login() {
// 1. 获取输入框的值(通过id选择器)
var username = $("username").val();
var password = $("password").val();
// 2. AJAX异步请求
$.ajax({
type: "POST", // 请求方式(与Servlet的doPost对应)
url: "/sev0910/login", // 后端Servlet地址
data: { // 传递的参数(键值对)
"username": username,
"psw": password
},
success: function(data) { // 后端响应成功后的回调
// 处理返回结果(如提示登录成功/失败)
console.log("后端返回:" + data);
if (data === "success") {
alert("登录成功!");
} else {
alert("用户名或密码错误!");
}
}
});
}
</script>
</body>
</html>
```
(2)后端 LoginServlet 适配 AJAX
只需调整参数名(与 AJAX 的 `data` 键对应):
```java
java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("psw"); // 对应AJAX的"psw"
if ("admin".equals(username) && "123456".equals(password)) {
resp.getWriter().write("success");
} else {
resp.getWriter().write("error");
}
}
```
四、核心知识点总结
4.1 Form 表单交互要点
-
`action`:后端 Servlet 的访问路径(需与 `@WebServlet` 注解的路径一致);
-
`method`:请求方式(GET/POST),对应 Servlet 的 `doGet()`/`doPost()`;
-
表单元素的 `name` 属性:是后端 `req.getParameter()` 获取参数的唯一标识。
4.2 AJAX 交互要点
-
异步无刷新:不刷新页面即可与后端交互,提升用户体验;
-
jQuery.ajax() 参数:
-
`type`:请求方式;
-
`url`:后端地址;
-
`data`:传递的参数(键值对);
-
`success`:后端响应成功后的回调函数。
4.3 Servlet 核心 API
-
`req.getParameter(String name)`:获取前端传递的参数;
-
`resp.getWriter().write(String data)`:向前端返回文本数据。
五、部署与访问
-
将 HTML 文件放在 Web 项目的 `webapp` 目录下;
-
启动 Tomcat 服务器;
-
访问页面:
通过本文的案例,你已掌握 Java Web 中最基础的前后端交互方式。实际项目中,还可以结合 JSON 格式传递复杂数据,或使用框架(如 SpringMVC)简化 Servlet 开发,但核心交互逻辑与本文一致。