注册/登录

聊聊Java中的转发与重定向

开发 后端
转发和重定向都是实现页面跳转,也就是说,当我们访问一个 Servlet 的时候 ,Servlet 帮我们跳转到另一个界面。

[[390002]]

本文转载自微信公众号「见贤思编程」,作者泰斗贤若如。转载本文请联系见贤思编程公众号。

转发与重定向简介

转发和重定向都是实现页面跳转

也就是说,当我们访问一个 Servlet 的时候 ,Servlet 帮我们跳转到另一个界面。

转发与重定向的区别

  • 实现转发调用的是 HttpServletRequest 对象中的方法
  • 实现重定向调用的是 HttpServletResponse 对象中的方法
  • 转发时浏览器中的 url 地址不会发生改变
  • 重定向时浏览器中的 url 地址会发生改变
  • 转发时浏览器只请求一次服务器
  • 重定向时浏览器请求两次服务器
  • 转发能使用 request 带数据到跳转的页面
  • 重定向能使用 ServletContext 带数据到跳转的页面
  • 代码演示转发和重定向

    1. package servlet; 
    2.  
    3.  
    4. import javax.servlet.ServletException; 
    5. import javax.servlet.annotation.WebServlet; 
    6. import javax.servlet.http.HttpServlet; 
    7. import javax.servlet.http.HttpServletRequest; 
    8. import javax.servlet.http.HttpServletResponse; 
    9. import java.io.IOException; 
    10.  
    11.  
    12. @WebServlet("/login"
    13. public class ServletDemo extends HttpServlet { 
    14. @Override 
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    16. //获取表单提交过来的数据 
    17. //getParameter()方法可以获取请求的参数信息 
    18. String name = req.getParameter("name"); 
    19. String password = req.getParameter("password"); 
    20.  
    21.  
    22. //打印获取到的参数信息 
    23. System.out.println("name:"+name); 
    24. System.out.println("password:"+password); 
    25.  
    26.  
    27. //如果name=admin,password=123,则跳转到succee.jsp,否则跳转到fail.jsp 
    28. if("admin".equals(name)&&"123".equals(password)){ 
    29. //通过转发实现跳转 
    30. req.getRequestDispatcher("/success.jsp").forward(req,resp); 
    31. }else { 
    32. //通过重定向实现跳转 
    33. resp.sendRedirect("/fail.jsp"); 
    34.  
    35.  
    36. @Override 
    37. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    38. doGet(req, resp); 
    39.  
    40.  

    JSP代码

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
    2. <html> 
    3. <head> 
    4. <title>登录</title> 
    5. </head> 
    6. <body> 
    7. <form action="/login"
    8. <table align="center"
    9. <tr> 
    10. <td>账号:</td> 
    11. <td><input type="text" name="name"></td> 
    12. </tr> 
    13. <tr> 
    14. <td>密码:</td> 
    15. <td><input type="text" name="password"></td> 
    16. </tr> 
    17. <tr> 
    18. <td><input type="submit" value="登录"></td> 
    19. <td><input type="reset" value="重置"></td> 
    20. </tr> 
    21. </table
    22. </form> 
    23. </body> 
    24. </html> 

    转发和重定向如何带数据到某个页面

    1. package servlet; 
    2. import javax.servlet.ServletContext; 
    3.  
    4. import javax.servlet.ServletException; 
    5.  
    6. import javax.servlet.annotation.WebServlet; 
    7.  
    8. import javax.servlet.http.HttpServlet; 
    9.  
    10. import javax.servlet.http.HttpServletRequest; 
    11.  
    12. import javax.servlet.http.HttpServletResponse; 
    13.  
    14. import java.io.IOException; 
    15. @WebServlet("/login"
    16.  
    17. public class ServletDemo extends HttpServlet { 
    18.  
    19. @Override 
    20.  
    21. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    22. //通过转发带数据 
    23.  
    24. req.setAttribute("name","张三"); 
    25.  
    26. req.getRequestDispatcher("/send.jsp").forward(req,resp); 
    27. @Override 
    28.  
    29. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    30.  
    31. doGet(req, resp); 
    32.  

    send.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
    2. <html> 
    3. <head> 
    4. <title>转发和重定向传代数据练习</title> 
    5. </head> 
    6. <body> 
    7. <% 
    8. //1、接收转发传代的数据 
    9. String name = (String) request.getAttribute("name"); 
    10. out.println("转发传代的数据:"+name); 
    11.  
    12.  
    13. %> 
    14.  
    15.  
    16. </body> 
    17. </html> 
    1. package servlet; 
    2. import javax.servlet.ServletContext; 
    3.  
    4. import javax.servlet.ServletException; 
    5.  
    6. import javax.servlet.annotation.WebServlet; 
    7.  
    8. import javax.servlet.http.HttpServlet; 
    9.  
    10. import javax.servlet.http.HttpServletRequest; 
    11.  
    12. import javax.servlet.http.HttpServletResponse; 
    13.  
    14. import java.io.IOException; 
    15. @WebServlet("/login"
    16.  
    17. public class ServletDemo extends HttpServlet { 
    18.  
    19. @Override 
    20.  
    21. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    22.  
    23.  
    24.  
    25. //通过重定向带数据 
    26.  
    27. ServletContext servletContext = this.getServletContext(); 
    28.  
    29. servletContext.setAttribute("name","王二麻子"); 
    30.  
    31. resp.sendRedirect("/send2.jsp"); 
    32. @Override 
    33.  
    34. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    35.  
    36. doGet(req, resp); 
    37.  

    send2.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
    2. <html> 
    3. <head> 
    4. <title>转发和重定向传代数据练习</title> 
    5. </head> 
    6. <body> 
    7. <% 
    8. //1、接收重定向传代的数据 
    9. String name1 = (String)application.getAttribute("name"); 
    10. out.println("重定向传代的数据:"+name1); 
    11. %> 
    12. </body> 
    13. </html> 

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
    2. <html> 
    3. <head> 
    4. <title>Title</title> 
    5. </head> 
    6. <body> 
    7. <form action="CountServlet" method="post"
    8. <h3>加法计算器</h3> 
    9. 加数1:<input type="number" name="one"
    10. 加数2:<input type="number" name="two"
    11. <input type="submit" value="计算"
    12. </form> 
    13. </body> 
    14. </html> 

    count.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
    2. <html> 
    3. <head> 
    4. <title>Title</title> 
    5. </head> 
    6. <body> 
    7. 计算结果:<%=request.getAttribute("count")%> 
    8. <!--计算结果:<%=application.getAttribute("count")%>--> 
    9. </body> 
    10. </html> 

    Servlet

    1. package servlet; 
    2. import javax.servlet.ServletContext; 
    3. import javax.servlet.ServletException; 
    4. import javax.servlet.annotation.WebServlet; 
    5. import javax.servlet.http.HttpServlet; 
    6. import javax.servlet.http.HttpServletRequest; 
    7. import javax.servlet.http.HttpServletResponse; 
    8. import java.io.IOException; 
    9. @WebServlet("/CountServlet"
    10. public class CountServlet extends HttpServlet { 
    11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    12. String one=request.getParameter("one"); 
    13. int o=Integer.parseInt(one);//强制转换,将String类型的数据转换成int类型 
    14. String two=request.getParameter("two"); 
    15. int t=Integer.parseInt(two);//强制转换,将String类型的数据转换成int类型 
    16. System.out.println(one+" "+two); 
    17. int c=o+t; 
    18. String co=String.valueOf(c);//将int类型的数据转换成String类型 
    19. //转发,可以携带数据 
    20. request.setAttribute("count",co); 
    21. request.getRequestDispatcher("count.jsp").forward(request,response); 
    22. //用于存放数据 
    23. // ServletContext s=this.getServletContext(); 
    24. // s.setAttribute("count",co); 
    25. //重定向只能依靠ServletContext获取数据 
    26. // response.sendRedirect("count.jsp"); 
    27. System.out.println(co); 
    28. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    29. doPost(request,response); 

    责任编辑:武晓燕 见贤思编程
    点赞
    收藏