引入JSP有两种方式<%@ include file=“xxx.jsp” %>和<jsp:include page=“xxx.jsp” />,前者称为include指令,后者称为include动作,两者的区别是:
include指令在JSP页面转换成Servlet之前,将JSP代码插入其中。所以只有一个Servlet。
include动作是在主页面被请求时,将次级页面的输出包含进来,所以有多个Servlet。这种方式与RequestDispatcher类的include方法一致。
由此推测:
1、因为include指令只生成一个Servlet,代码中没有include方法,所以<dispatcher>INCLUDE</dispatcher>不会起作用。
2、因为include动作生成多个Servlet,代码中有include方法,所以<dispatcher>INCLUDE</dispatcher>会起作用。
include可以在JSP页面转换成Servlet之前,将JSP代码插入其中。它的主要优点是功能强大,所包含的代码可以含有总体上影响主页面的JSP构造,比如属性、方法的定义和文档类型的设定。它的缺点是难于维护只要被包含的页面发生更改,就得更改主页面,这是因为主页面不会自动地查看被包含的页面是否发生更改。
jsp:include动作是在主页面被请求时,将次级页面的输出包含进来。尽管被包含的页面的输出中不能含有JSP,但这些页面可以是其他资源所产生的结果。服务器按照正常的方式对指向被包含资源的URL进行解释,因而这个URL可以是Servlet或JSP页面。服务器以通常的方式运行被包含的页面,将产生的输出放到主页面中,这种方式与RequestDispatcher类的include方法一致。它的优点是在被包含的页面发生更改时,无须对主页面做出修改。它的缺点是所包含的是次级页面的输出,而非次级页面的实际代码,所以在被包含的页面中不能使用任何有可能在整体上影响主页面的JSP构造。
REQUEST:
直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
FORWARD:
转发访问执行过滤器。包括RequestDispatcher#forward()方法,<jsp:forward>标签都是转发访问;
INCLUDE:
包含访问执行过滤器。包括RequestDispatcher#include()方法,<jsp:include>标签都是包含访问;
ERROR:
当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
注:forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后的内容拿过来.include 和 sendRediect 之后,后面的语句会继续执行,所以应该在合适的位置写上return;forward的不会)