Java Servlet跳转案例如何实现

wen java案例 22

Java Servlet 跳转案例实现

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

Java Servlet跳转案例如何实现

环境准备

创建一个简单的 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&param2=value2");

3 使用相对路径

// 相对路径重定向
response.sendRedirect("target.jsp");
// 绝对路径重定向
response.sendRedirect(request.getContextPath() + "/target.jsp");

注意事项

  1. 转发不能访问 WEB-INF 目录外的资源
  2. 重定向会丢失请求头信息
  3. 转发后不要进行响应写入操作
  4. 使用重定向传递敏感数据时要注意安全性
  5. 生产环境建议使用绝对路径避免路径问题

通过以上案例,您可以根据实际需求选择合适的跳转方式实现 Servlet 的页面跳转功能。

抱歉,评论功能暂时关闭!