Javaweb-HttpServletResponse的sendRedirectch重定向方式

 更新时间:2023年09月19日 16:43:51   作者:markliwei1  
这篇文章主要介绍了Javaweb-HttpServletResponse的sendRedirectch重定向方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一 、sendRedirect

1.1 重定向过程

当使用HttpServletResponse的sendRedirect()时会发生重定向时,服务器会在Servlet中设置HTTP状态码为301以及Location标头返回给浏览器,浏览器收到这个标头以后会再一次使用GET方法请求重定向的URL,因此地址栏的URL会发生变化。

1.2 sendRedirect使用方法

response.sendRedirect(URL url);

二、实验

2.1使用sendRedirect()进行重定向,同时使用HttpServletRequest中的setAttribute进行属性设置

在浏览器中输入http://localhost:8088/send_redirect.html

send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Zoubaitao

点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect

服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;
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("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        request.setAttribute("name",name);
        //setAttribute("name",name);
        response.sendRedirect("http://localhost:8088/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

最后输出的结果为

结果分析:

  • 我们发现我们在request中设置的name属性并没有传递到welcome的request对象中。
  • 而welcome.jsp中的request对象不存在一个name 属性值,所以不输出

2.2使用sendRedirect()进行重定向,同时使用HttpServletRequest中的setAttribute进行属性设置

在浏览器中输入http://localhost:8088/send_redirect.html

send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Yanzi

点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect

服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;
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("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        this.getServletContext.setAttribute("name",name);
        //setAttribute("name",name);
        response.sendRedirect("http://localhost:8088/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

结果输出

结果分析

  • 我们通过ServletContext来设置的属性,最后能够在重定向的welcome.jsp中得到这个属性值,最终输出在浏览器上。
  • 因此如果我们需要在重定向的时候设置共享的变量,那么我们需要使用的ServletContext来设置属性。
  • 同时我们可以看到URL地址栏变成了我们设置的重定向的地址

2.3使用sendRedirect()进行重定向,但是我们重定向的资源放在WEB-INF文件夹下

在浏览器中输入http://localhost:8088/send_redirect.html

send_redirect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
    Name:<input type="text" name="name"/><br/>
    Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>

在网页的Name这一栏输入Yanzi

点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect

服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;

SendRedirectServlet.java

package httpservletresponse;
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("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        response.setContentType("text/html");
        this.getServletContext.setAttribute("name",name);
        //资源路径为WEB-INF文件夹下
        response.sendRedirect("http://localhost:8088/WEB-INF/welcome.jsp");
    }
}

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    Welcome<br/>
    ${name}
</body>
</html>

结果输出

结果分析

  • 我们将我们重定向的资源放在了WEB-INF文件夹下,所以浏览器是无法访问到的。
  • 这是重定向和转发之间的一个不同点,转发有服务器自己处理转发请求,但是重定向是浏览器对重定向的资源再一次进行请求。
  • 这从请求次数上,转发只请求一次,但是重定向至少请求两次。

三、总结

RequestDispatcher的forward()和HttPServletResponse的sendRedirect()之间的不同

1) foward()就可以访问WEB-INF文件夹下的资源,而sendRedirect()不能重定向在WEB-INF文件夹下的资源

2) forward()进行转发时是服务器内部进行处理,因此浏览器不知道发生的变化,所以浏览器的URL不会发生变化,而sendRedirect()会发生变 换,是因为浏览器会从服务器得到301状态码以后会再一次按照重定向的URL以get的方式请求服务器。所以服务器地址栏的URL发生变化

3) forward()可以通过HttpServletRequest的setAttribute()和ServletContex的setAttribute()设置共享属性。而sendRedirect()只能通过ServletContext()的setAttribute()进行访问属性(其实二者另外还都可以使用Session来存储共享的数据)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现6种字符串数组的排序(String array sort)

    java实现6种字符串数组的排序(String array sort)

    这篇文章主要介绍了java实现6种字符串数组的排序(String array sort),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java线程池使用场景及一些建议

    java线程池使用场景及一些建议

    本文主要介绍了java线程池使用场景及一些建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • springcloud-feign调用报错问题

    springcloud-feign调用报错问题

    这篇文章主要介绍了springcloud-feign调用报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java高效实现PDF与OFD的相互转换的示例代码

    Java高效实现PDF与OFD的相互转换的示例代码

    在数字化办公日益普及的今天,文档格式的标准化与跨平台兼容性成为企业和开发者面临的重要挑战,OFD作为国家标准,在政务、金融等领域具有不可替代的地位,而PDF则以其广泛的兼容性成为日常交流的首选本文将深入探讨如何高效地实现PDF与OFD的相互转换
    2025-10-10
  • Java JDBC数据库连接失败的7种常见原因及解决方案

    Java JDBC数据库连接失败的7种常见原因及解决方案

    Java JDBC(Java Database Connectivity)是Java平台中用于执行SQL语句的标准API,它为开发者提供了与各种关系型数据库进行交互的能力,本文为大家介绍了Java JDBC数据库连接失败的7种常见原因及解决方案,需要的朋友可以参考下
    2025-11-11
  • mybatis之多参数查询方式

    mybatis之多参数查询方式

    这篇文章主要介绍了mybatis之多参数查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • ConditionalOnProperty配置swagger不生效问题及解决

    ConditionalOnProperty配置swagger不生效问题及解决

    这篇文章主要介绍了ConditionalOnProperty配置swagger不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 浅谈java String.split丢失结尾空字符串的问题

    浅谈java String.split丢失结尾空字符串的问题

    下面小编就为大家带来一篇浅谈java String.split丢失结尾空字符串的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Tomcat调优详解

    Tomcat调优详解

    这篇文章主要介绍了Tomcat调优方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 盘点SpringBoot中@Async注解的遇到的坑点及解决办法

    盘点SpringBoot中@Async注解的遇到的坑点及解决办法

    SpringBoot是一个流行的Java开发框架,在异步编程方面,Spring Boot提供了@Async注解,它能够让方法异步执行,然而,在使用@Async注解时,有一些潜在的坑需要注意,本文将深入探讨Spring Boot中使用@Async注解时可能遇到的8大坑点,并提供相应的解决方案
    2024-03-03

最新评论