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

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

相关文章

  • SpringMvc响应数据及结果视图实现代码

    SpringMvc响应数据及结果视图实现代码

    这篇文章主要介绍了SpringMvc响应数据及结果视图实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java操作mongodb基础(查询 排序 输出list)

    java操作mongodb基础(查询 排序 输出list)

    java操作mongodb基础学习查询,排序,limit,输出为list实例,大家参考使用吧
    2013-12-12
  • springboot配置redis过程详解

    springboot配置redis过程详解

    这篇文章主要介绍了springboot配置redis过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • mybatis整合springboot报BindingException:Invalid bound statement (not found)异常解决

    mybatis整合springboot报BindingException:Invalid bound stateme

    这篇文章主要给大家介绍了关于mybatis整合springboot报BindingException:Invalid bound statement (not found)异常的解决办法,这个错误通常是由于Mapper文件中的statement id与Java代码中的方法名不一致导致的,需要的朋友可以参考下
    2024-01-01
  • Java异常退出条件的判断示例代码

    Java异常退出条件的判断示例代码

    这篇文章主要介绍了Java异常退出条件的判断示例代码,涉及常见异常退出条件等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • MyBatis的动态SQL语句实现

    MyBatis的动态SQL语句实现

    这篇文章主要介绍了MyBatis的动态SQL语句实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Spring声明式事务@Transactional注解实现元数据驱动的事务管理

    Spring声明式事务@Transactional注解实现元数据驱动的事务管理

    这篇文章主要为大家介绍了Spring声明式事务@Transactional注解实现元数据驱动的事务管理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 使用mybatis-plus-generator进行代码自动生成的方法

    使用mybatis-plus-generator进行代码自动生成的方法

    这篇文章主要介绍了使用mybatis-plus-generator进行代码自动生成的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 解决Springboot获取不到nacos配置中心的配置问题

    解决Springboot获取不到nacos配置中心的配置问题

    由于项目使用的nacos老版本,存在风险bug, 需要将nacos升级至2.2.1及以上版本,版本升级完毕之后 启动项目发现项目开始报错,所以本文记录一下Springboot获取不到nacos配置中心的配置问题,文中有详细的解决方法,需要的朋友可以参考下
    2023-09-09
  • SpringBoot选择自有bean优先加载实现方法

    SpringBoot选择自有bean优先加载实现方法

    在一些需求中,可能存在某些场景,比如先加载自己的bean,然后自己的bean做一些DB操作,初始化配置问题,然后后面的bean基于这个配置文件,继续做其他的业务逻辑。因此有了本文的这个题目
    2023-03-03

最新评论