关闭

两种include方式及filter中的dispatcher解析

标签: filterhttpwebjava web互联网
872人阅读 评论(0) 收藏 举报
分类:

两种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.HttpJspBase
    implements 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 HttpServlet
  implements 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>就好了。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Shiro的两种配置方式

Apache Shiro是一款Java 安全框架,可以用于完成认证、授权、加密、会话管理、与Web集成、缓存等功能。根据官方文档,我这里列举出两种常用的配置方式,一是ini文件配置,二是spring ...
  • u013248535
  • u013248535
  • 2017-01-10 18:01
  • 1173

XML解析的两种方式:DOM方式和SAX方式

DOM:Document ObjectModel,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。 SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-D...
  • u012526194
  • u012526194
  • 2015-09-26 14:17
  • 3302

Java中实现多线程的两种方式之间的区别

【原文地址 点击打开链接】 原文地址:http://www.cnblogs.com/gw811/archive/2012/10/15/2724882.html  Java提供了线程类Thr...
  • wenyiqingnianiii
  • wenyiqingnianiii
  • 2016-10-04 15:09
  • 2726

filter中的dispatcher标签解析

一、forward和includeRequestDispatcher提供两个方法forward和include进行资源跳转。 不同的是,如果使用forward跳转则其后面的response输出则不会...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017-06-06 17:18
  • 574

JSP页面中两种页面include方式及其区别

JSP页面可以进行嵌套,嵌套有两种方法(静态的)与(动态的) 【准备知识】 JSP在首次执行时主要有以下几个步骤: 1、JSP代码翻译为Java代码; 2、Java代码便宜为class; 3...
  • love_you_99
  • love_you_99
  • 2012-10-28 21:30
  • 911

jsp中include的两种方式

转自:http://linhongyu.blog.51cto.com/6373370/1536114 觉得下面的图把这2个区别解释的很清楚!!!! JSP中include的两种方法 ...
  • qq736150416
  • qq736150416
  • 2017-01-05 16:48
  • 124

xml里filter-mapping中的dispatcher的使

  • 2010-01-28 16:18
  • 2KB
  • 下载

JavaWeb Filter 过滤器的机制 与使用 请求重定向与请求转发的区别 跳转过滤,过滤器dispatcher REQUEST与FORWARD区别

首先要清楚,过滤的是url 那么所有页面跳转url都会变吗?不会,比如请求转发,前前后后都是一个url 首先要弄清请求重定向与请求转发的区别; 举例来说有两个网页index.jsp 然后分别通过两...
  • evanxuhe
  • evanxuhe
  • 2017-07-20 15:07
  • 2624

java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFi

整合Struts2和spring时,出现以下错误: 严重: Exception starting filter struts2 java.lang.ClassNotFoundException...
  • Mm_LOVE_92
  • Mm_LOVE_92
  • 2017-05-08 09:31
  • 277

SSH web.xml里<filter-mapping>中的<dispatcher>意思

2.4版本的servlet规范在部属描述符中新增加了一个元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个元素中加入任意数目的,使得filter将会...
  • yuqinying112
  • yuqinying112
  • 2012-03-02 08:51
  • 3761
    个人资料
    • 访问:41037次
    • 积分:773
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:112篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论