在jsp的学习中,转发与重定向的区别是一个难点。
//重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。
上述内容通过搜索得知。重定向的过程中无法再使用request
代码
|
使用重定向跳转页面,用于重定向的request无法保存所以需要使用session 所以FirstServlet package com.demo;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
/** * Servlet implementation class FirstServlet */ @WebServlet("/FirstServlet") public class FirstServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/** * @see HttpServlet#HttpServlet() */ public FirstServlet() { super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //请求转发 //String sno=request.getParameter("sno"); //RequestDispatcher requestDispatcher=request.getRequestDispatcher("SecondServlet"); //requestDispatcher.forward(request, response); //请求重定向 //向session中保存Student对象 //response.sendRedirect("SecondServlet"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); // 给该session放入属性 String name=request.getParameter("name"); String sno=request.getParameter("sno"); Student student=new Student(); student.setName(name); student.setSno(sno); session.setAttribute("name", name); session.setAttribute("sno", sno); response.sendRedirect("SecondServlet"); }
} 实现过程中发现程序必须在doGet中才能显示,所以使用了doPost(request,response); SecondServlet package com.demo;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
/** * Servlet implementation class SecondServlet */ @WebServlet("/SecondServlet") public class SecondServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/** * @see HttpServlet#HttpServlet() */ public SecondServlet() { super(); // TODO Auto-generated constructor stub }
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String name = (String) session.getAttribute("name"); String sno = (String) session.getAttribute("sno"); out.println("name:"+name+"sno:"+sno);
}
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //out.println("sno:"+request.getParameter("sno")); //out.println("name:"+request.getParameter("name")); //out.println("dopost"); //response.setContentType("text/html;charset=utf-8"); //PrintWriter out = response.getWriter(); // HttpSession session = request.getSession(); // String name = (String) session.getAttribute("name"); // String sno = (String) session.getAttribute("sno"); //out.println("name:"+name+"sno:"+sno); doPost(request,response);
}
}
|
|
运行程序发现页面已跳转到servlet2 |
这篇博客主要探讨了在JSP学习中,转发与重定向的区别。转发是内部调用,浏览器URL不变,而重定向会导致浏览器发起新请求,URL改变,且速度相对较慢,重定向后request对象无法再使用。


被折叠的 条评论
为什么被折叠?



