Servlet中转发与重定向的区别
转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。
1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获得,一种是通过ServletContext的getRequestDispatcher()方法获得;
以前的request范围中存放的变量不会失效,就像把两个页面拼到了一起。 例如:
RequestDispatcher rd = request.getRequestDispatcher("forwaordResult.jsp");//转发到forwaordResult.jsp页面
rd.forward(request, response);
详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用forward()方法,将请求转发给servlet2。但是调用forward()方法,对于浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2,它只知道发出了一个请求,获得了一个响应。浏览器URL的地址栏不变。
在JSP中转发的表现形式是:
<jsp:forward page="forwardResult.jsp">
2、重定向:HttpServletResponse的sendRedirect()方法。
服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享request范围内的数据。例如:response.sendRedirect(“forwaordResult.jsp");//重定向到forwaordResult.jsp
详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用sendRedirect()方法,将客户端的请求重新定向到Servlet2。接着浏览器访问servlet2,servlet2对客户端请求作出反应。浏览器URL的地址栏改变。
3、主要区别:
(1)sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward()方法只能将请求转发给同一Web应用的组件。
(2)forward是在服务器端的跳转,就是客户端一个请求发给服务器,服务器直接将请求相关的参数的信息原封不动的传递到该服务器的其他jsp或servlet去处理,而sendredirect是在客户端的跳转,
(3)转发:浏览器URL的地址栏不变。
重定向:浏览器URL的地址栏改变。
动态include和静态include的区别
JSP中所谓静态include的表现形式:
<%@ include file="headerStatic.jsp" %>
<%@ include file="mainStatic.jsp" %>
<%@ include file="footerStatic.jsp" %>
JSP中所谓动态include的表现形式:
<jsp:include page="header.jsp"/>
<jsp:include page="main.jsp"/>
<jsp:include page="footer.jsp"/>
然后来看servlet中所谓include的表现形式
RequestDispatcher rd; rd = request.getRequestDispatcher("/header.jsp"); rd.include(request, response); rd = request.getRequestDispatcher("/main.jsp"); rd.include(request, response); rd = request.getRequestDispatcher("/footer.jsp"); rd.include(request, response);
现在来真正分析一下JSP动态include和静态unclude的区别:
在静态JSP生成的servlet文件中看到如下关键代码
static { _jspx_dependants = new java.util.ArrayList(3); _jspx_dependants.add("/headerStatic.jsp"); _jspx_dependants.add("/mainStatic.jsp"); _jspx_dependants.add("/footerStatic.jsp"); }
使用的是静态代码块来实现,也就是说类加载的时候把三个文件读进来
反观动态include:是通过这样三句代码
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "header.jsp", out, false); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "main.jsp", out, false); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "footer.jsp", out, false);
注意一下动静态我用的文件名不一样,静态的加了static。
然后我们来看一下tomcat的tomcat\work\Catalina\localhost\WebTest\org\apache\jsp这个文件夹,也就是编译成servlet的文件夹
这里面并没有编译出headerStatic文件
也就是说
jsp:include是先编译一下included.jsp文件,然后再包含 先编译,后包含 编译成多个文件
@ include是先把文件包含就来,然后统一编译 先包含,后编译 编译成一个文件
那么既然静态inlcude是在静态代码块中实现的,那么服务器不重启的话,类就已经加载在内存,如果修改herder.jsp,主页面应该是不会变化的。
但我做了个简单的测试,我把header.jsp和headerStatic.jsp文件的css样式改了,结果我发现刷新页面动静态都改变了
试验到这里,我发现我肯定理解错网上那些面试题中的答案了
经过更复杂的试验,个人得出这样的结论
- @ include子页面拿不到request中的数据
- @ include如果涉及到数据库,它只加载一次,当数据库的值变化时,子页面的数据不变化,也就是说静态include最好包含的是静态页面
最后想说我总结的比一定准,不准之处请指教吧。
相关推荐
Servlet请求转发、重定向和包含是Servlet中处理客户端请求的重要技术,它们都涉及到如何有效地管理用户请求和页面跳转,但各自有不同的特性和应用场景。 1. **请求转发(Request Forward)** - 请求转发是在服务器...
Servlet的主要作用是在Web服务器上运行,扩展服务器功能,提供动态和交互式的网页内容。在Servlet中,你可以处理各种HTTP方法(如GET、POST),解析请求参数,创建响应,并将其发送回客户端。Servlet生命周期包括...
JSP和Servlet是Java Web开发中的两大核心组件,它们在构建动态、数据驱动的Web应用程序中扮演着至关重要的角色。下面将详细阐述这两个技术的主要概念、工作原理以及如何在实际开发中应用它们。 1. **JavaServer ...
### Servlet与JSP核心编程第二版5:关键技术与实践解析 #### 一、Servlet概述与核心技术 ##### 1.1 Servlet简介 Servlet 是 Java 平台的一种服务器端技术,用于扩展应用程序的功能。它是一个轻量级的应用程序组件...
Servlet和JSP是Java Web开发中的重要组成部分,它们在构建动态网页和Web应用程序中起着关键作用。本书《Servlet与JSP核心编程(第二版)卷二》的源代码集合,为读者提供了丰富的实践素材,有助于深入理解这两种技术...
Servlet和JSP是Java Web开发中的核心技术,它们用于构建动态、交互式的Web应用程序。Servlet是Java编程语言的一个接口,允许Java代码与HTTP服务器交互,处理客户端的请求并生成响应。而JSP(JavaServer Pages)则是...
7. **请求转发与重定向**:在Servlet中,如何使用request.getRequestDispatcher()和response.sendRedirect()方法进行页面间的跳转。 8. **过滤器(Filter)**:如何定义和使用Filter,实现请求的预处理和后处理,...
在Java Web开发中,Servlet和JSP(JavaServer Pages)是两种重要的技术,它们共同用于构建动态网页应用。本教程将介绍如何使用servlet和jsp实现数据的增删改查功能,这对于理解Web应用程序的基本工作原理至关重要。 ...
Servlet与JSP都是Java Web开发中的关键技术,它们之间既有区别又有联系。 - **Servlet**主要用于控制逻辑和数据处理,可以实现复杂的业务逻辑和数据交互操作。Servlet通过编程方式处理HTTP请求,生成响应内容。 - *...
一、JSP与Servlet的区别 1. **本质与生成**:JSP(Java Server Pages)本质上是Servlet的一种简化形式,它将HTML代码和Java代码结合在一起,经过Web容器(如Tomcat)的处理,被编译成Servlet类。在运行时,JSP文件...
Servlet和JSP是Java Web开发中的核心技术,它们用于构建动态网页和服务器端应用程序。Servlet是Java编程语言中的一组接口,允许Java代码与HTTP协议交互,处理来自客户端(通常是浏览器)的请求,并向客户端发送响应...
JSP指令(如`<%@ page %>`, `<%@ include %>`, `<jsp:include>`)和动作元素(如`<jsp:useBean>`, `<jsp:setProperty>`, `<jsp:forward>`)提供了强大的页面控制和数据管理功能。 源代码v1.0可能包含了多个示例项目...
Servlet和JSP是Java Web开发中的重要组成部分,主要用于构建动态网页。面试中常见的问题涵盖了这两个技术的基本概念、对象、动作、生命周期以及与HTTP方法的区别等多个方面。 1. **JSP九大内置对象**: - `request...
**三、JSP动态INCLUDE与静态INCLUDE** 1. **动态INCLUDE**:使用`<jsp:include>`,每次请求都会检查被包含页面的更新,适用于动态内容,可以传递参数。 2. **静态INCLUDE**:使用`<%@ include file="">`,在编译时...
Servlet和JSP是Java Web开发中用于动态网页处理的关键技术,它们在创建交互式Web应用程序,如购物车系统时发挥着重要作用。 Servlet是一种Java编程接口,用于扩展服务器的功能,特别是对于HTTP协议的应用。它允许...
- **转发与重定向**:了解请求转发与重定向的区别及其应用场景。 #### 四、高级Servlet主题 - **过滤器(Filter)**:用于拦截用户的请求,在请求达到目标资源前执行某些预处理工作。 - **监听器(Listener)**:监听...
在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种重要的技术,它们共同构成了动态网站的基础。本文将深入探讨这两个技术的核心概念、应用场景以及它们之间的交互。 **JSP技术** JSP是一种用于创建动态...
Servlet和JSP是Java Web开发中的核心技术,用于构建动态网页应用。 Servlet是Java编程语言的一个接口,由Sun Microsystems(现已被Oracle收购)定义,用于扩展服务器的功能。它允许开发者创建能够处理HTTP请求和...
JSP(JavaServer Pages)和Servlet是Java Web开发中两个核心的技术,它们主要用于构建动态网站。下面将详细阐述这两个概念以及它们在笔试中常遇到的问题。 1. JSP内置对象: - request:代表HttpServletRequest对象...
6. **转发与重定向**:在Servlet中,可以通过RequestDispatcher的`forward()`方法将请求转发到其他资源,或者使用Response的`sendRedirect()`方法进行重定向。 7. **Session管理**:Servlet提供了HttpSession接口来...