Servlet之请求转发和重定向

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重定向是 调用responsesendRedirect(url);

2.请求次数:

A请求转发 浏览器只请求一次,地址栏不发生变化

B重定向 浏览器会请求两次,地址栏发生变化,

3.跳转方式:

A请求转发 服务器会在内部转发到请求位置 (由服务器跳转)

B重定向 服务器在第一次请求时响应给浏览器 重定向状态(状态码)和url,浏览器根据响应重新请求(由浏览器跳转)

 

4.地址不同:

A请求转发 只能在同一个项目的服务器中请求转发的地址

B重定向 不但可以在同一个项目服务器中请求,还可以跨域请求其他的资源地址(这也是重定向唯一的优点)

5.参数不同:

A请求转发 参数保留( 会调用forward(request, response);将参数传到转发的位置)

B重定向  参数丢失(只会给浏览器响应对应的状态和url

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值