日期:2014-05-16  浏览次数:20414 次

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_depen