Javaweb-HttpServletResponse的sendRedirectch重定向方式
作者:markliwei1
一 、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来存储共享的数据)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。