`

响应重定向与请求转发

阅读更多
摘要在javaEE Web组件开发中,页面之间的跳转无疑是必不可少且最常见的。除了使用HTML中的表单提交、超级链接进行跳转外,Servlet API中还提供了响应重定向和请求转发两种跳转技术。这两种技术在本质上是不同的,有很大的区别,尤其是跳转页面路径的写法,更是使很多开发人员头痛不已。本文主要围绕这两种跳转方式进行展开,为读者整理、总结这两种跳转方式的特点以及需要注意的问题。





本文由中软培训所著,由中软培训首发,中软培训具有本文的知识产权。本文可用于网上转载,但请在转载过程中附加本段说明。中软培训官方网站:www.csst.com.cn谢谢。









中软java培训技术文章



关键词

java技术、Java、RequestDispatcher、forward、ServletResponse、sendRedirect、请求转发、响应重定向



       目前,大多数的Web应用都基于MVC模式进行开发。其中M代表模型层,主要实现业务逻辑以及数据逻辑,V代表视图层,主要实现视图逻辑,C代表控制层,主要实现控制逻辑。而MVC每部分的实现技术却五花八门,可以是J2EE的核心组件,如JSP/Servlet、EJB,也可以是流行的框架技术,如Struts、Hibernate等。本文主要以J2EE核心组件为例,来讲解如何在V和C之间进行跳转,因为即使使用Struts这样的框架,其本质也是以J2EE核心组件技术为基础,概念是相同的。

       现在假设某Web应用上下文名字为LoginDemo,该应用是使用J2EE核心组件开发,即视图是采用JSP开发,控制器使用Servlet开发,实现了最简单的登录逻辑。基本逻辑如下:

登录首页为index.jsp,用户在本页面输入用户名(表单元素为username)以及密码(表单元素为password)。提交到控制器LoginServlet.java的doPost方法,此Servlet的url-pattern为:/login,servlet-name为:LoginServlet。此Servlet调用业务逻辑验证用户名及密码(本文不关注Model具体实现),如果验证成功,即跳转到视图/normal/loginSuccessful.jsp,如果失败,即跳转到视图/error/loginFail.jsp。

    本文主要关注的重点是:控制器/login向/normal/loginSuccessful.jsp和/error/loginFail.jsp跳转的方式是什么?有什么区别?跳转时候路径应该怎么写?这些问题都是Web组件开发员在开发中常遇到、也最容易混淆出错的问题。在Servlet API中,在两个接口中提供了组件跳转的方法,分别是HttpServletResponse中的sendRedirect方法和RequestDispatcher中的forward方法。接下来,本文将结合LoginDemo应用,对两个接口中的方法进行详细分析。



1、HttpServletResponse接口中的sendRedirect方法
       sendRedirect方法通常被称为“响应重定向”,如果用响应对象调用了该方法,本质上就是浏览器对服务器重新提交了请求。比如LoginDemo应用中,如果使用该方法跳转,那么写法是:

       response.sendRedirect(“normal/loginSuccessful.jsp”);

       response.sendRedirect(“error/loginFail.jsp”);

或者是:

       response.sendRedirect(“/LoginDemo/normal/loginSuccessful.jsp”);

       response.sendRedirect(“/LoginDemo/normal/loginFail.jsp”);

     

       这两种写法的主要区别在于跳转页面路径的写法,第一种写法的路径没有用“/”开始,而第二种写法的路径使用了”/”开始。我们需要理解是否使用”/”有什么不同?

n  如果不使用”/”开头,代表是请求路径。是相对于当前的请求路径而言。

n  如果使用”/”开头,代表相对于容器根路径,即”/”表示容器的根路径,因此”/”后面使用的是应用上下文的名字”LoginDemo”。

注意:由于响应重定向的方式本质上是浏览器对服务器重新提交了请求,所以例子中的loginSucessful.jsp或者loginFail.jsp视图的请求对象是一个全新的请求,也就是说,Serlvet 组件/login的请求对象中的任何内容,在视图的请求中将不再存在。如果在视图中写了如下语句:       request.getParameter(“username”)

       该语句的返回值应该是null,因为视图的request已经是一个全新的请求对象,以前在/login的请求中存在的请求参数username,在视图的请求中已经不再存在。







中软java培训技术文章



2、RequestDispatcher接口中的forward方法
除了上文提到的响应重定向,RequestDispatcher(通常称为“请求转发器”)接口中提供的forward方法是另一个最常使用的跳转方法,此方法通常被称为“请求转发”。请求转发的本质是容器直接将当前请求提交给另一个资源,客户端一无所知,并不重新提交请求。与响应重定向不同的是,要调用forward方法,首先必须获得RequestDispatcher接口的对象。而响应对象由于容器会自动生成并传递给doXXX方法,可以直接使用。而获得RequestDispatcher类型的对象,可以通过两个接口获得,即ServletRequest中的getRequestDispatcher方法以及ServletContext中的getRequestDispatcher、getNamedDispatcher方法。接下来分别讨论两种接口中获得请求转发器的方法。



2.1通过ServletRequest获得RequestDispatcher对象
结合LoginDemo应用实例,如果使用该方法跳转(仅以成功页面为例),方式如下:

RequestDispatcher dis1=request.getRequestDispatcher(“normal/loginSuccessful.jsp”);

dis1.forward(request,response);

或者:

RequestDispatcher dis1=request.getRequestDispatcher(“/normal/loginSuccessful.jsp”);

dis1.forward(request,response);

          这两种写法的主要区别在于转发路径的写法,第一种写法的路径没有用“/”开始,而第二种写法的路径使用了”/”开始。我们需要理解是否使用”/”有什么不同?

n  如果不使用”/”开头,代表是请求路径。是相对于当前的请求路径而言。

n  如果使用”/”开头,代表相对于当前上下文路径,即”/”表示应用上下文”/LoginDemo”的根。



注意:使用此方法获得的请求转发器,是不可能跳转到其他应用上下文下的。

如果在视图中写了如下语句:

request.getParameter(“username”)

       该语句的返回值应该是客户输入的用户名,因为视图的request中包含了/login的请求对象中所有的内容,这一点也是请求转发与响应重定向最大的区别。


     

2.2、通过ServletContext获得RequestDispatcher对象
ServletContext中有两个方法可以获得RequestDispatcher对象,即getRequestDispatcher以及getNamedDispatcher。(ctxt为某一个ServletContext对象)。结合LoginDemo应用实例,如果使用getNamedDispatcher方法跳转(仅以成功页面为例),方式如下:

RequestDispatcher dis1=ctxt. getNamedDispatcher (“LoginServlet”);

dis1.forward(request,response);



结合LoginDemo应用实例,如果使用getRequestDispatcher方法跳转(仅以成功页面为例),方式如下:

RequestDispatcher dis1=ctxt.getRequestDispatcher(“/normal/loginSuccessful.jsp”);

dis1.forward(request,response);



与其他方法相比,这个方法中的路径只能以”/”开始,否则将出现错误!

“/”表示ctxt对象的根。而ctxt对象不一定就是当前的上下文对象(具体请参见ServletContext中的getContext)方法。因此,比起ServletRequest中的getRequestDispatcher方法,此接口中的方法最大的区别在于能跳转到其他上下文下的资源。



注意:如果在视图中写了如下语句:

       request.getParameter(“username”)

       该语句的返回值应该是客户输入的用户名,因为视图的request中包含了/login的请求对象中所有的内容,这一点也是请求转发与响应重定向最大的区别。






       中软java培训技术文章



3、小结
综上所述,响应重定向与请求转发除了路径写法的区别外,最大的区别在于响应重定向是客户端重新给服务器端发送了请求,那么重定向资源的请求中将不再包含原请求的内容。而请求转发是服务器端进行的转发,不仅进行了跳转,同时将请求对象同时进行了转发。建议开发人员选择跳转方式时,首先考虑是否需要将当前请求对象转发,如果需要,选择使用请求转发,否则即可使用响应重定向,其次考虑使用哪种路径书写方式。在实际开发中,使用ServletRequest接口获得请求转发器,从而进行请求转发的方式居多,Struts框架的跳转方式默认也是此种方式。

分享到:
评论

相关推荐

    转发与重定向的区别

    描述转发与重定向的区别,讲的比较详细,希望大家喜欢.

    请求转发和重定向(request和response).emmx

    使用mindmaster打开

    对Django 转发和重定向的实例详解

    转发:一次请求和响应,请求的地址没有发生变化,如果此时刷新页面,就会出现重做现象。 重定向:一次以上的请求和响应,请求地址发生一次以上的变化,如果此时刷新页面,就不会发生重做现象。 我来举个简单的列子,...

    C-ATM.zip jsp+servlet 项目【练手/总结/巩固】

    3. 转发是服务器内部进行的操作,服务器直接将请求转发给另一个资源进行处理,并将其生成的响应返回给浏览器,浏览器不知道此过程,因此URL路径不会改变。 4. 使用重定向时,可以使用`response.sendRedirect()`方法...

    wiredog:径向式网关:对本地浏览器所有的Http(s)请求和响应进行拦截并重制;也可以插入轻量级BS版抓包软件;

    短期式网关简单说就是你可以对自己的浏览器的所有请求和响应进行拦截,并通过Java代码方式进行重制。基于编程式网关,你可以:根据请求重制请求例如将“ wiredog.com”重定向到“ localhost:8080”,等效于配置...

    深入体验Java Web开发内幕

    5.1 准备实验环境  5.2 HttpServletResponse简介  5.3 产生响应状态行  5.4 构建响应消息头  5.5 响应消息头的实用案例  5.6 创建响应正文  5.7 请求重定向与请求转发  5.8 思考与实践...

    3-IMS培训教程---SIP协议.pdf

    响应消息 1xx: 临时响应 –表示已经接收到请求消息,正在对其进行处理 2xx: 成功 –表示请求已经被成功接受、处理 3xx: 重定向 --表示需要采取进一步动作,以完成该请求 4xx: 客户端错误 –表示请求消息中包

    java-web小Demo

    其中包括:请求编码,响应编码,转发,包含,重定向;

    Charles替换文件.jar

    正常情况下,Chrome DevTool已经满足了日常web开发的需求,但是有的特性:编辑request的参数、重定向request请求的资源、编辑response的数据,ChromeDevTool就很蛋疼了,而且查看和调试移动端资源时候Chrome也并不...

    j2ee:这是 j2ee 示例活动的主要存储库

    HEAD 练习列表理解 HTTP 请求和响应运行第一个 servlet 并修改响应对象通过请求对象从 URL 获取参数使用 GET 方法通过表单获取请求参数使用 POST 方法通过表单获取请求参数获取各种 HTML 元素的请求参数将请求转发到...

    halosgho.st:回购支持我的主页

    网页这是我的主页,在lwan中完全重写,因此完全在C中... 然后,一个很小的lwan实例正在端口8080上运行,该实例除了响应ACME质询请求外不执行任何操作,并将所有其他流量重定向到https://halosgho.st 。设计特点有效样式

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    尽管这样的default.aspx页面实际上永远不会被真正执行,但是有他们的帮助,就能让IIS顺利地将页面请求转发至ASP.NET解析器,从而,使得基于HTTPModule的URL重写规则,被执行。 好了,创建这两个目录及default.aspx...

    Blackhole:适用于桌面和移动设备的精英 Web 代理调试器

    上下文菜单添加到配置窗口 DONE 上下文菜单添加到日志窗口 DONE 记录文件并更改日志窗口以请求响应列表 DONE Python3 支持 DONE 配置重新加载 DONE 重定向 ip 支持端口 DONE dir 匹配默认为 index.html 如果不存在...

    router:GOV.UK 前面的路由器代理到单个域上的后端服务器

    反向代理,将请求转发到单个域上的多个后端服务器并提供响应。 重定向器,提供 HTTP 301和302重定向到新 URL。 消失的响应者,为曾经但不再存在的资源提供 HTTP 410响应。 姊妹项目提供了底层数据库的读写接口和...

    Servlet与JSP核心编程第2版

    13.3 使用jsp:forward转发请求 13.4 包含使用java插件的applet 第14章 javabean组件在jsp文档中的应用 14.1 使用bean的原因 14.2 bean是什么 14.3 bean的应用:基本任务 14.4 示例:stringbean 14.5 ...

    sip RFC3261 中文版

    13.3.1.2 INVITE请求转发 93 13.3.1.3 INVITE请求的拒绝 93 13.3.1.4 接受INVITE请求 93 14 更改已经存在的会话 94 14.1 UAC行为 95 14.2 UAS行为 96 15 结束一个会话 98 15.1 使用BYE请求终止一个会话 99 15.1.1 ...

    在IIS上部署ASP.NET Core项目的图文方法

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求...

    dnsdiag:DNS测量,故障排除和安全审核工具集

    在这里,我们有一可以对您的DNS请求和响应执行基本审核,以确保您的DNS能够按预期工作。 您可以使用dnsping测量任意给定DNS服务器对任意请求的响应时间。 就像传统的ping实用程序一样,它为DNS请求提供了类似的...

    JavaWeb之Servlet精讲实战课程

    本课程是javaee和大数据开发的基础课程,讲述了Servlet中Servlet创建过程,Request请求以及Response中各种响应头的介绍,以及乱码的各种处理方式,以及刷新重定向转发等。对servlet中的session和cookie做了着重讲解,...

    Squid中文权威指南

    13.1.2 转发cache.log消息到系统日志 13.1.3 dump cache.log消息到终端 13.2 access.log 13.2.1 access.log结果编码 13.2.2 HTTP响应状态码 13.2.3 access.log对端编码 13.2.4 影响access.log的配置...

Global site tag (gtag.js) - Google Analytics