转发
request.getRequestDispatcher("Other").forward(request, response);
转发是指浏览器发送请求到servlet1之后,servlet1需要访问servlet2,因此在服务器内部跳转到的servlet2,转发有时也称为服务器内跳转。整个过程浏览器只发出一次请求,服务器只发出一次响应。所以,无论是servlet1还是servlet2,整个过程中,只存在一次请求,即用户所提交的请求。因此servlet1和servlet2均可从这个请求中获取到用户提交请求时所携带的相关数据。
举例:你在专卖店选中一双篮球鞋,店员告诉你这双鞋现在没有了,让你稍等下,他去另外一个专卖店去取,店员取到鞋之后把鞋放到你手中
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>表单</title>
</head>
<body>
<form action="Forward01" method="post">
用户名:<input name="username" type="text">
<br>
密码:<input name="password" type="password">
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
创建名为Forward01的servlet:
package com.monkey1024.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 转发
*/
public class Forward01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding("UTF-8");
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username", username);
request.setAttribute("password", password);
//转发
request.getRequestDispatcher("Other").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
创建名称为Other的servlet:
package com.monkey1024.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 转发
*/
public class Other extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = (String)request.getAttribute("username");
String password = (String)request.getAttribute("password");
System.out.println(username);
System.out.println(password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向
response.sendRedirect("Other");
重定向是浏览器发送请求到servlet1之后,servlet1需要访问servlet2,但并未在服务器内直接访问,而是由服务器自动向浏览器发送一个响应,浏览器再自动提交一个新的请求,这个请求就是对servlet2 的请求。
对于servlet2的访问,是先由服务器响应客户端浏览器,再由客户端浏览器向服务器发送对servlet2的请求,所以重定向有时又称为服务器外跳转。
整个过程中,浏览器共提交了两次请求,服务器共发送了两次响应。只不过,第一次响
应与第二次请求,对于用户来说是透明的,是感知不到的。用户认为,自己只提交了一次请
求,且只收到了一次响应。
这样的话,就会有一个问题:servlet2中是无法获取到用户手动提交请求中的数据的,它只能获取到第二次请求中所携带的数据。
举例:你在专卖店选中一双篮球鞋,店员告诉你这双鞋现在没有了,附近的另一个专卖店中有这双鞋,他把那个专卖店的地址告诉你,你得到地址之后,自己到达另外一个专卖店买到了这双鞋。
package com.monkey1024.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 重定向
*/
public class Redirect01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding("UTF-8");
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username", username);
request.setAttribute("password", password);
//重定向到上面的Other servlet中
response.sendRedirect("Other");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
请求转发与重定向的选择
若需要跳转到其它应用,则使用重定向。
若是处理表单数据的Servlet1要跳转到另外的Servlet2上,则需要选择重定向。为了防止表单重复提交。
若对某一请求进行处理的 Servlet 的执行需要消耗大量的服务器资源(CPU、内存),此时这个 Servlet 执行完毕后,也需要重定向。
其它情况,一般使用请求转发
网友评论