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.lang.String和java.util.NClob互相转换方式
这篇文章主要介绍了java.lang.String和java.util.NClob互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09
springboot项目mapper无法自动装配未找到 UserMapper 类型的Bean解决办法
这篇文章给大家介绍了springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的 Bean解决办法(含报错原因),文章通过图文结合的方式介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下2024-02-02
Java字符串拼接+和StringBuilder的比较与选择
Java 提供了两种主要的方式:使用 "+" 运算符和使用 StringBuilder 类,本文主要介绍了Java字符串拼接+和StringBuilder的比较与选择,感兴趣的可以了解一下2023-10-10


最新评论