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 的页面跳转功能。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播