请求转发与响应重定向
在实际开发中是多个Servlet组合和调用,如a servlet到 b servlet之间如何进行通信和跳转呢?
多个Servlet(JSP)之间跳转有两种方式:
- request.getRequestDispatcher().forward()——请求转发
- response.sendRedirect()——重定向
CheckLoginServlet.java
package com.imooc.servletjdk;
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 CheckLoginServlet
*/
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CheckLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("用户已经登陆!");
request.getRequestDispatcher("/index").forward(request, response);
}
}
IndexPage.java
package com.imooc.servletjdk;
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 IndexPage
*/
@WebServlet("/index")
public class IndexPage extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public IndexPage() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("<h1>This is page</h1>");
}
}
接下来使用响应重定向
package com.imooc.servletjdk;
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 CheckLoginServlet
*/
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CheckLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("用户已经登陆!");
//请求转发
//request.getRequestDispatcher("/index").forward(request, response);
//响应重定向 需要加contextPath
response.sendRedirect("/rquest-struc/index");
}
}
总结:
请求转发:请求转发是服务器跳转,只会产生一次请求。
首先浏览器发送请求给Tomcat,Tomcat接收到请求后根据对应的映射找到Servlet1,Servlet1执行到"request.getRequestDispatcher("/Servlet2").forward(request, response);"时,就会在Tomcat服务器内部进行自动请求,请求的地址是Servlet2,Servlet2经过程序之后会把结构响应给Tomcat,Tomcat再把响应结果返回给浏览器。
响应重定向:重定向是浏览器跳转,会产生两次请求。首先浏览器发送请求1给Tomcat,Tomcat把请求1转发给Servlet1,Servlet1经过处理后发现有response.sendRedirect("/rquest-struc/index");这句话,就让Tomcat把响应1发送给浏览器,这个响应1就告知浏览器,要求重新生成一个新请求并且跳转到新的地址(Servlet2)上,浏览器就会遵循请求原则,当Servlet2处理后就根据响应规则让浏览器呈现用户所需要的东西。所以当使用response.sendRedirect()时,URL的地址会显示Servlet2的映射地址,这也说明浏览器是经过了两次请求。
设置请求自定义属性:
请求允许创建自定义属性
设置请求属性:request.setAttribute(属性名,属性值) 属性名为String,属性值为任意Java对象
获取请求属性:Object attr = request.getAttribute(属性名)
CheckLoginServlet.java
package com.imooc.servletjdk;
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 CheckLoginServlet
*/
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CheckLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("用户已经登陆!");
//自定义属性
request.setAttribute("username", "admin");
//请求转发
request.getRequestDispatcher("/index").forward(request, response);
}
}
IndexPage.java
package com.imooc.servletjdk;
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 IndexPage
*/
@WebServlet("/index")
public class IndexPage extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public IndexPage() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = (String)request.getAttribute("username");
response.getWriter().println("<h1>This is page "+name+"</h1>");
}
}