请求转发和重定向的区别
重定向需要发送2次请求(地址栏信息会发生变化,可以跳转到任意网页,web应用外的也可以),转发只需要发送1次请求(地址栏信息不会发生变化,只能跳转到web应用内的网页等)。
请求转发使用 getRequestDispatcher() 方法,重定向使用 sendRedirect() 方法。
getRequestDispatcher 和sendRedirect区别
1、request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 这个是在服务端运行的,对浏览器来说是透明的。
语法:
1、跳转到一个servlet
request.getRequestDispatcher("想跳转的servlet名").forward(request, response);
2、跳转到一个页面
request.getRequestDispatcher("文件路径").forward(request, response);
注意:1、Servlet 以及 页面 跳转的路径是相对路径。
2、forward方式只能跳转到本web应用中的页面上。
3、跳转后浏览器地址栏不会变化。
4、使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
5、request的作用范围是一次服务请求,不是整个web应用。
将本Servlet的内容(参数值)转发到另外一个Servlet的方法
1、request.setAttribute()方法,在另外一个Servlet中使用 request.getAttribute()方法获取传递的参数值。
2、request.getRequestDispatcher() 方法直接定义名称,并设置值,在另外一个Servlet中使用 request.getParameter()方法获取传递的参数值。
package com.RequestHttpServlet;
import java.io.IOException;
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;
/**
* Servlet implementation class FourRequestServlet
*/
@WebServlet("/FourRequestServlet")
public class FourRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FourRequestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//
request.setAttribute("pass", "789");
//获取转发器
request.getRequestDispatcher("FiveRequestServlet?name=username&value=123456").forward(request, response);
}
}
package com.RequestHttpServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FiveRequestServlet
*/
@WebServlet("/FiveRequestServlet")
public class FiveRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FiveRequestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("访问FiveRequestServlet");
String attribute = (String) request.getAttribute("pass");
System.out.println(attribute);
String username = request.getParameter("name");
System.out.println(username);
}
}
2、response.sendRedirect()是重新定向,前后页面不是一个request,只能用response调用。而这个是在浏览器端运行的。
语法:
1、response.sendRedirect("/a.jsp"); 跳转到web应用内的页面的路径是相对路径。
2、response.sendRedirect("URL"); 跳转到web应用外的任意网页
注意:1、跳转后浏览器地址栏变化。
2、方式要传值只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
3、该方式只适用于无传值跳转