您的位置:首页 > 其它

Servlet之请求转发和重定向

2017-09-27 08:54 274 查看

Servlet之请求转发和重定向

简介:在程序中我们经常需要从一个页面调到另一个页面,或者是在维护时为了不丢用户,会用到一种页面跳转的技术,而请求转发和重定向就是解决这种问题的方法。

一、请求转发 (RequestDispatcher)

请求转发是一种内部的转发,在同一个项目中的url在服务器内部跳转,可以用请求转发 使用方式:req.getRequestDispatcher("uri").forward(reqresp);//   getRequestDispatcher()只是请求的地址(默认从上下文路径开始)          .forward(request, response) 是将请求的参数带到转发的页面  1、多个Servlet共享一个request对象(重点)2、一次请求,当转发结束的时候也就是业务处理完毕的时候request对象会被销毁3、地址栏不改变(所以说浏览器只是请求了一次,而服务器会在内部转发) 4、request对象的作用域(重中之重)            作用域:共享request对象的Servlet            作用域中存取数据:                        req.setAttribute(key,value)                        req.getAttribute(key)                        req.removeAttribute(key) 
 


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDispatcher extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");
/* 当页面有请求到此servlet中时,如果需要请求其他url,则需要使用到请求转发将某个请求请求转发到其他url,但前提是同一个项目中的url */
//请求转发是直接将请求推送到转发的地址,请求的参数也会被保留,所以浏览器只发一次请求
request.getRequestDispatcher("SessionServlet").forward(request, response);
// getRequestDispatcher只是请求的地址默认从上下文路径开始 .forward(request, response)是请求的参数
return;
// 注意在执行转发完毕后会继续执行代码,但是没有意义,所以一般在转发后面加return
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}

}

 
 

二、重定向(SendRedirect)

重定向是给浏览器响应给浏览器一个300-399的状态码,和设置的新地址,然后浏览器会根据新地址,重新请求一次。  唯一的优点就是可以跨域(访问其他网站)使用:resp.sendRedirect("uri");            特点:                地址栏改变                两次请求,两个request对象
 
 



import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SendRedirect extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的编码格式
response.setContentType("text/html");
//设置输出流响应到浏览器
PrintWriter out = response.getWriter();
out.print("页面已搬家");
//设置重定向(因为这种操作是浏览器做的,所以需要给浏览器响应)
response.sendRedirect("https://www.baidu.com");
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}

}

总结:

1.调用方式:
A请求转发 是调用requesgetRequestDispatcher("url).forward(request, response);
B重定向是 调用response。sendRedirect(“url”);
2.请求次数:
A请求转发 浏览器只请求一次,地址栏不发生变化
B重定向 浏览器会请求两次,地址栏发生变化,
3.跳转方式:
A请求转发 服务器会在内部转发到请求位置 (由服务器跳转)
B重定向 服务器在第一次请求时响应给浏览器 重定向状态(状态码)和url,浏览器根据响应重新请求(由浏览器跳转)
 
4.地址不同:
A请求转发 只能在同一个项目的服务器中请求转发的地址
B重定向 不但可以在同一个项目服务器中请求,还可以跨域请求其他的资源地址(这也是重定向唯一的优点)
5.参数不同:
A请求转发 参数保留( 会调用forward(request, response);将参数传到转发的位置)
B重定向  参数丢失(只会给浏览器响应对应的状态和url)
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: