servlet的两种重定向方法的区别及应用
servlet跳转页面的几种方法

servlet跳转页面的几种方法一直对Servlet的几种页面跳转方式,理解的糊里糊涂的,今天在网上搜了一把,找到一遍比较好的,记下来,以后看看。
跳转分两部分,一是发生在servlet,一是在JSP,其实JSP也就是servlet,不过还是有点差异滴。
Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。
1) redirect 方式response.sendRedirect("/a.jsp");页面的路径是相对路径。
sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("");跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
2) forward方式RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp"); dispatcher .forward(request, response);页面的路径是相对路径。
forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttributeJSP:1) response.sendRedirect();和servlet的response.sendRedirect()方式一样。
此语句前不允许有out.flush(),如果有,会有异常:ng.IllegalStateException: Can't sendRedirect() after data has committed to the client.atcom.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpRes ponse.java:558)...跳转后浏览器地址栏变化如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;2) response.setHeader("Location","");此语句前不允许有out.flush(),如果有,页面不会跳转。
servlet请求方法

servlet请求方法Servlet是用Java编写的服务器端程序,它可以处理来自客户端(浏览器)的请求并生成相应的响应。
在Servlet中,我们可以使用不同的请求方法来处理不同类型的请求。
下面是一些相关参考内容,介绍了常用的Servlet请求方法。
1. doGet方法:doGet方法用于处理客户端的GET请求。
在这种情况下,查询字符串会被附加到URL后面,并且可以通过getParameter方法来访问这些参数的值。
这个方法通常用于获取信息,而不是对服务器上的数据进行修改。
例如,一个简单的例子可以是根据用户的请求来返回一个HTML页面。
2. doPost方法:doPost方法用于处理客户端的POST请求。
与GET请求不同,POST请求将数据作为请求体的一部分发送给服务器。
在Servlet中,可以使用getParameter方法来访问这些参数的值。
这个方法通常用于在服务器上创建或更改数据。
例如,当用户提交一个表单时,表单数据会通过POST请求发送给服务器。
3. doPut方法:doPut方法用于处理客户端的PUT请求。
PUT请求用于向服务器添加新的资源或更新现有资源。
在Servlet中,可以使用getInputStream方法来读取请求的正文,并使用请求参数来访问表单字段的值。
这个方法通常用于在服务器上更新数据。
4. doDelete方法:doDelete方法用于处理客户端的DELETE请求。
DELETE请求用于删除服务器上的资源。
在Servlet中,可以使用getParameter方法来访问请求参数的值。
例如,当用户点击"删除"按钮时,可以通过发送DELETE请求来删除特定的数据。
5. doOptions方法:doOptions方法用于处理客户端的OPTION请求。
OPTION请求用于获取服务器支持的请求方法、请求头字段和响应头字段。
在Servlet中,可以使用setHeader方法来设置响应头字段,并使用getHeader方法来获取请求头字段的值。
Java请求转发和重定向的区别

Java请求转发和重定向的区别Java请求转发和重定向的区别1、请求转发:request.getRequestDispatcher(URL地址).forward(request, response)处理流程:1. 客户端发送请求,Servlet做出业务逻辑处理。
2. Servlet调⽤forword()⽅法,服务器Servlet把⽬标资源返回给客户端浏览器。
2、重定向:response.sendRedirect(URL地址)处理流程:1. 客户端发送请求,Servlet做出业务逻辑处理。
2. Servlet调⽤response.sendReadirect()⽅法,把要访问的⽬标资源作为response响应头信息发给客户端浏览器。
3. 客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
3、转发和重定向的区别:1、转发使⽤的是getRequestDispatcher()⽅法; 重定向使⽤的是sendRedirect();2、转发:浏览器URL的地址栏不变。
重定向:浏览器URL的地址栏改变。
request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显⽰出转向后的地址;服务器内部转发,整个过程处于同⼀个请求当中。
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
不在同⼀个请求。
重定向,实际上客户端会向服务器端发送两个请求。
所以转发中数据的存取可以⽤request作⽤域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的数据的。
只能⽤session。
3、转发是服务器⾏为,重定向是客户端⾏为;4、转发是浏览器只做了⼀次访问请求。
重定向是浏览器做了⾄少两次的访问请求;5、转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)6、RequestDispatcher是通过调⽤HttpServletRequest对象的getRequestDispatcher()⽅法得到的,是属于请求对象的⽅法。
Servlet的应用

Servlet的应用一、Servlet的应用1. 一个Servlet类应该继承HttpServlet并且覆盖doGet或doPost方法,这取决于数据的发送方式是get 还是post。
若要在一个Servlet中同时处理get 和post请求,并且对每个请求的处理动作相同,可以简单地在doGet方法中调用doPost方法,反之亦然。
doGet和doPost方法都有两个参数:HttpServletRequest 和HttpServletResponse。
可以通过HttpServletRequest类提供的方法获得引入的信息,比如表单数据、客户主机名等;HttpServletResponse类提供输出信息的能力,比如,通过HttpServletResponse得到一个PrintWriter向客户发送文档内容。
2. doGet、doPost及其它doXxx方法是Servlet的主体,大部分时间都只用关心get和post 请求,所以只需覆盖doGet、doPost方法。
如果需要,也可以为处理delete请求而覆盖doDelete 方法;为处理put请求而覆盖doPut方法;为处理options请求而覆盖doOptions方法;为处理trace请求而覆盖doTrace方法。
注意,没有doHead方法,因为系统自动用状态列和header 设置来回复head 请求。
3. 一个简单的Servlet最主要的功能就是用println语句输出一个预期的页面。
因为doGet 和doPost会抛出两个异常,因此要引处相关的类:java.io——因为要用到PrintWriter等javax. servlet——因为要用到HttpServlet等javax. servlet.http——因为要用到HttpServletRequest 和HttpServletResponse等二、Servlet的编译、配置和调用1. 环境变量CLASSPA TH要包含了标准的Servlet类,比如:.;%JA V A_HOME%\lib\dt.jar;%JA V A_HOME%\lib\tools.jar;E:\Program Files\Apache SoftwareFoundation\T omcat 6.0\lib\servlet-api.jar2. 用“javac”命令编译Servlet,将生成的Servlet类(即.class 文件)放到正确路径,比如:ROOT\WEB-INF\classes3. 若生成的Servlet类(即.class文件)放在ROOT\WEB-INF\classes,则必须使用ROOT\WEB-INF目录下的web.xml文件进行注册。
JavaWeb中请求转发和请求重定向的区别以及使用

JavaWeb中请求转发和请求重定向的区别以及使⽤什么是请求转发?请求转发是指,服务器收到请求后,从⼀次资源跳转到另⼀个资源的操作。
请求转发的特点1.浏览器地址栏不会发⽣变化2.他们⼀次请求,服务器完成转发操作3.共享Request域中的数据4.可以转发到WEB-INF⽬录下5.不可以访问⼯程以外的资源举个例⼦:1.⼀个公司有多个部门,其中部门1(Servlet1)向客户提供了⾃⼰能够提供的服务,但是还有⼀部分服务⾃⼰提供不了,需要其他部门的服务;2.所以部门1(Servlet1)将客户的⽂件盖⼀个章,证明部门1已经提供了服务,然后将其转交(请求转发)到部门2(Servlet2);3.部门2检查部门1是否盖过章了,如果盖过章就继续向客户提供服务…;4.直到所有服务都处理完,将客户需要的数据提供给客户(即,将数据转发给客户端**[转发到某个页⾯]**);package servlet;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class Servlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.servlet1先获取请求参数,看看servlet1需要做的事String username = request.getParameter("username");System.out.println(username);//.....部门1提供⾃⼰的服务//2.servlet1设置⼀个参数证明servlet1转发的请求(部门1盖⼀个章)request.setAttribute("key1", "servlet1");//3.查询servlet2的路径,(部门1将其转交给部门1)RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");//4.把请求和响应转发给servlet2dispatcher.forward(request, response);}}package servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class Servlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//部门2查看客户需要的服务System.out.println("Servlet2查看参数: "+request.getParameter("username"));//部门2查看部门1有没有盖章,判断是否继续服务System.out.println("Servlet2查看是否有Servlet1的证明: "+request.getAttribute("key1"));//部门2处理完⾃⼰的服务,System.out.println("Servlet处理⾃⼰的业务");}}注意1.这时候如果我们将Servlet2放在WEB_INF下,那么我们就⽆法直接访问servlet2了;2.但是我们可以通过请求转发来实现访问servlet2;思考:登录功能和这种请求转发⽅法类似,我们⽆法跳过登录界⾯直接访问系统,所有我们可以⽤这种请求转发的⽅法来实现;什么是请求重定向?请求重定向:是指客户端发送请求,然后服务器告诉客户端,我给你⼀个地址,你去新的地址访问(之前的地址可能已经被废弃,或者之前的地址[Servlet]⽆法满⾜需求);第⼀种⽅案// 设置响应状态码 302 ,表⽰重定向,(已搬迁)resp.setStatus(302);// 设置响应头,说明新的地址在哪⾥resp.setHeader("Location", http://localhost:8080);第⼆种⽅案(推荐使⽤)resp.sendRedirect(http://localhost:8080);请求重定向的特点1.浏览器的地址栏会发⽣变化2.浏览器发送了两次请求,⽽不是像调⽤request的getRequestDispatcher("/a/b/c.html").forward(request, response)⽅法实现的;所以⼀共创建了两个request对象3.两个request对象不能共享域数据4.重定向不能访问WEB-INF⾥的资源,因为两次请求都是客户端发起的,客户端⽆法直接访问到WEB-INF⾥的资源5.可以访问⼯程外的资源(⽐如说调转的百度等等)什么时候使⽤请求重定向?1.浏览会记录最后⼀次请求的所有数据,客户端可以通过刷新页⾯的⽅法,重新发起最后⼀次请求;2.⽽我们在请求转发或请求重定向之前,总会处理⼀些业务;此时,如果当本次业务是对数据库,本地⽂件的增删改操作时,就需要使⽤请求重定向;为什么呢?因为,这时如果我们使⽤请求转发(整个处理业务过程就只是⼀次请求),浏览就会记录我们这次请求(操作数据库),⼀旦客户端刷新页⾯,就会执⾏(操作数据库)的请求,这时很严重的bug,我们要避免,所有就要⽤到请求重定向;1.因为我们每次操作完数据库,都会跳转到⾸页,或者数据展⽰的页⾯,所以这时我们使⽤请求重定向跳转到这个页⾯(实际是跳转到某个Servlet查询数据库中的记录,这个Servlet再跳转到数据展⽰的页⾯);2.此时浏览器记录的最后⼀次请求就是查询数据库中记录的请求了,这时我们刷新页⾯,也只是查询数据,不再是对数据库的增删改了;总结:当我们修改数据库中的数据的之后,就需要使⽤请求重定向来避免上述的问题了;到此这篇关于JavaWeb中请求转发和请求重定向的区别以及使⽤的⽂章就介绍到这了,更多相关请求转发和请求重定向内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
java Servlet请求转发和重定向

•请求转发☐请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。
此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变☐请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应RequestDispatcher rd = request.getRequestDispatcher(path);rd.forward(request,response);或request.getRequestDispatcher(path) .forward(request,response);•重定向☐重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址☐重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求response.sendRedirect(path);•请求转发和重定向区别如下:☐forward()只能将请求转发给同一个Web应用中的组件,而sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。
☐sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
☐forward()方法的调用者与被调用者之间共享相同的request对象和response对象;而sendRedirect()方法调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。
•使用请求对象(request)存储数据(在servlet中存,在JSP中取)request. setAttribute(“score”,score);int score=(INTEGER)request. getAttribute(“score”);☐HttpServletRequest接口的方法:public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用HttpSession对象存储数据HttpSession session=request.getSession();session. setAttribute(“score”,score);int score=(Integer) session. getAttribute(“score”);☐HttpSession接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用ServletContext对象存储数据ServletContext context = this.getServletContext();或ServletContext context = this.getServletConfig().getServletContext();context. setAttribute(“score”,score);int score=(Integer) application. getAttribute(“score”);ServletContext接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)简单的说,HttpServletRequest共享的对象仅在请求的生存期中可被访问,使用HttpSession共享的对象仅在会话的生存期中可被访问,使用ServletContext共享的对象在应用程序的生存期中可被访问。
redirect和forward用法

Redirect和forward是网络通信中常用的两个概念,在网页设计和服务器端编程中经常会涉及到它们的使用。
本文将就这两个概念进行详细的解释和比较,以帮助读者更好地理解它们的用法和作用。
一、Redirect的用法1.1 定义Redirect是指将用户从一个URL位置区域自动重定向到另一个URL 位置区域。
当用户访问某个网页时,如果该网页已经被重定向到另一个URL,那么用户将会被自动跳转到新的URL位置区域上。
1.2 作用Redirect的主要作用是帮助全球信息站进行页面跳转,当某个网页位置区域发生变化或者需要将用户引导到其他页面时,可以通过Redirect来实现。
1.3 实现方式在服务器端编程中,可以通过HTTP响应头中的Location字段来实现Redirect。
当服务器收到一个请求后,如果需要进行重定向,就可以在响应头中添加Location字段,告诉浏览器要跳转的新位置区域。
二、Forward的用法2.1 定义Forward是指将用户请求转发到另一个URL位置区域,但是在浏览器位置区域栏中不会显示新的URL位置区域。
用户发送的请求会被服务器转发到另一个位置区域,但是用户并不会察觉到这一过程。
2.2 作用Forward的作用是实现服务器内部的页面跳转和数据传递。
在服务器端编程中,可以利用Forward将用户请求转发给其他处理程序,实现多个页面之间的数据共享和交互。
2.3 实现方式在Java的Servlet编程中,可以通过RequestDispatcher的forward 方法来实现Forward。
当服务器收到一个请求后,可以将该请求对象和响应对象传递给另一个Servlet,实现页面的内部转发和数据共享。
三、Redirect和Forward的区别3.1 URL位置区域Redirect会改变浏览器位置区域栏中的URL位置区域,而Forward 不会改变URL位置区域。
3.2 请求方式Redirect是通过GET方式发送新的请求,而Forward是在服务器内部完成的页面转发。
servlet请求转发的三种方式

servlet请求转发的三种方式servlet中的请求转发主要有三种方式:1、 forward:是指转发,将当前request和response对象保存,交给指定的url 处理。
并没有表示页面的跳转,所以地址栏的地址不会发生改变。
2、 redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。
3、 include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。
测试如下:首先编写三个html界面:分别是登录界面:login.html;登录成功界面:success.html;登录失败界面:fail.html.之后,处理登录逻辑的servlet类如下:Java代码运行后如果输入正确的用户名密码,则执行include方法,界面显示:include 包含。
登录成功!并且地址栏地址未改变,若是输入错误登录名或者密码,界面显示:登录失败!并且地址栏地址改变。
其中要注意的是sendRedirect方法中在要跳转的页面url前必须加上当前web程序路径名,这个路径通过request.getContextPath()可以得到。
如果吧其中include方法改为forward方法:Java代码登录时输入正确信息,则跳转的页面地址不变,显示:登录成功!不包含url中的内容。
总结如下:redirect与include、forward的区别在于是不是同一个Request,redirect会有两次交互。
include与forward的区别在于输出的内容,include包含本身servlet与跳转页面内容的结果,而forward不包含本身servlet的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
servlet的两种重定向方法的区别及应用一问题:在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向,一种是通过forward方法(例如JSP中的<jsp:forwardpage=”OtherPage.jsp”/>),另一种则是通过运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法(例如response.sendRedirect(“OtherPage.jsp”);这两种方法有什么区别和联系呢?让我们看下面的分析。
二分析:<JSP:FORWORD>该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区(buffer)的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.补充知识:输出缓冲区缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:1该JSP网页已完成信息的输出2输出缓冲区已满3JSP中调用了out.flush()或response.flushbuffer()输出缓冲区的大小可以用:<%@page buffer="none"|"nkb"%>或response.setBufferSize()设置,如下:1设置输出缓冲区的大小为1KB。
<%@page buffer="1kb"%>或response.setBufferSize(1);2设置输出缓冲区的大小为0,即不缓冲。
<%@page buffer="none" %>或response.setBufferSize(0);用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节.用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。
(2)response.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 World1设置状态信息状态行包含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)更好。
这是因为:首先,代码更加简洁。
第二,使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)。
最后,sendRedirect能够处理相对URL,自动把它们转换成绝对URL。
注意这个状态代码有时候可以和301替换使用。
例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。
严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。
请参见307。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。
服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307 Temporary Redirect 和302(Found)相同。
许多浏览器会错误地响应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 头。