网站代发外链,WordPress文章生成不是HTML,网站域名要多少钱,上海百度竞价点击软件servlet的两种重定向方法的区别及应用一 问题#xff1a; 在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向#xff0c;一种是通过forward方法#xff08;例如JSP中 的jsp:forward page”OtherPage.jsp”/#xff09;#xff0c;另一种则是通过运… servlet的两种重定向方法的区别及应用 一 问题 在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向一种是通过forward方法例如JSP中 的jsp:forward page”OtherPage.jsp”/另一种则是通过运用 javax.servlet.http.HttpServletResponse接口的sendRedirect方法例如 response.sendRedirect(“OtherPage.jsp”);这两种方法有什么区别和联系呢让我们看下面的分析。二 分析1JSP:FORWORD该 方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区buffer的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果 在JSP:FORWORD之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.补充知识输出缓冲区缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下才会把该缓冲区的内容输出到客户端上1该JSP网页已完成信息的输出2输出缓冲区已满3JSP中调用了out.flush()或response.flushbuffer()输出缓冲区的大小可以用:%page buffernone|nkb%或response.setBufferSize()设置,如下1设置输出缓冲区的大小为1KB。%page buffer1kb%或response.setBufferSize(1);2设置输出缓冲区的大小为0即不缓冲。%page buffernone %或response.setBufferSize(0);用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节.用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。2response.sendRedirect(“OtherPage.jsp”)该 方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的让浏览器对在location中指定的URL提出请求使浏览器显示重定向网页 的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL那么Web container在将它发送到客户端前会把它 转换成一个绝对的URL。如果地址是相对的没有一个’/’那么Web container就认为它是相对于当前的请求URI的。因为这个方法是通过修改HTTP协议的HEADER实现的重定义功能而下面的方法也能改变HTTP HEADER属性他们的原理是一样的.%response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);String newLocn/index.html;response.setHeader(Location,newLocn);%补充知识HTTP应答头 Web服务器响应浏览器或其他客户程序的请求时其应答一般由以下几个部分组成一个状态行几个应答头一个空行内容文档。下面是一个最简单的应答HTTP/1.1 200 OKContent-Type: text/plainHello World 1设置状态信息状 态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下除了Content-Type之外的所有应答头都是可选的。 Servlet可以利用状态代码来实现许多功能。例如可以把用户重定向到另一个网站就像我们上边所看到的那个例子。下面我们就通过这个机会具体讨论各 种状态代码的含义以及利用这些代码可以做些什么。如前所述HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关而HTTP版本又由服务器确定因此需要Servlet设置的只有一个状态代码。先给出常见的HTTP 1.1状态代码以及它们对应的状态信息和含义具体的使用方法我们接下来再做详细的介绍。100 Continue 初始的请求已经接受客户应当继续发送请求的其余部分。HTTP 1.1新101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议HTTP 1.1新200 OK 一切正常对GET和POST请求的应答文档跟在后面。如果不用setStatus 设置状态代码Servlet默认使用202状态代码。201 Created 服务器已经创建了文档Location头给出了它的URL。202 Accepted 已经接受请求但处理尚未完成。203 Non-Authoritative Information 文档已经正常地返回但一些应答头可能不正确因为使用的是文档的拷贝HTTP 1.1新。204 No Content 没有新文档浏览器应该继续显示原来的文档。如果用户定期地刷新页面而Servlet可以确定用户文档足够新这个状态代码是很有用的。205 Reset Content 没有新的内容但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容HTTP 1.1新。206 Partial Content 客户发送了一个带有Range头的GET请求服务器完成了它HTTP 1.1新。300 Multiple Choices 客户请求的文档可以在多个位置找到这些位置已经在返回的文档内列出。如果服务器要提出优先选择则应该在Location应答头指明。301 Moved Permanently 客户请求的文档在其他地方新的URL在Location头中给出浏览器应该自动地访问新的URL。302 Found 类似于301但新的URL应该被视为临时性的替代而不是永久性的。注意在HTTP1.0中对应的状态信息是“Moved Temporatily”而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY而不是 SC_FOUND。出现该状态代码时浏览器能够自动访问新的URL因此它是一个很有用的状态代码。为此Servlet提供了一个专用的方 法即sendRedirect。使用response.sendRedirect(url)比使用 response.setStatus(response.SC_MOVED_TEMPORARILY)和 response.setHeader(Location,url)更好。这是因为 首先代码更加简洁。第二使用sendRedirectServlet会自动构造一个包含新链接的页面用于那些不能自动重定向的老式浏览器。最后sendRedirect能够处理相对URL自动把它们转换成绝对URL。注意这个状态代码有时候可以和301替换使用。例如如果浏览器错误地请求http://host/~user缺少了后面的斜杠有的服务器返回301有的则返回302。 严格地说我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。 303 See Other 类似于301/302不同之处在于如果原来的请求是POSTLocation头指定的重定向目标文档应该通过GET提取HTTP 1.1新。304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档。服务器告诉客户原来缓冲的文档还可以继续使用。305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取HTTP 1.1新。307 Temporary Redirect 和302Found相同。许多浏览器会错误地响应302应答进行重定向即使原来的请求是POST即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因HTTP 1.1新增了307以便更加清除地区分几个状态代码当出现303应答时浏览器可以跟随重定向的GET和POST请求如果是307应答则浏览器只 能跟随对GET请求的重定向。注意HttpServletResponse中没有为该状态代码提供相应的常量。HTTP 1.1新 400 Bad Request 请求出现语法错误。401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头浏览器据此显示用户名字/密码对话框然后在填写合适的Authorization头后再次发出请求。403 Forbidden 资源不可用。服务器理解客户的请求但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。404 Not Found 无法找到指定位置的资源。这也是一个常用的应答HttpServletResponse专门提供了相应的方法sendError(message)。405 Method Not Allowed 请求方法GET、POST、HEAD、DELETE、PUT、TRACE等对指定的资源不适用。HTTP 1.1新406 Not Acceptable 指定的资源已经找到但它的MIME类型和客户在Accpet头中所指定的不兼容HTTP 1.1新。407 Proxy Authentication Required 类似于401表示客户必须先经过代理服务器的授权。HTTP 1.1新408 Request Timeout 在服务器许可的等待时间内客户一直没有发出任何请求。客户可以在以后重复同一请求。HTTP 1.1新409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突因此请求不能成功。HTTP 1.1新410 Gone 所请求的文档已经不再可用而且服务器不知道应该重定向到哪一个地址。它和404的不同在于返回407表示文档永久地离开了指定的位置而404表示由于未知的原因文档不可用。HTTP 1.1新411 Length Required 服务器不能处理请求除非客户发送一个Content-Length头。HTTP 1.1新412 Precondition Failed 请求头中指定的一些前提条件失败HTTP 1.1新。413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求则应该提供一个Retry-After头HTTP 1.1新。414 Request URI Too Long URI太长HTTP 1.1新。416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。HTTP 1.1新500 Internal Server Error 服务器遇到了意料不到的情况不能完成客户的请求。501 Not Implemented 服务器不支持实现请求所需要的功能。例如客户发出了一个服务器不支持的PUT请求。502 Bad Gateway 服务器作为网关或者代理时为了完成请求访问下一个服务器但该服务器返回了非法的应答。503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。504 Gateway Timeout 由作为代理或网关的服务器使用表示不能及时地从远程服务器获得应答。HTTP 1.1新505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。HTTP 1.1新如前所述HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关而HTTP版本又由服务器确定因此需要Servlet设置的只有一个状态代码。拿我们上边的例子来看。其中有一句就是设置HTTP应答头的状态代码的是response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);Servlet 设置状态代码一般使用HttpServletResponse的setStatus方法。setStatus方法的参数是一个整数即状态代码不过为 了使得代码具有更好的可读性可以用HttpServletResponse中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1中的标准状态信息命名所有的名字都加上了SC前缀Status Code的缩写并大写同时把空格转换成了下划线。也就是说与状态代码301对应的状态信息是“Moved Permanently”则HttpServletResponse中的对应常量名字为SC_MOVED_PERMANENTLY。但有两个例外和状 态代码302对应的常量根据HTTP 1.0命名为SC_MOVED_TEMPORARILY而不是SC_FOUND而307没有对应的常量。 虽然设置状态代码一般使用的是response.setStauts(int)方法但为了简单起见HttpServletResponse为两种常见 的情形提供了专用方法sendError方法生成一个404应答同时生成一个简短的HTML错误信息文档sendRedirect方法生成一个 302应答同时在Location头中指示新文档的URL。这种方法就是我们前边提到的 response.sendRedirect(“OtherPage.jsp”)实现重定向的方法的原理。它与301应答既 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY)的区别请看上边状态列表的 红色标记部分这里不再重复。 2设置HTTP应答头设置HTTP应答头往往和设置状态行 中的状态代码结合起来。例如有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头而401Unauthorized状态代 码则必须伴随一个WWW-Authenticate头。这些都在相应的状态代码的状态信息说明中都提到了。 然而即使在没有设置特殊含义的状态代码时指定应答头也是很有用的。应答头可以用来完成设置Cookie指定修改日期指示浏览器按照指定的间隔刷 新页面声明文档的长度以便利用持久HTTP连接……等等许多其他任务。还拿我们上边的例子来看其中有一句就是设置HTTP应答头的是 response.setHeader(Location,newLocn);设置应答头最常用的方法是HttpServletResponse的setHeader该方法有两个参数分别表示应答头的名字和值。和设置状态代码相似设置应答头应该在发送任何文档内容之前进行。应答头 说明Allow 服务器支持哪些请求方法如GET、POST等。Content-Encoding 文档的编码Encode方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档 的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此Servlet应该通过查看Accept-Encoding头即request.getHeader(Accept- Encoding)检查浏览器是否支持gzip为支持gzip的浏览器返回经gzip压缩的HTML页面为其他浏览器返回普通页面。Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势可以把输出文档写入 ByteArrayOutputStram完成后查看其大小然后把该值放入Content-Length头最后通过 byteArrayStream.writeTo(response.getOutputStream()发送内容。Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain但通常需要显式地指定为text/html。由于经常要设置 Content-Type因此HttpServletResponse提供了一个专用的方法setContentTyep。Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。Expires 应该在什么时候认为文档已经过期从而不再缓存它Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期该请求将被视为一个条件GET只有改动时间迟于指定时间的文 档才会返回否则返回一个304Not Modified状态。Last-Modified也可用setDateHeader方法来设置。Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的而是通过HttpServletResponse的sendRedirect方法该方法同时设置状态代码为302。Refresh 表示浏览器应该在多少时间之后刷新文档以秒计。除了刷新当前文档之外你还可以通过setHeader(Refresh, 5; URLhttp://host/path)让浏览器读取指定的页面。注 意这种功能通常是通过设置HTML页面HEAD区的META HTTP-EQUIVRefresh CONTENT5;URLhttp://host/path实现这是因为自动刷新或重定向对于那些不能使用CGI或Servlet的 HTML编写者十分重要。但是对于Servlet来说直接设置Refresh头更加方便。 注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”而不是“每隔N秒刷新本页面或访 问指定页面”。因此连续刷新要求每次都发送一个Refresh头而发送204状态代码则可以阻止浏览器继续刷新不管是使用Refresh头还是 META HTTP-EQUIVRefresh ...。 注意Refresh头不属于HTTP 1.1正式规范的一部分而是一个扩展但Netscape和IE都支持它。 Server 服务器名字。Servlet一般不设置这个值而是由Web服务器自己设置。Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader(Set-Cookie, ...)而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息在包含401Unauthorized状态行的应答中这个头是必需的。例 如response.setHeader(WWW-Authenticate, BASIC realmexecutives)。注意Servlet一般不进行这方面的处理而是让Web服务器的专门机制来控制受密码保护页面的访问例如.htaccess。 到此我们应该可以理解用下面代码实现重定向的原理修改HTTP协议的HEADER部分,对浏览器下达重定向指令的让浏览器对在location中指定的URL提出请求使浏览器显示重定向网页的内容。%response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 设置HTTP应答头状态代码String newLocn/index.html;response.setHeader(Location,newLocn); 设置HTTP应答头%三 总结通过上边的分析我们清楚了这两种服务器端重 定向方法的原理jsp:forward是利用服务器端先将数据输出到缓冲区的机制在把缓冲区的内容发送到客户端之前通过停止调用页 的处理将执行转向响应的页面从而实现的重定位功能原调用页的输出缓冲区中任何尚未在浏览器中显示刷新的内容将被清楚不再显示。 而response.sendRedirect(“OtherPage.jsp”)是通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的让浏览器对在location中指定的URL提出请求使浏览器显示重定向网页的内容的。四 对比1 forward方法是在Web container内部工作的。SendRedirect方法需要到客户端的一个往返。所以forward方法要比sendreRirect要快2 forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以重定向到任何URL3 forward方法还将原始的HTTP请求对象request转到目录页。而sendRedirect方法的功能是触发浏览器转向指定的URL并不会将原始请求对象转发。在例C:\Tomcat 5.0\webapps\test\regiester10中我们可以看到在WELCOME。JSP中有trtd姓名:%request.getParameter(userName)%/td/tr当在LOGIN.JSP中用response.sendRedirect(welcome.jsp);重定向到WELCOME.JSP时输出为 姓名:null当在LOGIN.JSP中用jsp:forward page welcome.jsp/重定向到WELCOME.JSP时输出为 姓名:wangjian4sendRedirect能够处理相对URL自动把它们转换成绝对URL。 转载于:https://blog.51cto.com/harles/1559560