使用RequestDispatche r的 forward()方法转发请求和使用HttpServletResponse的 sendRedirect()方法重定向都可以使页面转到另外一个页面,现在收集一下两者的不同:

一.RequestDispatcher.forward()方法

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

服务方(如:servlet)将请求转发到同一个WEB应用程序中另一个Servlet(或:JSP)--第三方 进行处理(该过程浏览器方-客户方并不知道),让这个第三方直接将结果返回给浏览器方。

通常在servlet中使用的代码是:

request.getRequestDispatcher(跳转页面的Url).foward(request,response);

如何得到RequestDispatcher

有三种方法可以得到Request Dispatcher对象。

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。

2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。

3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。

这三种方法的使用有细微的差别。比如一个应用的配置文件web.xml,其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代码:

RequestDispatcher rd = request.getRequestDispatcher("secondservlet");

rd.forward(request, response);

此时控制权将转向到第二个Servlet了。

使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:

RequestDispatcher rd = getServletContext().getRequest

Dispatcher("/servlet/secondservlet");

rd.forward(request, response);

使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:

RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet");

rd.forward(request, response);

这样也可以重定向到SecondServlet了。

二.sendRedirect()方法

response.sendRedirect(跳转页面URL)

就是服务端根据逻辑,发送一个状态码(Location ,状态码320),告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

服务方(如:servlet)直接将目标URL发回浏览器,让浏览器自己自动重新向目标URL发出HTTP请求。

重定向是作为不同请求来看待的。

三.如何选择

RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

PS:

1.在过滤器中用sendRedirect跳到指定的页面,一般都能正常显示,如下所示。

String contextPath = httpServletRequest.getContextPath();

httpServletResponse.sendRedirect(contextPath + "/alert.html");

但在过滤器中用forward跳到指定的页面,由于指定的页面的contextPath和当前请求的contextPath不同,导致跳到指定的页面不能加载页面需要的其它资源文件,如.css、.js、.img等资源。

request.getRequestDispatcher("/error.jsp").forward(httpServletRequest, httpServletResponse);

forward去的页面,需设置base,如下所示:

request.setCharacterEncoding("utf-8");

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

...

2.forward传递参数的方法

request.getRequestDispatcher("/test/forward.do?name="+name).forward(httpServletRequest, httpServletResponse);

ForwardController中获取参数

@RestController

@RequestMapping("test")

public class ForwardController extends AbstractBaseController {

@RequestMapping(value = "/forward.do", method = RequestMethod.POST)

public LimitRspInfo alert(HttpServletRequest request, HttpServletResponse response) {

String name = request.getParameter("name");

...

}

}

java forward方法_JAVA的服务重定向:使用forward()方法转发请求和使用sendRedirect()方法重定向的区别...相关推荐

  1. java web 教程_Java Web服务教程

    java web 教程 Welcome to the Java Web Services Tutorial. Here we will learn about web services, useful ...

  2. Java两同_java:一个类实现的两个接口里都有同一个方法(名),怎么处理?

    不一定,关键要看子类是否是抽象类. 如果子类是非抽象类,则必须实现接口中的所有方法: 如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在! 1.抽象类定义 抽象类往往用来 ...

  3. java 线程崩溃_java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理...

    1.application应用程序注入自定义钩子程序 java语言本身提供一个很好的Runtime类,可以使我们很好的获取运行时信息.其中有一个方法是 public void addShutdownH ...

  4. java rmi 超时_java RMI服务超时

    Netty的worker线程只负责nio,在收到完整数据后将数据按要求封装并放入到业务数据队列:业务处理类负责从该队列中取出数据并处理. 这里的业务处理类现在是如何实现的?按你的说法,单线程和多线程 ...

  5. java filesystem 追加_java 如何往已经存在的excel表格里面追加数据的方法

    第一步.导入jar包,两个 第二步.编写程序 package cn.com.com; import java.io.FileInputStream; import java.io.FileOutput ...

  6. java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...

  7. java 接口 私有_Java 9:好的,坏的和私有的接口方法

    java 接口 私有 Java 9 是在几周前发布的. 查看发行说明 ,其中包含许多有趣的功能. 不过,我觉得并非一切都是不如Oracle和Java行家似乎图片吧 . 我看到了Java世界中的三个趋势 ...

  8. java getbean方法_java相关:spring中通过ApplicationContext getBean获取注入对象的方法实例...

    java相关:spring中通过ApplicationContext getBean获取注入对象的方法实例 发布于 2020-12-19| 复制链接 分享一篇关于关于spring中通过Applicat ...

  9. java句子倒序_Java实现英文句子中的单词顺序逆序输出的方法

    摘要:这篇Java开发技术栏目下的"Java实现英文句子中的单词顺序逆序输出的方法",介绍的技术点是"逆序输出.单词顺序.英文句子.Java.实现.方法",希望 ...

  10. 一个Java 程序的主方法_java application程序中,每一个类中,必有一个主方法main()方法。...

    [多选题]518.电视作品情节结构有() [多选题]下列少数民族中,( )的住房形式多为干栏式建筑. [单选题]21.教师埋头备课,突然站起来,下一镜头就可接教师站着在讲台上讲课,这是( ). [判断 ...

最新文章

  1. Java实现简单的RPC框架
  2. 机器学习(6)--化无限为有限(二)
  3. 细节无处不在!东莞网络推广分享哪些操作会影响网站优化效果?
  4. Coursera课程Python for everyone:chapter3
  5. Flume实操(三)【实时读取目录文件到HDFS案例】
  6. typescript_清洁架构的TypeScript刺
  7. 【SpringCloud】Spring cloud Alibaba Sentinel 规则持久化
  8. Zcash已发布ZIP 313提案
  9. Delphi多媒体设计之播放WAVE文件(API)
  10. OpenCV-图像对比度
  11. 将vim打造成python开发工具
  12. gogs 创建新的仓库
  13. Verilog初级教程(18)Verilog中的函数与任务
  14. 明翰恶意软件分析笔记V0.1(持续更新)
  15. windows11系统 “任务管理器已被管理员禁用”怎么解决
  16. 负数二进制转换十进制
  17. 超简单!只需四步将照片处理成手工素描
  18. chrome浏览器一键切换搜索引擎,一键切换谷歌和百度搜索(不需要重新输入keyword,带关键词切换引擎)
  19. c语言多线程编程随机数,在c 中使用线程安全的随机数,多线程_c_开发99编程知识库...
  20. 【java】新建项目

热门文章

  1. 南京信息工程大学计算机考研资料汇总
  2. gyb的常用lazyCopy
  3. [转载]Swift GYB
  4. 如何在Systemd中使用Shell脚本创建和运行新的服务
  5. 入选全球灯塔工厂 西部数据践行可持续发展承诺
  6. python利用WMI等监控获取windows状态如CPU、内存、硬盘等信息
  7. uniapp基本语法/组件使用
  8. 心理学经典理论与著作
  9. VirtualBox+CentOS6.5安装增强功能包 - Building the main Guest Additions module [失败]
  10. Pycharm下载与安装教程