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来存储共享的数据)

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

相关文章

  • RestFul风格 — 使用@PathVariable传递参数报错404的解决

    RestFul风格 — 使用@PathVariable传递参数报错404的解决

    这篇文章主要介绍了RestFul风格 — 使用@PathVariable传递参数报错404的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 详解Java的Proxy动态代理机制

    详解Java的Proxy动态代理机制

    Java有两种代理方式,一种是静态代理,另一种是动态代理。对于静态代理,其实就是通过依赖注入,对对象进行封装,不让外部知道实现的细节。很多 API 就是通过这种形式来封装的
    2021-06-06
  • Linux系统下安装和卸载JDK8的方式

    Linux系统下安装和卸载JDK8的方式

    这篇文章主要介绍了Linux安装和卸载JDK8,第一种是使用yum命令一键安装,默认安装目录在/usr/lib/jvm第二种是手动安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Maven学习----Maven安装与环境变量配置教程

    Maven学习----Maven安装与环境变量配置教程

    这篇文章主要给大家介绍了关于如何利用Maven入手Spring Boot第一个程序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Java线程同步的四种方式详解

    Java线程同步的四种方式详解

    这篇文章主要介绍了Java线程同步的四种方式详解,需要的朋友可以参考下
    2023-02-02
  • Spring Boot  Excel文件导出下载实现代码

    Spring Boot Excel文件导出下载实现代码

    这篇文章带领我们直接实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出。具体实现代码大家跟随小编一起通过本文学习吧
    2018-11-11
  • MyBatis-Plus自动填充字段的详细教程

    MyBatis-Plus自动填充字段的详细教程

    今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字段(如创建时间 createTime 和更新时间 updateTime),可以分为以下几个部分,这个教程将涵盖从项目配置到自动填充的完整过程,需要的朋友可以参考下
    2024-08-08
  • java实现切割wav音频文件的方法详解【附外部jar包下载】

    java实现切割wav音频文件的方法详解【附外部jar包下载】

    这篇文章主要介绍了java实现切割wav音频文件的方法,结合实例形式详细分析了java切割wav音频文件的相关原理、操作技巧与注意事项,并附带外部jar包供读者下载,需要的朋友可以参考下
    2019-05-05
  • java关于Date日期类型的大小比较

    java关于Date日期类型的大小比较

    这篇文章主要介绍了java关于Date日期类型的大小比较,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 多方面解读Java中的volatile关键字

    多方面解读Java中的volatile关键字

    这篇文章主要介绍了多方面解读Java中的volatile关键字,它的作用是强制对被修饰的变量的写操作立即刷新到主存中,并强制对该变量的读操作从主存中读取最新的值,而不是使用缓存中的值,需要的朋友可以参考下
    2023-05-05

最新评论