博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分析:重定向和请求转发
阅读量:6090 次
发布时间:2019-06-20

本文共 3666 字,大约阅读时间需要 12 分钟。

 

分析:重定向和请求转发

 

重定向

  HttpServletResponse对象的sendRedirect(java.lang.String location)方法称作重定向

  如果location地址前面加上“/”,则表示相对于Servlet容器的根来请求,比如;如果location地址前面没有加上“/”,则表示相对于当前请求的URI来寻找地址。

 

请求转发

  RequestDispatcher的:forward(ServletRequest request, ServletResponse response)方法叫做请求转发。

  

 

实验例子1:重定向和请求转发似乎都是造成页面跳转

  第一个页面first.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'first.jsp' starting page        
first.jsp

 

  第二个页面是Servlet:

  用请求转发:

 

package com.shengqishiwind.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Second extends HttpServlet{    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {        process(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {        process(request, response);    }    private void process(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException    {        // 请求转发        RequestDispatcher rd = request.getRequestDispatcher("third.jsp");        rd.forward(request, response);    }}

 

  用重定向,则把处理方法改为:

private void process(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException    {        // 重定向        response.sendRedirect("third.jsp");    }

 

  第三个页面是third.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'third.jsp' starting page        
This is my Third page.

 

  不管用请求转发还是重定向的方法,第一个页面点击提交后,都能顺利转到第三个页面:

  但是其实实际进行的操作还是很不同的,看下面的例子。

 

 

实验例子2:如果要在第三个页面中取得第一个页面输入的用户名

  请求转发的实现比较简单,第二个页面的Servlet代码不用添加任何东西,可以直接从第三个页面getParameter,即把third.jsp中的body改为:

 

    This is my Third page. 
用户名:<%=request.getParameter("username") %>

  则在第一个页面输入shengqishiwind,提交后,第三个页面显示:

  重定向应该怎么实现获取第一个页面提交的用户名呢?

  第三个页面采用如上的代码(通过getParameter获取参数),把第二个页面中改为重定向的跳转方式,重新来一次,可以看到显示:

  再尝试第二个页面这样(通过setAttribute存储值):

private void process(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException    {        String username = request.getParameter("username");        // 重定向        request.setAttribute("username", username);        response.sendRedirect("third.jsp");    }

  然后第三个页面这样获取:

用户名:<%=request.getAttribute("username") %>

  仍然是不行,得到的仍然是null值。

 

 

重定向和请求转发的区别

请求转发:

  RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。

  请求转发,整个过程处于同一个请求当中。 

  不管经历了多少组件,都可以从request中直接取得想要的值。

  使用请求转发时,到结果页面的网址是:

 

重定向: 

  sendRedirect()HttpServletResponse对象的方法,即响应对象的方法。

  既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

  sendRedirect调用后会向客户端返回一个响应,这个响应告诉客户端要转向的页面,紧接着客户端又会发送一个新的请求,转向这个目标页面

  也即是说,重定向的过程中实际上客户端会向服务器发送两个请求。

 

  使用重定向时,结果页面的网址是:

  说明客户端已经知道了结果页面的地址,是重新发送的全新的请求。

  重定向方式在Firebug中的图:

 

 

  总结记忆请求转发只有一个请求,所以勇往直前,调用的方法叫forward;而重定向需要客户端重新发送请求,调用的是sendRedirect,名字里有个Re,表示重复。

 

参考资料:

  圣思园张龙老师视频教程。

  Java Document API with examples:

  

 

转载地址:http://xdlwa.baihongyu.com/

你可能感兴趣的文章
React Native 极光推送填坑(ios)
查看>>
Terratest:一个用于自动化基础设施测试的开源Go库
查看>>
修改Windows远程终端默认端口,让服务器更安全
查看>>
扩展器必须,SAS 2.0未必(SAS挺进中端存储系统之三)
查看>>
Eclipse遇到Initializing Java Tooling解决办法
查看>>
while((ch = getchar()) != '\n')
查看>>
好程序员web前端分享JS检查浏览器类型和版本
查看>>
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
C#数据采集类
查看>>
quicksort
查看>>
【BZOJ2019】nim
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>