两种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>就好了。

最新文章

  1. HDU1039-Easier Done Than Said?(字符串处理)
  2. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结
  3. Hadoop学习3--安装ssh服务
  4. CodeForces 400
  5. jQuery.Deferred对象
  6. 第一次用Github desktop(mac)提交代码遇到的问题
  7. iOS 性能优化:Instruments
  8. TCP/IP capture/analysis tools in Unix/Linux
  9. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
  10. mysql的水平拆分和垂直拆分
  11. Leetcode 3——Palindrome Number(回文数)
  12. kubernetes系列08—service资源详解
  13. L1-Day15
  14. RSP小组——团队冲刺博客三
  15. 阿里云ECS相关
  16. Codeforces Round #539 (Div. 2) D 思维
  17. install kubernetes cluster k8s集群安装
  18. centos7配置lamp成功安装过
  19. 802.1X技术介绍
  20. android源码编译-Mac 10.11 xcode5.1.1

热门文章

  1. BZOJ2303 APIO2011方格染色
  2. 欧拉路小结 JZYZOJ1210 骑马修栅栏
  3. 基础知识(09) -- Spring 概述
  4. PAT甲级1076. Forwards on Weibo
  5. MongoDB基础学习(一) MongoDB概念解析
  6. 应该用H5编写APP还是用原生的呢?
  7. bosondata/chrome-prerender: Render JavaScript-rendered page as HTML/PDF/mhtml/png/jpeg using headless Chrome
  8. Buck converter uses low-side PWM IC
  9. NativeXml: A native Delphi XML parser and writer
  10. innodb_buffer_pool_size=30G