filter中的dispatcher解析
两种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>就好了。
filter中的dispatcher解析的更多相关文章
- 两种include方式及filter中的dispatcher解析
两种include方式 我自己写了一个original.jsp,另外有一个includedPage.jsp,我想在original.jsp中把includedPage.jsp引进来有两种方式: 1.& ...
- julia与python中的列表解析.jl
julia与python中的列表解析.jl #=julia与python中的列表解析.jl 2016年3月16日 07:30:47 codegay julia是一门很年轻的科学计算语言 julia文档 ...
- logstash 中配置GeoIP解析地理信息
logstash中配置的GeoIP的数据库解析ip了,这里是用了开源的ip数据源,用来分析客户端的ip归属地.官网在这里:MAXMIND 下载GeoLiteCity数据库 wget http://ge ...
- filter-mapping中的dispatcher使用
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGAAAAEJCAIAAABUr8bLAAAgAElEQVR4nO3dX2/bVoL3cb4h+WYnwN
- 解决在Filter中读取Request中的流后,后续controller或restful接口中无法获取流的问题
首先我们来描述一下在开发中遇到的问题,场景如下: 比如我们要拦截所有请求,获取请求中的某个参数,进行相应的逻辑处理:比如我要获取所有请求中的公共参数 token,clientVersion等等:这个时 ...
- JDK8中Stream使用解析
JDK8中Stream使用解析 现在谈及JDK8的新特新,已经说不上新了.本篇介绍的就是Stream和Lambda,说的Stream可不是JDK中的IO流,这里的Stream指的是处理集合的抽象概念『 ...
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
随机推荐
- App图标生成器的实现,附源码
背景 网上各种生成app图标的网站和工具,感觉还是用自己写的心里畅快点,所以花了1个小时自己写了个.按照网上给的图标尺寸规范把所有尺寸的都生成了. 建了一个讨论群,533838427.很明显是针对独立 ...
- bzoj 2002 LinkCutTree
我的第一道LCT题(居然1A,O(∩_∩)O哈哈~) 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 大概题意: 给一颗有根树,维护每个 ...
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
- Codeforces Beta Round #6 (Div. 2 Only) C. Alice, Bob and Chocolate 水题
C. Alice, Bob and Chocolate 题目连接: http://codeforces.com/contest/6/problem/C Description Alice and Bo ...
- 套题:Codeforces Round #194 (Div. 1) (2/5)
A. Secrets http://www.cnblogs.com/qscqesze/p/4528529.html B. Chips http://www.cnblogs.com/qscqesze/p ...
- iOS自定义全屏返回与tableView左划删除手势冲突解决
当自定义一个navigationController实现全屏右划返回时, 使用起来是不是很爽, 代码如下: - (void)viewDidLoad { [super viewDidLoad]; UIG ...
- cadence学习(1)常规封装的建立
1.建立焊盘. (1)首先要获得datasheet(或可用pcb matrix ipc-7531标准的可查询封装软件)中元器件的封装信息. (2)建立.pad文件.打开PCB Editor Utili ...
- Unity技术面试题
一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰 ...
- Unity 国际化 多语言设置
很多游戏中都有语言设置选项,NGUI插件中自带了国际化脚本,但是灵活性较低,而且目前项目是UGUI,以下是修改后,以便记录. Localization和NGUI中用法一样,挂在在一个不销毁的游戏物体上 ...
- Android开发中适配多种 ROM 的快捷方式是如何实现的?
在安卓开发中,要提高开发效率,掌握一些快捷方式是必不可少的,特别是对于android入门阶段的童鞋而言,非常重要.今天小编在安卓开发教程网站上,搜罗了一些常用的Android 适配多种 ROM 的快捷 ...