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 ...
随机推荐
- BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演
http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/5 ...
- [BZOJ 4719] 天天爱跑步
Link: BZOJ 4719 传送门 Solution: 感觉求LCA又有了新姿势啊:$Tarjan$离线$O(n+m)$ 每次递归返回时将子树和父节点合并,如果询问节点已访问过则LCA就是已合并的 ...
- python实现图片验证码
1 验证基础知识1.1 Python生成随机验证码,需要使用PIL模块. # 安装 pip3 install pillow 1.2 创建图片 from PIL import Image img = I ...
- 微信、小程序开发UI库--weui
一.weui可以开发微信内网页.微信小程序,二者使用的UI库不一样 1. 微信内网页样式文件为 .css文件 链接地址:https://weui.io/ weui-js库: weu ...
- Spring依赖检查
在Spring中,可以使用依赖检查功能,以确保所要求的属性可设置或者注入. 依赖检查模式 4个依赖检查支持的模式: none – 没有依赖检查,这是默认的模式. simple – 如果基本类型(int ...
- 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏
[案例一] 作者:老王 如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: <?php class Foo { funct ...
- APP H5页面显示优化
在开发移动端APP页面时,对各操作系统各种型号的手机进行适配是必须的.然鹅,上周在开发完一个落地页后,被测试给打了回来,其中列出了一个在我看来很小的问题:单击进入页面的时候,页面还没加载完的时候字体显 ...
- 微信公众平台——获取access_token、expires_in
微信公众平台——获取access_token.expires_in 在微信公众平台接口开发中,Access Token占据着重要地位,它相当于进入各种接口的邀请,拿到这个钥匙才拥有调用其他各种特殊接口 ...
- FeatureTable()
abstract long addFeature(Feature ...
- lua中遍历table的几种方式比较
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...