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最好包含的是静态页面
最后想说我总结的比一定准,不准之处请指教吧。
相关推荐
本书较为全面地介绍了JSP技术,由浅入深、循序渐进地介绍了JSP的运行系统,基本概念,语法规范及其相关内容,从基本的JSP概述、与其他技术的对比,到JSP的运行系统和模式,逐步深入地对JSP语法规范进行了详细的...
123、JSP中动态INCLUDE与静态INCLUDE的区别? 31 124、两种跳转方式分别是什么?有什么区别? 31 125、如何执行一个线程安全的JSP? 31 126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 128...
123、JSP中动态INCLUDE与静态INCLUDE的区别? 31 124、两种跳转方式分别是什么?有什么区别? 31 125、如何执行一个线程安全的JSP? 31 126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 ...
jsp中动态include和静态include的区别? 答:动态include用jsp:include实现,适用于动态页面,可以携带参数 静态include用include伪码实现,适用于静态页面 math.round(11.5)等于多少?math.round(-11.5)等于多少? ...
5.2.2 Servlet与JSP的区别 5.3 为我所用——Servlet技术开发 5.3.1 Servlet在JavaEE中的结构体系 5.3.2 Servlet核心API 5.3.3 创建第一个Servlet对象 5.3.4 Servlet配置解析 5.3.5 使用Servlet处理业务逻辑 5.3.6 ...
静态联编和动态联编 500 实例 500 内容总结 503 独立实践 504 第二十六章:JavaScript基础 505 学习目标 505 基本结构 506 JavaScript代码的加入 506 基本数据类型 506 常量 507 表达式和运算符 509 实例 511 ...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
在这本权威著作中,sun microsystems公司中的jsf合作规范领导者展示了如何创建动态的、跨浏览器的web应用程序,由于保留了较高质量的代码和可扩展性,这些应用程序可以给用户带来极为优秀的体验。 《JavaServer ...
在这本权威著作中,sun microsystems公司中的jsf合作规范领导者展示了如何创建动态的、跨浏览器的web应用程序,由于保留了较高质量的代码和可扩展性,这些应用程序可以给用户带来极为优秀的体验。 《JavaServer ...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
方式一、与Servlet解耦合的非IOC方式 20 方式二、与Servlet解耦合的IOC方式 21 方式三、与Servlet耦合的非IOC方式 21 方式四、与Servlet耦合的IOC方式 22 四、OGNL与ValueStack(VS) 22 1.值栈入门 22 2.OGNL入门 24 ...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置...
3.7.2静态方法和实例方法的区别134 3.7.3静态代码块136 3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145...
bootcfg /disableredirect 在启动引导程序中禁用重定向。 bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings] 在启动引导程序中通过指定配置启用重定向。 范例: bootcfg /redirect com1 115200 ...