转发与重定向的区别
1.转发
转发可以说是服务器端的行为。可以认为客户端浏览器发送请求给A,A接受请求,于是它在内部容器内做了一系列的处理(转发),A处理完之后得到结果给了B。也可以这样理解,A向B借钱,B并没有钱,但是B并没有告诉A他没有钱,而是接受A借钱的这个请求,B为了完成这个请求,B向C去借了钱给了A,但是A并不知是B向C借了钱,A只知道是B帮助了他。所以说这可以理解为是在服务器端的行为。
1.1图解
1.2实现转发的方法
request.getRequestDispatcher("welcomeServletDemo").forward(request, response);
1.3实现转发的代码
@WebServlet("/registerServlet")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String pwd = request.getParameter("password");
String createPassword = PasswordUtil.createPassword(pwd);
String sql="insert into user values(?,?,?)";
Connection connection = DruidUtilDemo.getConnection();
try {
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, name);
prepareStatement.setString(2, createPassword);
prepareStatement.setInt(3, 0);
int executeUpdate = prepareStatement.executeUpdate();
if(executeUpdate>0){
System.out.println("注册成功");
request.getRequestDispatcher("welcomeServletDemo").forward(request, response);//实现转发
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@WebServlet("/welcomeServletDemo")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");//编码格式
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println("注册成功.....");
writer.println("请登录...");
2.重定向
重定向可以认为是客户端的行为。客户浏览器发送请求给A服务器,A接受后,发送302状态码响应,并给它一个B的地址,浏览器发现是302状态码,就又重新发送一个新的请求(A给它的B的地址),他发送请求给了B,B给它做出了回应。这种方式叫做重定向。也可以这么理解,浏览器(A)向B借钱,B没有钱,B告诉A ,C有钱给了A B的地址,A又去向C借钱,C借给了他,这种方式A发送了两次请求,得到了两次回应,它知道是C借给他的钱,这种方式浏览器路径得到了变化,所以说是客户端的行为。
2.1图解
2.2实现重定向的方法
response.sendRedirect("login.jsp");
response.sendRedirect("http://www.baidu.com");
2.3实现代码
@WebServlet("/registerServlet")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String pwd = request.getParameter("password");
String createPassword = PasswordUtil.createPassword(pwd);
String sql="insert into user values(?,?,?)";
Connection connection = DruidUtilDemo.getConnection();
try {
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, name);
prepareStatement.setString(2, createPassword);
prepareStatement.setInt(3, 0);
int executeUpdate = prepareStatement.executeUpdate();
if(executeUpdate>0){
System.out.println("注册成功");
response.sendRedirect("login.jsp");//重定向
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@WebServlet("/LoginServletDemo")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String pwd = request.getParameter("password");
String createPassword = PasswordUtil.createPassword(pwd);
String sql="select * from user where username=? and password=?";
Connection connection = DruidUtilDemo.getConnection();
try {
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, name);
prepareStatement.setString(2, createPassword);
ResultSet resultSet = prepareStatement.executeQuery();
if(resultSet.next()){
System.out.println(name+"......"+createPassword);
System.out.println("登陆成功");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
区别
1、转发是在服务端内部的转发,浏览器不知道,浏览器的路径不会改变。重定向是客户端的行为,两次请求,两次回应,会改变路径。
2、sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward()方法只能将请求转发给同一Web应用的组件。
3.执行转发的时候是先执行转发,在执行后面语句;重定向是先执行结束在进行重定向。
4.转发的时间要比重定向的时间短,给服务器造成的压力也少。