Servlet的几种跳转
Servlet:
当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。
一、原理
1) redirect 方式
response.sendRedirect("/a.jsp");
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
response.sendRedirect("http://www.ycul.com");
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
这种方式是在客户端作的重定向处理。
该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。
如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
response.sendRedirect("/index.jsp");
}
2) forward方式
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request, response);
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
这种方式是在服务器端作的重定向。
服务器往client发送数据的过程是这样的:
服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。
什么时候将缓冲区里的数据发送给client端呢?
(1)当对来自client的request处理完,并把所有数据输出到缓冲区,
(2)当缓冲区满,
(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。
如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
二、区别:
1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。
比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。
而forward不能这样处理相对路径。
java 他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和response信息发送到下一页面)。
由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。
JSP:
1) response.sendRedirect();
和servlet的response.sendRedirect()方式一样。
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳转后浏览器地址栏变化
如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
2) response.setHeader("Location","");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转
3) <jsp:forward page="" />
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
(转自:http://www.cnblogs.com/chenatu/archive/2011/10/01/2197134.html)
相关推荐
Servlet几种页面跳转的区别Servlet几种页面跳转的区别
servlet 跳转的几种情况 Servlet 跳转是指 Servlet 程序在执行过程中将控制权转移到另一个资源的过程,例如跳转到另一个 Servlet、JSP 或 HTML 页面。Servlet 跳转可以分为两大类:Redirect 跳转和 Forward 跳转。 ...
本篇文章将详细讲解Servlet中跳转页面的两种主要方法:redirect(重定向)和forward(转发),以及在JSP中如何实现类似操作。 1. **Servlet中的跳转** - **Redirect(重定向)** 重定向是通过`response....
总结,Java Servlet中的页面跳转主要分为`redirect`和`forward`两种方式,每种都有其特定的应用场景。`redirect`适用于需要改变URL或跳转到外部资源的情况,而`forward`则适用于保持URL不变且在同一个应用内进行页面...
总结来说,通过Servlet获取下拉列表的值并跳转到相关页面涉及以下几个步骤: 1. 在HTML页面中创建下拉列表,并指定一个name属性。 2. 编写Servlet,使用HttpServletRequest的getParameter()方法获取下拉列表的值。 3...
总结来说,通过Servlet实现登录界面的跳转涉及以下几个关键点: 1. 创建HTML登录表单,指定提交时调用的Servlet。 2. 编写Servlet,处理POST请求,获取并验证用户输入。 3. 根据验证结果,使用`sendRedirect`进行...
Web 2 Servlet 的基本使用和跳转 在本节中,我们将讨论 Web 2 Servlet 的基本使用和跳转。首先,我们将回顾 HTTP 协议,然后讨论 Servlet 的基本使用和跳转。 HTTP 协议回顾 HTTP 协议是应用层的面向对象的协议,...
在Java Web开发中,Servlet是一种用于处理HTTP请求的服务器端组件。MV模式,通常指的是Model-View-Controller(模型-视图-控制器)设计模式,它在Servlet中扮演着核心角色,帮助开发者实现业务逻辑与用户界面的解耦...
Servlet是一种Java编程语言中的技术,主要用于扩展服务器的功能,特别是在Web应用开发中,它扮演着核心角色。在这个项目中,Servlet将作为服务器端的处理组件,负责接收客户端(通常是浏览器)发送的请求,并返回...
在Java Web开发中,Servlet是一种用于扩展服务器功能的Java类,它可以处理HTTP请求并返回响应。本项目"Servlet实现登录功能"旨在通过Servlet技术构建一个基础的用户登录系统。在这个项目中,我们将涵盖以下几个关键...
SERVLET是一种Java技术,用于扩展服务器的功能,特别是在Web应用程序中。下面我们将深入探讨SERVLET、JSTL以及它们在企业信息管理系统中的应用。 首先,SERVLET是Java Servlet的简称,它是一个Java编写的服务器端...
4. 请求转发和重定向:学习在Servlet中如何使用`RequestDispatcher`进行页面间的跳转。 5. 数据验证:检查购物车操作中是否进行了必要的输入验证,如商品ID的有效性、数量的合理性等。 通过研究这个简单的购物车...
一个Servlet通常由以下几部分组成: 1. **Servlet生命周期**:Servlet经历初始化、服务、销毁三个阶段。在初始化阶段,Servlet会创建一个实例;服务阶段,Servlet处理客户端请求;销毁阶段,当Servlet不再需要时,...
### JSP 页面间的五种跳转方式详解 #### 一、`RequestDispatcher.forward()`方法 在JSP 和 Servlet 的环境中,`RequestDispatcher.forward()` 方法是一种非常常用的页面跳转方式。这种方式实现了容器内部的控制权...
JSP页面主要包含以下几种元素: - **声明语句**:定义页面中的变量或方法。 - **表达式语言(EL)**:用于获取数据源中的数据。 - **脚本元素**:嵌入Java代码片段。 - **指令**:设置页面属性,如contentType、...
在本项目中,"Servlet+mysql+tomcat实现简单登录和注册",主要涉及了Web开发中的几个核心技术,包括Servlet、JSP、MySQL数据库以及Tomcat服务器。下面将详细阐述这些知识点及其相互间的配合。 1. **Servlet**: ...
JSP页面主要包括以下几种元素: 1. **脚本元素**:如`<% %>`用于嵌入Java代码片段。 2. **指令元素**:如`<%@ page %>`用于定义页面属性。 3. **动作元素**:如`<jsp:forward>`用于控制页面跳转。 #### 八、JSP...
在JSP页面中实现自动跳转同样可以采用上述几种方式。以下是一个更完整的示例,展示了如何结合JavaScript和服务器端逻辑实现页面的自动跳转: ```jsp <%@ page import="javax.servlet.http.HttpServletRequest" %> ...
在JSP和Servlet中,有以下几种常见的重定向方式: 1. **JSP中的重定向**:JSP本身不直接支持重定向,但可以通过内置对象`response`的`sendRedirect()`方法实现。例如: ```jsp ("newPage.jsp"); %> ``` 这行...
- **使用场景**:重定向通常用于以下几种情况: - 用户身份验证:登录成功后,将用户重定向到个人主页或其他页面。 - 页面跳转:例如,在完成某个操作后(如提交表单),将用户引导至确认页面或下一个操作页面。 ...