两种include方式

我自己写了一个original.jsp,另外有一个includedPage.jsp,我想在original.jsp中把includedPage.jsp引进来有两种方式:

1、<%@ include file="includedPage.jsp" %>,这是一种include指令

2、<jsp:include page="includedPage.jsp" />,这是一种include动作

先讲原理再讲区别,所有的jsp页面在后台,会先被转换为一个Servlet,就比如这个includedPage.jsp吧:

public final class includedPage_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent {private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();private static java.util.List _jspx_dependants;private javax.el.ExpressionFactory _el_expressionfactory;private org.apache.AnnotationProcessor _jsp_annotationprocessor;
...
}

而这个HttpJspBase:

public abstract class HttpJspBase extends HttpServletimplements HttpJspPage
{public final void init(ServletConfig config)throws ServletException{super.init(config);jspInit();_jspInit();}...
}

它是HttpServlet的子类,因此任何一个页面Tomcat容器都会将它转成一个Servlet,然后编译成.class文件,页面上实际执行的是.class文件,这些jsp文件对应的.class文件都放在Tomcat的work目录下。OK,讲完了这个再讲两种include的区别:

1、jsp指令是在original.jsp被转换成Servlet前,将includedPage代码插入其中;jsp动作是在original.jsp被请求时,将次级页面includedPage.jsp包含进来。所以jsp指令和jsp动作的根本性差别在于它们被调用的时间的不同,前者在页面转换期间被激活,后者在请求期间被激活。使用jsp指令的时候,嵌入的页面includedPage.jsp要删除MyEclipse给开发者自动生成的path、basePath的定义也是这个原因,因为在页面转换期间被激活,如果不删除,那么两个jsp页面中都有path、basePath的定义,就属性重复定义了

2、由于第一点的差别导致,include动作使得主页面和嵌入的页面共同生成一个Servlet,而include指令则主页面和每个嵌入的页面各自生成自己的Serlvet

实际应用中,一般都会使用include动作即<jsp:include page="includedPage.jsp" />的方式来嵌入页面,因为include动作虽然在执行效率上稍稍慢于jsp指令,但是在维护性上却远胜。因为我们使用jsp动作的话,被嵌入的页面如果发生了变化,那么所有包含被嵌入页面的Servlet都要重新编译并更新,这是一个很大的代价。

filter的四种dispatcher

Java Web的开发都知道如何在web.xml里面配置过滤器,过滤器中有一个属性<dispatcher></dispatcher>却很少有人清楚地知道什么意思,我感觉网上也没有写得特别好的文章解释清楚这个属性。所以现在就来探究一下这个属性的作用,首先写一个Filter:

public class DispatcherFilter implements Filter
{public void init(FilterConfig filterConfig) throws ServletException{}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{System.out.println("Enter DispatcherFilter.doFilter()");chain.doFilter(request, response);}public void destroy(){}
}

再来在web.xml里面定义一个filter:

<filter>
    <filter-name>dispatcher</filter-name><filter-class>com.xrq.filter.DispatcherFilter</filter-class>
</filter>
<filter-mapping><filter-name>dispatcher</filter-name><url-pattern>/*</url-pattern><dispatcher>XXX</dispatcher>
</filter-mapping>

注意<dispatcher></dispatcher>必须写在filter-mapping的最后。dispatcher的前提条件当然是要先满足url-pattern,然后dispatcher有四种可能的属性:

1、REQUEST

只要发起的操作是一次HTTP请求,比如请求某个URL发起了一个GET请求、表单提交方式为POST时提交表单则发起了一个POST请求、表单提交方式为GET时提交表单则发起了一次GET请求、一次重定向则前后相当于发起了两次请求,这些情况下有几次请求就会走几次指定过滤器

2、FOWARD

只有当当前页面是通过请求转发转发过来的场景,才会走指定的过滤器

3、INCLUDE

只要是通过<jsp:include page="xxx.jsp" />,嵌入进来的页面,每嵌入的一个页面,都会走一次指定的过滤器

4、ERROR

这个可能开发者不是很熟悉,意思是当触发了一次error的时候,就会走一次指定的过滤器。什么叫做触发error,举个例子,我在web.xml里面配置了<error-page></error-page>:

<error-page><error-code>400</error-code><location>/filter/error.jsp</location>
</error-page><error-page><error-code>404</error-code><location>/filter/error.jsp</location>
</error-page><error-page><error-code>500</error-code><location>/filter/error.jsp</location>
</error-page>

意思是HTTP请求响应的状态码只要是400、404、500三种状态码之一(比如访问了一个不存在的页面,就是404),容器就会将请求转发到http://ip:port/工程名/filter/error.jsp下,这就触发了一次error,走进了我自己写的DispatchFilter。注意一点的是,虽然把请求转发到http://ip:port/工程名/filter/error.jsp是一次forward的过程,但是我试了一下,配置成<dispatcher>FORWARD</dispatcher>并不会走DispatchFilter这个过滤器。

这四种dispatcher方式可以单独使用,也可以组合使用,配置多个<dispatcher></dispatcher>就好了。

转载于:https://www.cnblogs.com/xrq730/p/4929029.html

两种include方式及filter中的dispatcher解析相关推荐

  1. 两种include方式的作用

    一.前言 身为一名coder有太多太多的知识点要去学,太多太多的东西要去记.往往一些小细节也就难免疏忽,但悲催的是多数困恼你的bug就是因为这些微不足道的知识点.我们又不是机器人,怎么可能什么都记得了 ...

  2. c语言冒泡排序的两种实现方式,c语言中冒泡排序的实现原理是什么?

    满意答案 jmytwdipp 推荐于 2017.10.08 采纳率:54%    等级:11 已帮助:9051人 冒泡排序,就是对一组数进行逐趟排序的方法,具体分为升序和降序. 以升序为例. 每一趟的 ...

  3. C++中的两种绑定方式(静态绑定、动态绑定)

    两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...

  4. java手动注册filter,SpringBoot注册Filter的两种实现方式

    springboot版本:2.2.5 一.filter注册 springboot中添加filter有两种方式: 1.实现方法一 2.实现方法二 二.Springboot自带filter Springb ...

  5. JSP中两种include的区别

    jsp中有两种include,一种是<%@include file="xxx.jsp"%>,另一种是<jsp:include page="xxx.jsp ...

  6. android密码dakay,安卓中按钮点击事件onClick的两种实现方式

    很多的语言都有一些共同的特点,比如OnClick这个东西,可能我们能在js中见到,当然在安卓中也有,可能其他的编程语言也会有这个东西,刚好今天学了这个玩意在安卓中的写法. 点击事件大多用在Button ...

  7. 在前端网页设计中 align 和 valign 两种对齐方式的不同取值区分(持续补充)

    文章目录 前言 一.align 与 valign 的对齐方式与取值 二.常见应用区分整理 2.1.H5 页面设计的取值 2.2.表格标题的取值 2.3.表格属性的取值 总结 前言 不知道大家在学习 H ...

  8. link linux 跨设备,Linux中的两种link方式

    Linux系统中包括两种链接方式:硬链接(hard link)和符号链接(symbolic link),其中符合链接就是所谓的软链接(soft link),那么两者之间到底有什么区别呢? inode ...

  9. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.   在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...

最新文章

  1. 贝叶斯思想概述:从贝叶斯定理到贝叶斯网络
  2. android 删除文件
  3. Python异常处理体系简介(1)
  4. 智能电源分配PDU应用
  5. IDEA 2019.1 不支持lombok插件问题解决方案
  6. python interpreter 中没有torch_PyTorch扩展自定义PyThon/C++(CUDA)算子的若干方法总结
  7. Django 的cookie 与 session组件
  8. Association, Composition and Aggregation in UI5, CRM, S/4HANA and C4C
  9. 轻量级 Kubernetes K3s - Github热点
  10. 【转载】8天学通MongoDB——第八天 驱动实践
  11. 数字图像处理及MATLAB实现实验四——图像变换
  12. 一文告诉你怎样“火起来”
  13. Linear algebra4---duality2
  14. string、Empty和null三者的区别(来源:网管之家bitsCN.com)
  15. 标准柯西分布_柯西分布设独立随机变量X和Y都服从标准正态 – 手机爱问
  16. VUE—下载安装并使用mint ui(图文详情)
  17. LaTex 表示 波浪线
  18. JSP中include的两种方法
  19. js - JavaScript
  20. 蓝桥杯 未名湖边的烦恼

热门文章

  1. ActiveMQ 权限
  2. Linux查看端口被那个进程占用
  3. WebApi系列(从.Net FrameWork 到 .Net Core)
  4. 《重构》-重新组织函数
  5. 高通要求欧盟取消12亿美元反垄断罚款,理由是……
  6. Spring boot 第一章 Spring发展历史
  7. resultset 代码复用
  8. MyBatis学习 之 七、mybatis各种数据库的批量修改
  9. Java ---学习笔记(泛型)
  10. JVM原理及调优--网页链接收藏