Java Servlet 跳转案例实现
Java Servlet 支持两种跳转方式:转发(Forward) 和 重定向(Redirect),下面通过具体案例来展示两种方法的实现。

环境准备
创建一个简单的 Maven Web 项目,目录结构:
servlet-demo/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/
│ │ ├── ForwardServlet.java
│ │ ├── RedirectServlet.java
│ │ └── TargetServlet.java
│ └── webapp/
│ ├── WEB-INF/
│ │ └── web.xml
│ └── index.jsp
└── pom.xml
转发(Forward)案例
1 转发源 Servlet(ForwardServlet.java)
package com.example;
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("/forward")
public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求属性,传递到目标页面
request.setAttribute("message", "这是来自转发源的信息");
request.setAttribute("username", "张三");
// 执行转发到目标 Servlet
request.getRequestDispatcher("/target").forward(request, response);
}
}
2 目标 Servlet(TargetServlet.java)
package com.example;
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("/target")
public class TargetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取转发源传递的属性
String message = (String) request.getAttribute("message");
String username = (String) request.getAttribute("username");
out.println("<html>");
out.println("<head><title>目标页面</title></head>");
out.println("<body>");
out.println("<h1>转发目标页面</h1>");
out.println("<p>消息: " + message + "</p>");
out.println("<p>用户名: " + username + "</p>");
out.println("</body>");
out.println("</html>");
}
}
重定向(Redirect)案例
1 重定向源 Servlet(RedirectServlet.java)
package com.example;
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("/redirect")
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 使用 session 传递数据(重定向不能使用 request 属性传递数据)
request.getSession().setAttribute("message", "这是来自重定向源的信息");
// 执行重定向到目标页面
response.sendRedirect("target-redirect.jsp");
// 或者重定向到另一个 Servlet
// response.sendRedirect("target");
// 或者重定向到外部网站
// response.sendRedirect("http://www.example.com");
}
}
2 重定向目标 JSP 页面(target-redirect.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>重定向目标页面</title>
</head>
<body>
<h1>重定向目标页面</h1>
<%
// 从 session 中获取数据
String message = (String) session.getAttribute("message");
%>
<p>消息: <%= message %></p>
<p>请求URL: <%= request.getRequestURL() %></p>
<p>请求URI: <%= request.getRequestURI() %></p>
</body>
</html>
前端演示页面(index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>Servlet 跳转演示</title>
</head>
<body>
<h1>Servlet 跳转演示</h1>
<h2>转发演示</h2>
<p>特点:URL 不变,可以传递 request 属性,一次请求</p>
<a href="${pageContext.request.contextPath}/forward">点击进行转发</a>
<h2>重定向演示</h2>
<p>特点:URL 改变,需要 session 或 cookie 传递数据,两次请求</p>
<a href="${pageContext.request.contextPath}/redirect">点击进行重定向</a>
</body>
</html>
web.xml 配置(如果不使用注解)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Servlet Jump Demo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- Servlet 配置 -->
<servlet>
<servlet-name>forwardServlet</servlet-name>
<servlet-class>com.example.ForwardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>forwardServlet</servlet-name>
<url-pattern>/forward</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>redirectServlet</servlet-name>
<servlet-class>com.example.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>redirectServlet</servlet-name>
<url-pattern>/redirect</url-pattern>
</servlet-mapping>
</web-app>
Maven 依赖(pom.xml)
<dependencies>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JSP API -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
转发 vs 重定向 对比
| 特性 | 转发 (Forward) | 重定向 (Redirect) |
|---|---|---|
| 请求次数 | 1 次 | 2 次 |
| URL 变化 | 不变 | 改变 |
| 数据共享 | 可共享 request 属性 | 需使用 session 或 cookie |
| 速度 | 较快 | 较慢 |
| 适用场景 | 服务器内部跳转 | 跨域、防止表单重复提交 |
| 目标资源 | 同一应用内 | 同应用或外部 URL |
其他跳转方式
1 转发到 JSP 页面
// 转发到 WEB-INF 下的 JSP 页面
request.getRequestDispatcher("/WEB-INF/jsp/result.jsp").forward(request, response);
2 带参数的重定向
// 重定向带参数
response.sendRedirect("target?param1=value1¶m2=value2");
3 使用相对路径
// 相对路径重定向
response.sendRedirect("target.jsp");
// 绝对路径重定向
response.sendRedirect(request.getContextPath() + "/target.jsp");
注意事项
- 转发不能访问 WEB-INF 目录外的资源
- 重定向会丢失请求头信息
- 转发后不要进行响应写入操作
- 使用重定向传递敏感数据时要注意安全性
- 生产环境建议使用绝对路径避免路径问题
通过以上案例,您可以根据实际需求选择合适的跳转方式实现 Servlet 的页面跳转功能。