Servlet和JSP中转发与重定向的区别&动态include和静态include的区别

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样式改了,结果我发现刷新页面动静态都改变了

 

试验到这里,我发现我肯定理解错网上那些面试题中的答案了

 

经过更复杂的试验,个人得出这样的结论

  1. @ include子页面拿不到request中的数据
  2. @ include如果涉及到数据库,它只加载一次,当数据库的值变化时,子页面的数据不变化,也就是说静态include最好包含的是静态页面

最后想说我总结的比一定准,不准之处请指教吧。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
让我们逐个比较这些概念: 1. 静态包含和动态包含: - 静态包含是指在JSP页面使用`<%@ include file="filename.jsp" %>`语法将另一个JSP文件的内容嵌入到当前页面。这是在编译时进行的,嵌入的内容会被当作当前页面的一部分。 - 动态包含是指使用`<jsp:include page="filename.jsp" />`标签在运行时包含另一个JSP文件的内容。这是在运行时进行的,嵌入的内容会被动态地加载和执行。 2. 转发重定向: - 转发(forward)是指在服务器端将请求从一个资源发送到另一个资源,新资源接收到请求后可以共享同一个请求和响应对象。转发是在服务器内部完成的,客户端并不知道转发的过程。 - 重定向(redirect)是指在服务器端将请求响应给客户端,并在响应头指示客户端重新发送请求到另一个URL。重定向会导致浏览器发起新的请求,对于客户端来说是完全透明的。 3. Session与Cookie: - Session是在服务器端用于跟踪用户会话状态的机制,通过在服务器上存储会话数据,并将唯一的会话标识符发送给客户端的Cookie来实现。Session可以存储在服务器的内存或持久化到数据库。 - Cookie是一小段文本信息,由服务器发送给客户端并存储在客户端的浏览器。浏览器在后续请求会自动将Cookie发送给服务器。Cookie可以用于存储少量的用户数据,如登录状态、偏好设置等。 4. JSPServlet: - JSPJavaServer Pages)是一种用于开发Web应用程序的Java技术,它允许在HTML嵌入Java代码。JSP页面在服务器端被编译成Servlet,并在每次请求时动态生成HTML响应。 - Servlet是用Java编写的服务器端组件,它接收HTTP请求并生成HTTP响应。Servlet可以处理各种类型的请求,如GET、POST等,并与数据库、其他Web服务进行交互。 5. JPA与Hibernate: - JPA(Java Persistence API)是Java EE定义的一套用于访问关系型数据库的API标准。它提供了一种面向对象的持久化模型,可以通过JPA进行对象关系映射(ORM)操作。 - Hibernate是一个开源的Java持久化框架,实现了JPA规范。它提供了强大的对象关系映射功能,使开发人员能够以面向对象的方式操作数据库。 6. JSF与Struts: - JSF(JavaServer Faces)是Java EE的一个Web应用程序框架,用于构建用户界面。它采用组件化的方式,提供了丰富的用户界面组件和事件模型,简化了Web应用程序的开发。 - Struts是一个开源的Java Web应用程序框架,它基于模型-视图-控制器(MVC)设计模式。Struts提供了一种结构化的方式来组织和管理Web应用程序,包括请求处理、表单验证等功能。 这些概念都是在Java Web开发经常使用的重要概念,根据具体的需求和场景选择合适的技术和机制可以提高开发效率和应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值