java8 lambda表达式举例

 java  java8 lambda表达式举例已关闭评论
3月 052019
 

好文章, 转自:原文:https://blog.csdn.net/bitcarmanlee/article/details/70195403

Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 

之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。

1.替代匿名内部类
毫无疑问,lambda表达式用得最多的场合就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类!请看代码:

如果使用匿名内部类:

    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(“The old runable now is using!”);
            }
        }).start();
    }
如果使用lambda表达式:

    @Test
    public void runable() {
        new Thread(() -> System.out.println(“It’s a lambda function!”)).start();
    }

最后的输出:

The old runable now is using!
It’s a lambda function!
是不是强大到可怕?是不是简单到可怕?是不是清晰明了重点突出到可怕?这就是lambda表达式的可怕之处,用极少的代码完成了之前一个类做的事情!

2.使用lambda表达式对集合进行迭代
Java的集合类是日常开发中经常用到的,甚至说没有哪个java代码中没有使用到集合类。。。而对集合类最常见的操作就是进行迭代遍历了。请看对比:

    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList(“java”,”scala”,”python”);
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }
如果熟悉scala的同学,肯定对forEach不陌生。它可以迭代集合中所有的对象,并且将lambda表达式带入其中。

languages.forEach(System.out::println);

这一行看起来有点像c++里面作用域解析的写法,在这里也是可以的。

3.用lambda表达式实现map
一提到函数式编程,一提到lambda表达式,怎么能不提map。。。没错,java8肯定也是支持的。请看示例代码:

    @Test
    public void mapTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }
最后的输出结果:

10.5
21.0
31.5
1
2
3
map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。

4.用lambda表达式实现map与reduce
既然提到了map,又怎能不提到reduce。reduce与map一样,也是函数式编程里最重要的几个方法之一。。。map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个,请看:

    @Test
    public void mapReduceTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }
最终的结果为:

63.0
1
如果我们用for循环来做这件事情:

    @Test
    public void sumTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }
相信用map+reduce+lambda表达式的写法高出不止一个level。

5.filter操作
filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。

    @Test
    public void filterTest() {
        List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }
最后的结果:

30.0
40.0
1
2
将java写出了python或者scala的感觉有没有!是不是帅到爆!

6.与函数式接口Predicate配合
除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。Predicate接口非常适用于做过滤。

    public static void filterTest(List<String> languages, Predicate<String> condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + ” “));
    }

    public static void main(String[] args) {
        List<String> languages = Arrays.asList(“Java”,”Python”,”scala”,”Shell”,”R”);
        System.out.println(“Language starts with J: “);
        filterTest(languages,x -> x.startsWith(“J”));
        System.out.println(“\nLanguage ends with a: “);
        filterTest(languages,x -> x.endsWith(“a”));
        System.out.println(“\nAll languages: “);
        filterTest(languages,x -> true);
        System.out.println(“\nNo languages: “);
        filterTest(languages,x -> false);
        System.out.println(“\nLanguage length bigger three: “);
        filterTest(languages,x -> x.length() > 4);
    }
最后的输出结果:

Language starts with J: 
Java 

Language ends with a: 
Java 
scala 

All languages: 
Java 
Python 
scala 
Shell 

No languages: 

Language length bigger three: 
Python 
scala 
Shell 
可以看到,Stream API的过滤方法也接受一个Predicate,这意味着可以将我们定制的 filter() 方法替换成写在里面的内联代码,这也是lambda表达式的魔力!

SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

 spring  SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系已关闭评论
5月 162018
 

SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系,挺不错的一篇文章,分享下https://blog.csdn.net/xiaoyaotan_111/article/details/53817918

一 简介

(1)过滤器:

依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

(2)拦截器:

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

二 多个过滤器与拦截器的代码执行顺序

如果在一个项目中仅仅只有一个拦截器或者过滤器,那么我相信相对来说理解起来是比较容易的。但是我们是否思考过:如果一个项目中有多个拦截器或者过滤器,那么它们的执行顺序应该是什么样的?或者再复杂点,一个项目中既有多个拦截器,又有多个过滤器,这时它们的执行顺序又是什么样的呢?

下面我将用简单的代码来测试说明:

(1)先定义两个过滤器:

i)过滤器1:

[java] view plain copy

  1. package cn.zifangsky.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.FilterChain;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.springframework.web.filter.OncePerRequestFilter;  
  11.   
  12. public class TestFilter1 extends OncePerRequestFilter {  
  13.   
  14.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)  
  15.             throws ServletException, IOException {  
  16.         //在DispatcherServlet之前执行  
  17.         <a href=“http://www.07net01.com/tags-system-0.html” class=“infotextkey” style=“background:transparent;color:rgb(66,139,202);” target=“_blank”>system</a>.out.println(“############TestFilter1 doFilterInternal executed############”);  
  18.         filterChain.doFilter(request, response);  
  19.         //在视图页面返回给<a href=”http://www.07net01.com/tags-%E5%AE%A2%E6%88%B7%E7%AB%AF-0.html” class=”infotextkey” style=”background:transparent;color:rgb(66,139,202);” target=”_blank”>客户端</a>之前执行,但是执行顺序在Interceptor之后  
  20.         System.out.println(“############TestFilter1 doFilter after############”);  
  21. //      try {  
  22. //          Thread.sleep(10000);  
  23. //      } catch (InterruptedException e) {  
  24. //          e.printStackTrace();  
  25. //      }  
  26.     }  
  27.   
  28. }  

ii)过滤器2:

[java] view plain copy

  1. package cn.zifangsky.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.FilterChain;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.springframework.web.filter.OncePerRequestFilter;  
  11.   
  12. public class TestFilter2 extends OncePerRequestFilter {  
  13.   
  14.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)  
  15.             throws ServletException, IOException {  
  16.         System.out.println(“############TestFilter2 doFilterInternal executed############”);  
  17.         filterChain.doFilter(request, response);  
  18.         System.out.println(“############TestFilter2 doFilter after############”);  
  19.   
  20.     }  
  21.   
  22. }  

iii)在web.xml中注册这两个过滤器:

[xml] view plain copy

  1.     <!– 自定义过滤器:testFilter1 –>   
  2.    <filter>  
  3.         <filter-name>testFilter1</filter-name>  
  4.         <filter-class>cn.zifangsky.filter.TestFilter1</filter-class>  
  5.     </filter>  
  6.     <filter-mapping>  
  7.         <filter-name>testFilter1</filter-name>  
  8.         <url-pattern>/*</url-pattern>  
  9.     </filter-mapping>  
  10.     <!– 自定义过滤器:testFilter2 –>   
  11.    <filter>  
  12.         <filter-name>testFilter2</filter-name>  
  13.         <filter-class>cn.zifangsky.filter.TestFilter2</filter-class>  
  14.     </filter>  
  15.     <filter-mapping>  
  16.         <filter-name>testFilter2</filter-name>  
  17.         <url-pattern>/*</url-pattern>  
  18.     </filter-mapping>  

(2)再定义两个拦截器:

i)拦截器1,基本拦截器:

[java] view plain copy

  1. package cn.zifangsky.interceptor;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.HandlerInterceptor;  
  7. import org.springframework.web.servlet.ModelAndView;  
  8.   
  9. public class BaseInterceptor implements HandlerInterceptor{  
  10.       
  11.     /** 
  12.      * 在DispatcherServlet之前执行 
  13.      * */  
  14.     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {  
  15.         System.out.println(“************BaseInterceptor preHandle executed**********”);  
  16.         return true;  
  17.     }  
  18.   
  19.     /** 
  20.      * 在controller执行之后的DispatcherServlet之后执行 
  21.      * */  
  22.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)  
  23.             throws Exception {  
  24.         System.out.println(“************BaseInterceptor postHandle executed**********”);  
  25.     }  
  26.       
  27.     /** 
  28.      * 在页面渲染完成返回给客户端之前执行 
  29.      * */  
  30.     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)  
  31.             throws Exception {  
  32.         System.out.println(“************BaseInterceptor afterCompletion executed**********”);  
  33. //      Thread.sleep(10000);  
  34.     }  
  35.   
  36. }  

ii)指定controller请求的拦截器:

[java] view plain copy

  1. package cn.zifangsky.interceptor;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.HandlerInterceptor;  
  7. import org.springframework.web.servlet.ModelAndView;  
  8.   
  9. public class TestInterceptor implements HandlerInterceptor {  
  10.   
  11.     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {  
  12.         System.out.println(“************TestInterceptor preHandle executed**********”);  
  13.         return true;  
  14.     }  
  15.   
  16.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)  
  17.             throws Exception {  
  18.         System.out.println(“************TestInterceptor postHandle executed**********”);  
  19.     }  
  20.   
  21.     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)  
  22.             throws Exception {  
  23.         System.out.println(“************TestInterceptor afterCompletion executed**********”);  
  24.     }  
  25. }  

iii)在SpringMVC的配置文件中注册这两个拦截器:

[java] view plain copy

  1. <!– 拦截器 –>  
  2. nbsp;   <mvc:interceptors>  
  3.     <!– 对所有请求都拦截,公共拦截器可以有多个 –>  
  4.     <bean name=“baseInterceptor” class=“cn.zifangsky.interceptor.BaseInterceptor” />  
  5.     <!– <bean name=“testInterceptor” class=“cn.zifangsky.interceptor.TestInterceptor” /> –>  
  6.     <mvc:interceptor>       
  7.         <!– 对/test.html进行拦截 –>  
  8.         <mvc:mapping path=“/test.html”/>  
  9.         <!– 特定请求的拦截器只能有一个 –>  
  10.         <bean class=“cn.zifangsky.interceptor.TestInterceptor” />  
  11.     </mvc:interceptor>  
  12. </mvc:interceptors>  

(3)定义一个测试使用的controller:

[java] view plain copy

  1. package cn.zifangsky.controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.servlet.ModelAndView;  
  6.   
  7. @Controller  
  8. public class TestController {  
  9.       
  10.     @RequestMapping(“/test.html”)  
  11.     public ModelAndView handleRequest(){  
  12.         System.out.println(“———TestController executed——–“);  
  13.         return new ModelAndView(“test”);  
  14.     }  
  15. }  

(4)视图页面test.jsp:

[html] view plain copy

  1. <%@ page language=“java” contentType=“text/html; charset=UTF-8”  
  2.     pageEncoding=“UTF-8”%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;  
  6. %>      
  7. <html>  
  8. <head>  
  9. <meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>  
  10. <base href=“http://983836259.blog.51cto.com/7311475/”>  
  11. <title>FilterDemo</title>  
  12. </head>  
  13. <body>  
  14.     <%  
  15.         System.out.println(“test.jsp is loading”);  
  16.     %>  
  17.     <div align=“center”>  
  18.         This is test page  
  19.     </div>  
  20. </body>  
  21. </html>  

(5)测试效果:

启动此测试项目,可以看到控制台中输出如下:

wKioL1hHhYrRCpQYAABafsYR7go378.png

这就说明了过滤器的运行是依赖于servlet容器的,跟springmvc等框架并没有关系。并且,多个过滤器的执行顺序跟xml文件中定义的先后关系有关

接着清空控制台中的输出内容并访问:http://localhost:9180/FilterDemo/test.html

可以看到,此时的控制台输出结果如下:

wKiom1hHhaPRQuBxAACG4WdOJbM758.png

相信从这个打印输出,大家就可以很清晰地看到有多个拦截器和过滤器存在时的整个执行顺序了。当然,对于过个拦截器它们之间的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关

注:对于整个SpringMVC的执行流程来说,如果加上上面的拦截器和过滤器,其最终的执行流程就如下图所示:

wKiom1hHhbmxseDtAACidU9Y84s787.png

servlet, spring, filter, listenr执行顺序

 java, spring  servlet, spring, filter, listenr执行顺序已关闭评论
11月 282016
 

web.xml 文件中一般包括 servlet, spring, filter, listenr的配置。那么他们是按照一个什么顺序加载呢?

加载顺序会影响对spring bean 的调用。

    比如filter 需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null;

首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关。

web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet

最终得出结果:先 listener >> filter >> servlet >>  spring 

 所以,如果过滤器中要使用到 bean,可以将spring 的加载 改成 Listener的方式

<listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

 搞定!

 

 

 

 关于他们的内部执行顺序,也需要注意,如下遇到的乱码问题

web.xml的filter执行顺序导致的乱码,切记!
发现引起bug的原因是web.xml的下面几行:
    <filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
根据servlet2.3规范filter执行是按照web.xml配置的filter-mapping先后顺序进行执行,所以上面的配置会导致遇见*.do的url请求,先进行SecurityFilter的过滤器处理,这时候没有做编码处理,已经是乱码,到下面的filter处理时已经时乱码,再做编码处理已经没有用处。
修正方式,调整filter-mapping顺序,如下:
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

filter和interceptor拦截器区别及执行顺序

 spring  filter和interceptor拦截器区别及执行顺序已关闭评论
3月 112015
 

拦截器与Filter的区别 
Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。
深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。

 

实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。 

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。  

JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。 
所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。 
当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。
 

3.servlet、filter、interceptor的执行顺序


f84cb2fe-e9bc-30f9-923a-260e77ae221e
    Filter代码:

Java代码  收藏代码

  1. @Override  
  2.     public void doFilter(ServletRequest servletrequest,  
  3.             ServletResponse servletresponse, FilterChain filterchain)  
  4.             throws IOException, ServletException {  
  5.         System.out.println(“in  filter 1.”);  
  6.         filterchain.doFilter(servletrequest, servletresponse);  
  7.         System.out.println(“outing filter 1”);  
  8.     }  

 

 

   interceptor代码:
    @Override

Java代码  收藏代码

  1. public String intercept(ActionInvocation actioninvocation) throws Exception {  
  2.     System.out.println(“in logininterceptor”);  
  3.     String result=actioninvocation.invoke();  
  4.     System.out.println(“outing logininterceptor”);  
  5.     return result;  
  6. }  

 
    action代码:

Java代码  收藏代码

  1. @Override    
  2.    public String execute() throws Exception {    
  3.        System.out.println(“in loginaciton”);  
  4.        ActionContext context=ActionContext.getContext();  
  5.        Map<String, Object> session=context.getSession();   
  6.        session.put(“userName”, userName);    
  7.          
  8.       /* HttpServletRequest request = ServletActionContext. getRequest(); 
  9.        HttpSession session = request.getSession(); 
  10.        session.putValue(“userName”, userName);*/  
  11.        System.out.println(“outing loginaciton”);  
  12.        return SUCCESS;    
  13.    }   

 
      
   jsp代码:

Html代码  收藏代码

  1.  <script type=“text/javascript”>     
Html代码  收藏代码

  1. function submitForm(){  
  2.       document.getElementById(“form1”).submit();   
  3.    }  
  4. </script>  
  5.   
  6.  </head>  
  7.    
  8.  <body>  
  9.    This is Login page. <br>  
  10.    <form action=“<%=path %>/login2.action” method=“post” id=“form1” name=“form1”>  
  11.       UserName:<input type=“text” id=“userName” name=“userName”/><input type=“button” value=“submit” onclick=“submitForm()” id=“submit1” />  
  12.    </form>  
  13.  </body>  

 


   struts.xml

Xml代码  收藏代码

  1.  <struts>  
Xml代码  收藏代码

  1. <package name=“default” extends=“struts-default” namespace=“/”>    
  2.            
  3.          <interceptors>  
  4.             <interceptor name=“MyInterceptor” class=“Login.LoginInterceptor”></interceptor>  
  5.                 <interceptor-stack name=“myInterceptorStack”>  
  6.                     <interceptor-ref name=“MyInterceptor”/>  
  7.                     <interceptor-ref name=“defaultStack”/>  
  8.                 </interceptor-stack>  
  9.         </interceptors>  
  10.            
  11.             <action name=“login2” class=“Login.LoginAction”>    
  12.                 <result name=“success”>    
  13.                    /Login/success.jsp    
  14.                 </result>  
  15.                 <interceptor-ref name=“myInterceptorStack”></interceptor-ref>  
  16.             </action>    
  17.    
  18.         </package>  
  19.     </struts>  

 
    
console:
in  filter 1.
in logininterceptor
in loginaciton
outing loginaciton
outing logininterceptor
outing filter 1

 

3.servlet、filter的执行顺序

servlet代码:

Java代码  收藏代码

  1. public void init() throws ServletException {   
  2.     System.out.println(“servlet初始化”);  
  3.   }   

  

Java代码  收藏代码

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)          
Java代码  收藏代码

  1. throws ServletException, IOException {   
  2.       System.out.println(“in servlet”);  
  3.     response.setContentType(“text/html”);   
  4.     PrintWriter out = response.getWriter();   
  5.     out   
  6.         .println(“<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>”);   
  7.     out.println(“<HTML>”);   
  8.     out.println(”    <HEAD><TITLE>A Servlet</TITLE></HEAD>”);   
  9.     out.println(”    <BODY>”);   
  10.     out.print(”        This is “);   
  11.     out.print(this.getClass());   
  12.     out.println(“, using the POST method”);        
  13.        
  14.     out.println(“<br>”);   
  15.     String x = request.getParameter(“x”);   
  16.     String y = request.getParameter(“y”);   
  17.     out.println(“x=”+x);   
  18.     out.println(“<br>”);   
  19.     out.println(“y=”+y);   
  20.     out.println(“<br>”);   
  21.        
  22.     out.println(”    </BODY>”);   
  23.     out.println(“</HTML>”);   
  24.     out.flush();   
  25.     out.close();   
  26.     System.out.println(“outing servlet”);  
  27.   }   

 

Java代码  收藏代码

  1. public void destroy(){        
Java代码  收藏代码

  1. System.out.println(“servlet销毁”);  
  2.         super.destroy();  
  3.     }  

 console:

servlet初始化

in  filter 1.

in servlet

before HttpServletRequest

after HttpServletRequest

outing servlet

outing filter 1

当tomcat容器停止的时候,输出:servlet销毁

转自:http://listenup.iteye.com/blog/1559553

web.xml 中的listener、 filter、servlet 加载顺序及其详解

 java  web.xml 中的listener、 filter、servlet 加载顺序及其详解已关闭评论
11月 202014
 

网上找到的关于listener、 filter、servlet加载顺序的文章,供参考:

 加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filter -> servlet

        同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet

        对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。

        servlet 同 filter 类似,此处不再赘述。

       由此,可以看出,web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

 

web.xml文件详解

Xml代码  收藏代码

  1. Web.xml常用元素   
  2. <web-app>   
  3. <display-name></display-name>定义了WEB应用的名字   
  4. <description></description> 声明WEB应用的描述信息   
  5.   
  6. <context-param></context-param> context-param元素声明应用范围内的初始化参数。   
  7. <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。   
  8. <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。   
  9. <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。   
  10.                      Listener元素指出事件监听程序类。   
  11. <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。   
  12. <servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。   
  13.               但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。   
  14.   
  15. <session-config></session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。   
  16.           可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。   
  17.   
  18. <mime-mapping></mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。   
  19. <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。   
  20. <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。   
  21. <taglib></taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,   
  22.                   而不用编辑使用这些文件的JSP页面。   
  23. <resource-env-ref></resource-env-ref>声明与资源相关的一个管理对象。   
  24. <resource-ref></resource-ref> 声明一个资源工厂使用的外部资源。   
  25. <security-constraint></security-constraint> 制定应该保护的URL。它与login-config元素联合使用   
  26. <login-config></login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。   
  27. <security-role></security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素   
  28.                    的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。   
  29. <env-entry></env-entry>声明Web应用的环境项。   
  30. <ejb-ref></ejb-ref>声明一个EJB的主目录的引用。   
  31. < ejb-local-ref></ ejb-local-ref>声明一个EJB的本地主目录的应用。   
  32. </web-app>   
  33.   
  34.   
  35. 相应元素配置   
  36.   
  37. 1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标   
  38. <icon>   
  39. <small-icon>/images/app_small.gif</small-icon>   
  40. <large-icon>/images/app_large.gif</large-icon>   
  41. </icon>   
  42. 2、Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称   
  43. <display-name>Tomcat Example</display-name>   
  44. 3、Web 应用描述: 给出于此相关的说明性文本   
  45. <disciption>Tomcat Example servlets and JSP pages.</disciption>   
  46. 4、上下文参数:声明应用范围内的初始化参数。   
  47.   <context-param>   
  48.     <param-name>ContextParameter</para-name>   
  49.     <param-value>test</param-value>   
  50.     <description>It is a test parameter.</description>   
  51.   </context-param>   
  52.   在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到   
  53.   
  54. 5、过滤器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。   
  55.   <filter>   
  56.         <filter-name>setCharacterEncoding</filter-name>   
  57.         <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>   
  58.         <init-param>   
  59.             <param-name>encoding</param-name>   
  60.             <param-value>GB2312</param-value>   
  61.         </init-param>   
  62.   </filter>   
  63.   <filter-mapping>   
  64.         <filter-name>setCharacterEncoding</filter-name>   
  65.         <url-pattern>/*</url-pattern>   
  66.   </filter-mapping>   
  67. 6、监听器配置   
  68.   <listener>   
  69.       <listerner-class>listener.SessionListener</listener-class>   
  70.   </listener>   
  71. 7、Servlet配置   
  72.    基本配置   
  73.    <servlet>   
  74.       <servlet-name>snoop</servlet-name>   
  75.       <servlet-class>SnoopServlet</servlet-class>   
  76.    </servlet>   
  77.    <servlet-mapping>   
  78.       <servlet-name>snoop</servlet-name>   
  79.       <url-pattern>/snoop</url-pattern>   
  80.    </servlet-mapping>   
  81.    高级配置   
  82.    <servlet>   
  83.       <servlet-name>snoop</servlet-name>   
  84.       <servlet-class>SnoopServlet</servlet-class>   
  85.       <init-param>   
  86.          <param-name>foo</param-name>   
  87.          <param-value>bar</param-value>   
  88.       </init-param>   
  89.       <run-as>   
  90.          <description>Security role for anonymous access</description>   
  91.          <role-name>tomcat</role-name>   
  92.       </run-as>   
  93.    </servlet>   
  94.    <servlet-mapping>   
  95.       <servlet-name>snoop</servlet-name>   
  96.       <url-pattern>/snoop</url-pattern>   
  97.    </servlet-mapping>   
  98.    元素说明   
  99.      <servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:   
  100.      <servlet-name></servlet-name> 指定servlet的名称   
  101.      <servlet-class></servlet-class> 指定servlet的类名称   
  102.      <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径   
  103.      <init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数   
  104.      <load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。   
  105.                                  当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.   
  106.                                  当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它   
  107.      <servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素   
  108.        <servlet-name></servlet-name> 指定servlet的名称   
  109.        <url-pattern></url-pattern> 指定servlet所对应的URL   
  110. 8、会话超时配置(单位为分钟)   
  111.    <session-config>   
  112.       <session-timeout>120</session-timeout>   
  113.    </session-config>   
  114. 9、MIME类型配置   
  115.    <mime-mapping>   
  116.       <extension>htm</extension>   
  117.       <mime-type>text/html</mime-type>   
  118.    </mime-mapping>   
  119. 10、指定欢迎文件页配置   
  120.    <welcome-file-list>   
  121.       <welcome-file>index.jsp</welcome-file>   
  122.       <welcome-file>index.html</welcome-file>   
  123.       <welcome-file>index.htm</welcome-file>   
  124.    </welcome-file-list>   
  125. 11、配置错误页面   
  126.   一、 通过错误码来配置error-page   
  127.    <error-page>   
  128.       <error-code>404</error-code>   
  129.       <location>/NotFound.jsp</location>   
  130.    </error-page>   
  131.   上面配置了当系统发生404错误时,跳转到错误处理页面NotFound.jsp。   
  132. 二、通过异常的类型配置error-page   
  133.    <error-page>   
  134.        <exception-type>java.lang.NullException</exception-type>   
  135.        <location>/error.jsp</location>   
  136.    </error-page>   
  137.   上面配置了当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp   
  138. 12、TLD配置   
  139.    <taglib>   
  140.        <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri>   
  141.        <taglib-location>/WEB-INF/jsp/debug-taglib.tld</taglib-location>   
  142.    </taglib>   
  143.    如果MyEclipse一直在报错,应该把<taglib> 放到 <jsp-config>中   
  144.    <jsp-config>   
  145.       <taglib>   
  146.           <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri>   
  147.           <taglib-location>/WEB-INF/pager-taglib.tld</taglib-location>   
  148.       </taglib>   
  149.    </jsp-config>   
  150. 13、资源管理对象配置   
  151.    <resource-env-ref>   
  152.        <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>   
  153.    </resource-env-ref>   
  154. 14、资源工厂配置   
  155.    <resource-ref>   
  156.        <res-ref-name>mail/Session</res-ref-name>   
  157.        <res-type>javax.mail.Session</res-type>   
  158.        <res-auth>Container</res-auth>   
  159.    </resource-ref>   
  160.    配置数据库连接池就可在此配置:   
  161.    <resource-ref>   
  162.        <description>JNDI JDBC DataSource of shop</description>   
  163.        <res-ref-name>jdbc/sample_db</res-ref-name>   
  164.        <res-type>javax.sql.DataSource</res-type>   
  165.        <res-auth>Container</res-auth>   
  166.    </resource-ref>   
  167. 15、安全限制配置   
  168.    <security-constraint>   
  169.       <display-name>Example Security Constraint</display-name>   
  170.       <web-resource-collection>   
  171.          <web-resource-name>Protected Area</web-resource-name>   
  172.          <url-pattern>/jsp/security/protected/*</url-pattern>   
  173.          <http-method>DELETE</http-method>   
  174.          <http-method>GET</http-method>   
  175.          <http-method>POST</http-method>   
  176.          <http-method>PUT</http-method>   
  177.       </web-resource-collection>   
  178.       <auth-constraint>   
  179.         <role-name>tomcat</role-name>   
  180.         <role-name>role1</role-name>   
  181.       </auth-constraint>   
  182.    </security-constraint>   
  183. 16、登陆验证配置   
  184.    <login-config>   
  185.      <auth-method>FORM</auth-method>   
  186.      <realm-name>Example-Based Authentiation Area</realm-name>   
  187.      <form-login-config>   
  188.         <form-login-page>/jsp/security/protected/login.jsp</form-login-page>   
  189.         <form-error-page>/jsp/security/protected/error.jsp</form-error-page>   
  190.      </form-login-config>   
  191.    </login-config>   
  192. 17、安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。   
  193.     分别地声明角色可使高级IDE处理安全信息更为容易。   
  194.   <security-role>   
  195.      <role-name>tomcat</role-name>   
  196.   </security-role>   
  197. 18、Web环境参数:env-entry元素声明Web应用的环境项   
  198.   <env-entry>   
  199.      <env-entry-name>minExemptions</env-entry-name>   
  200.      <env-entry-value>1</env-entry-value>   
  201.      <env-entry-type>java.lang.Integer</env-entry-type>   
  202.   </env-entry>   
  203. 19、EJB 声明   
  204.   <ejb-ref>   
  205.      <description>Example EJB reference</decription>   
  206.      <ejb-ref-name>ejb/Account</ejb-ref-name>   
  207.      <ejb-ref-type>Entity</ejb-ref-type>   
  208.      <home>com.mycompany.mypackage.AccountHome</home>   
  209.      <remote>com.mycompany.mypackage.Account</remote>   
  210.   </ejb-ref>   
  211. 20、本地EJB声明   
  212.   <ejb-local-ref>   
  213.      <description>Example Loacal EJB reference</decription>   
  214.      <ejb-ref-name>ejb/ProcessOrder</ejb-ref-name>   
  215.      <ejb-ref-type>Session</ejb-ref-type>   
  216.      <local-home>com.mycompany.mypackage.ProcessOrderHome</local-home>   
  217.      <local>com.mycompany.mypackage.ProcessOrder</local>   
  218.   </ejb-local-ref>   
  219. 21、配置DWR   
  220.   <servlet>   
  221.       <servlet-name>dwr-invoker</servlet-name>   
  222.       <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>   
  223.   </servlet>   
  224.   <servlet-mapping>   
  225.       <servlet-name>dwr-invoker</servlet-name>   
  226.       <url-pattern>/dwr/*</url-pattern>   
  227.   </servlet-mapping>   
  228. 22、配置Struts   
  229.     <display-name>Struts Blank Application</display-name>   
  230.     <servlet>   
  231.         <servlet-name>action</servlet-name>   
  232.         <servlet-class>   
  233.             org.apache.struts.action.ActionServlet   
  234.         </servlet-class>   
  235.         <init-param>   
  236.             <param-name>detail</param-name>   
  237.             <param-value>2</param-value>   
  238.         </init-param>   
  239.         <init-param>   
  240.             <param-name>debug</param-name>   
  241.             <param-value>2</param-value>   
  242.         </init-param>   
  243.         <init-param>   
  244.             <param-name>config</param-name>   
  245.             <param-value>/WEB-INF/struts-config.xml</param-value>   
  246.         </init-param>   
  247.         <init-param>   
  248.             <param-name>application</param-name>   
  249.             <param-value>ApplicationResources</param-value>   
  250.         </init-param>   
  251.         <load-on-startup>2</load-on-startup>   
  252.     </servlet>   
  253.     <servlet-mapping>   
  254.         <servlet-name>action</servlet-name>   
  255.         <url-pattern>*.do</url-pattern>   
  256.     </servlet-mapping>   
  257.     <welcome-file-list>   
  258.         <welcome-file>index.jsp</welcome-file>   
  259.     </welcome-file-list>   
  260.   
  261.     <!– Struts Tag Library Descriptors –>   
  262.     <taglib>   
  263.         <taglib-uri>struts-bean</taglib-uri>   
  264.         <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>   
  265.     </taglib>   
  266.     <taglib>   
  267.         <taglib-uri>struts-html</taglib-uri>   
  268.         <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>   
  269.     </taglib>   
  270.     <taglib>   
  271.     <taglib-uri>struts-nested</taglib-uri>   
  272.     <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>   
  273.     </taglib>   
  274.     <taglib>   
  275.         <taglib-uri>struts-logic</taglib-uri>   
  276.         <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>   
  277.     </taglib>   
  278.     <taglib>   
  279.         <taglib-uri>struts-tiles</taglib-uri>   
  280.         <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>   
  281.     </taglib>   
  282. 23、配置Spring(基本上都是在Struts中配置的)   
  283.   
  284.    <!– 指定spring配置文件位置 –>   
  285.    <context-param>   
  286.       <param-name>contextConfigLocation</param-name>   
  287.       <param-value>   
  288.        <!–加载多个spring配置文件 –>   
  289.         /WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml   
  290.       </param-value>   
  291.    </context-param>   
  292.   
  293.    <!– 定义SPRING监听器,加载spring –>   
  294.   
  295.   <listener>   
  296.      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
  297.   </listener>   
  298.   
  299.   <listener>   
  300.      <listener-class>   
  301.        org.springframework.web.context.request.RequestContextListener   
  302.      </listener-class>   
  303.   </listener>   

 

Java中Filter、Servlet、Listener的学习

 java  Java中Filter、Servlet、Listener的学习已关闭评论
11月 112014
 

网上找到的一篇文章讲解Filter、servlet、Listener,分享下

1、Filter的功能
filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

一个Filter包括:

1)、在servlet被调用之前截获;

2)、在servlet被调用之前检查servlet request;

3)、根据需要修改request头和request数据;

4)、根据需要修改response头和response数据;

5)、在servlet被调用之后截获.

 服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结。

每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter

例子:

首先新建一个Filter

[java] view plaincopy

  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.filter;  
  5.   
  6. import java.io.IOException;  
  7.   
  8. import javax.servlet.Filter;  
  9. import javax.servlet.FilterChain;  
  10. import javax.servlet.FilterConfig;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletRequest;  
  13. import javax.servlet.ServletResponse;  
  14.   
  15. /** 
  16.  * @author Administrator 
  17.  * 
  18.  */  
  19. public class LogFilter implements Filter {  
  20.     private FilterConfig filterConfig;  
  21.   
  22.     public FilterConfig getFilterConfig() {  
  23.         System.err.println(“…getFilterConfig…”);  
  24.         return filterConfig;  
  25.     }  
  26.   
  27.     public void setFilterConfig(FilterConfig filterConfig) {  
  28.         System.err.println(“…setFilterConfig…”);  
  29.         this.filterConfig = filterConfig;  
  30.     }  
  31.   
  32.     /* (non-Javadoc) 
  33.      * @see javax.servlet.Filter#destroy() 
  34.      */  
  35.     @Override  
  36.     public void destroy() {  
  37.         System.err.println(“…filter destroy…”);  
  38.     }  
  39.   
  40.     /* (non-Javadoc) 
  41.      * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  42.      */  
  43.     @Override  
  44.     public void doFilter(ServletRequest request, ServletResponse response,  
  45.             FilterChain chain) throws IOException, ServletException {  
  46.         System.err.println(“…doFilter…”);  
  47.         chain.doFilter(request, response);//看到这没,这只要是传递下一个Filter  
  48.     }  
  49.   
  50.     /* (non-Javadoc) 
  51.      * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  52.      */  
  53.     @Override  
  54.     public void init(FilterConfig filterConfig) throws ServletException {  
  55.         System.err.println(“…init Filter…”);  
  56.         this.filterConfig = filterConfig;  
  57.     }  
  58.   
  59. }  


在web.xml里配置

[html] view plaincopy

  1. <filter>  
  2.     <filter-name>LogFilter</filter-name>  
  3.     <filter-class>com.ee.filter.LogFilter</filter-class>  
  4. </filter>  
  5.   
  6. <filter-mapping>  
  7.     <filter-name>LogFilter</filter-name>  
  8.     <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  


启动运行

可以看到…init Filter…首先在TOMCAT启动时即被打印,然后在运行里面再看到…doFilter…被打印。

 

2、servlet功能

1.Servlet 是什么?
Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的 Java 程序。除了 Java Servlet API,Servlet 还可以使用用以扩展和添加到 API 的 Java 类软件包。Servlet 在启用 Java 的 Web 服务器上或应用服务器上运行并扩展了该服务器的能力。Java servlet对于Web服务器就好象Java applet对于Web浏览器。Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。Java Servlet API 定义了一个servlet 和Java使能的服务器之间的一个标准接口,这使得Servlets具有跨服务器平台的特性。
Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet。装入后, Servlet 继续运行直到其它客户机发出请求。Servlet 的功能涉及范围很广。例如,Servlet 可完成如下功能:
(1) 创建并返回一个包含基于客户请求性质的动态内容的完整的 HTML页面。
(2) 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面(HTML 片段)。
(3) 与其它服务器资源(包括数据库和基于 Java 的应用程序)进行通信。
(4) 用多个客户机处理连接,接收多个客户机的输入,并将结果广播到多个客户机上。例如,Servlet 可以是多参与者的游戏服务器。
(5) 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连
接保持在打开状态。当允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如 IIOP)进行通信。
(6) 对特殊的处理采用 MIME 类型过滤数据,例如图像转换和服务器端包括(SSI)。
(7) 将定制的处理提供给所有服务器的标准例行程序。例如,Servlet 可以修改如何认证用户。
2.Servlet 的生命周期
Servlet 的生命周期始于将它装入 Web 服务器的内存时,并在终止或重新装入 Servlet 时结束。

(1) 初始化
在下列时刻装入 Servlet:
如果已配置自动装入选项,则在启动服务器时自动装入
在服务器启动后,客户机首次向 Servlet 发出请求时
重新装入 Servlet 时装入 Servlet 后,服务器创建一个 Servlet 实例并且调用 Servlet 的 init() 方法。在初始化阶段,Servlet 初始化参数被传递给 Servlet 配置对象。
(2) 请求处理
对于到达服务器的客户机请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。服务器调用 Servlet 的 service() 方法,该方法用于传递“请求”和“响应”对象。service() 方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。service() 方法可以调用其它方法来处理请求,例如 doGet()、doPost() 或其它的方法。
(3) 终止
当服务器不再需要 Servlet, 或重新装入 Servlet 的新实例时,服务器会调用 Servlet 的 destroy() 方法。
3. Java Servlet API
Java Servlet 开发工具(JSDK)提供了多个软件包,在编写 Servlet 时需要用到这些软件包。其中包括两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http。可从sun公司的Web站点下载 Java Servlet 开发工具。 下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。
HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM> 和 </FORM> 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。
(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
Servlet的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。
(3) destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。
(4) GetServletConfig()方法
GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和  ServletContext。ServletContext 接口提供有关servlet 的环境信息。
(5) GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。
当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 “请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通信途径。javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用“请求”对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用“响应”对象的方法发送响应,该响应是准备发回客户机的。

 

例子:

创建一个servlet

[java] view plaincopy

  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.servlet;  
  5.   
  6. import java.io.IOException;  
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. /** 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class LogServlet extends HttpServlet {  
  18.   
  19.     /** 
  20.      *  
  21.      */  
  22.     private static final long serialVersionUID = 1L;  
  23.   
  24.     @Override  
  25.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  26.             throws ServletException, IOException {  
  27.         doPost(req, resp);  
  28.     }  
  29.       
  30.     @Override  
  31.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  32.             throws ServletException, IOException {  
  33.         System.err.println(“…doPost(req, resp)…”);  
  34.     }  
  35. }  


在web.xml中的配置:

[html] view plaincopy

  1. <servlet>  
  2.     <servlet-name>LogServlet</servlet-name>  
  3.     <servlet-class>com.ee.servlet.LogServlet</servlet-class>  
  4. </servlet>  
  5.   
  6. <servlet-mapping>  
  7.     <servlet-name>LogServlet</servlet-name>  
  8.     <url-pattern>/*</url-pattern><!– 看到此没有,这个拦截所有路径 –>  
  9. </servlet-mapping>  


它的拦截规则:

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:

1.     精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

2.     最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

3.     扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet

 

 

3、Listener功能

它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。如下图所示:

 

Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:

ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。

ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。

要获得以上的功能,监听器必须实现以下3个接口:

HttpSessionListener

ServletContextListener

ServletContextAttributeListener

 

例子:

[java] view plaincopy

  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.listener;  
  5.   
  6. import javax.servlet.ServletContextAttributeEvent;  
  7. import javax.servlet.ServletContextAttributeListener;  
  8. import javax.servlet.ServletContextEvent;  
  9. import javax.servlet.ServletContextListener;  
  10. import javax.servlet.http.HttpSessionEvent;  
  11. import javax.servlet.http.HttpSessionListener;  
  12.   
  13. /** 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class OnlineUserListener implements HttpSessionListener,  
  18.         ServletContextListener, ServletContextAttributeListener {  
  19.     private long onlineUserCount = 0;  
  20.   
  21.     public long getOnlineUserCount() {  
  22.         return onlineUserCount;  
  23.     }  
  24.   
  25.     /* (non-Javadoc) 
  26.      * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent) 
  27.      */  
  28.     @Override  
  29.     public void attributeAdded(ServletContextAttributeEvent arg0) {  
  30.   
  31.     }  
  32.   
  33.     /* (non-Javadoc) 
  34.      * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent) 
  35.      */  
  36.     @Override  
  37.     public void attributeRemoved(ServletContextAttributeEvent arg0) {  
  38.   
  39.     }  
  40.   
  41.     /* (non-Javadoc) 
  42.      * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent) 
  43.      */  
  44.     @Override  
  45.     public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {  
  46.         System.err.println(“…attributeReplaced…”);  
  47.     }  
  48.   
  49.     /* (non-Javadoc) 
  50.      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) 
  51.      */  
  52.     @Override  
  53.     public void contextDestroyed(ServletContextEvent arg0) {  
  54.   
  55.     }  
  56.   
  57.     /* (non-Javadoc) 
  58.      * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
  59.      */  
  60.     @Override  
  61.     public void contextInitialized(ServletContextEvent arg0) {  
  62.   
  63.     }  
  64.   
  65.     /* (non-Javadoc) 
  66.      * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) 
  67.      */  
  68.     @Override  
  69.     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
  70.         onlineUserCount ++;  
  71.         toUpdateCount(httpSessionEvent);  
  72.     }  
  73.   
  74.     /* (non-Javadoc) 
  75.      * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) 
  76.      */  
  77.     @Override  
  78.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
  79.         onlineUserCount –;  
  80.         toUpdateCount(httpSessionEvent);  
  81.     }  
  82.   
  83.     private void toUpdateCount(HttpSessionEvent httpSessionEvent){  
  84.         httpSessionEvent.getSession().setAttribute(“onlineUserCount”, onlineUserCount);  
  85.     }  
  86. }  

 

Web.xml

[html] view plaincopy

  1. <listener>  
  2.     <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
  3. </listener>  


 


JSP页面:

[html] view plaincopy

  1. <%@ page language=“java” contentType=“text/html; charset=UTF-8”  
  2.     pageEncoding=“UTF-8”%>  
  3. <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>  
  4. <html>  
  5. <head>  
  6. <meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>  
  7. <title>主页</title>  
  8. </head>  
  9. <body>  
  10.     <h4>你好!</h4>  
  11.     在线人数:<h1><%=request.getSession().getAttribute(“onlineUserCount”) %></h1>  
  12. </body>  
  13. </html>  

来自:http://blog.csdn.net/psyuhen/article/details/7527814

web.xml 中的listener、 filter、servlet 加载顺序及其详解

 http  web.xml 中的listener、 filter、servlet 加载顺序及其详解已关闭评论
3月 152014
 

看了很有帮助,和大家一起分享下:

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰。

        首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filter -> servlet

        同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet

        对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。

        servlet 同 filter 类似,此处不再赘述。

       由此,可以看出,web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

 

web.xml文件详解

Xml代码  收藏代码

  1. Web.xml常用元素   
  2. <web-app>   
  3. <display-name></display-name>定义了WEB应用的名字   
  4. <description></description> 声明WEB应用的描述信息   
  5.   
  6. <context-param></context-param> context-param元素声明应用范围内的初始化参数。   
  7. <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。   
  8. <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。   
  9. <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。   
  10.                      Listener元素指出事件监听程序类。   
  11. <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。   
  12. <servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。   
  13.               但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。   
  14.   
  15. <session-config></session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。   
  16.           可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。   
  17.   
  18. <mime-mapping></mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。   
  19. <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。   
  20. <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。   
  21. <taglib></taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,   
  22.                   而不用编辑使用这些文件的JSP页面。   
  23. <resource-env-ref></resource-env-ref>声明与资源相关的一个管理对象。   
  24. <resource-ref></resource-ref> 声明一个资源工厂使用的外部资源。   
  25. <security-constraint></security-constraint> 制定应该保护的URL。它与login-config元素联合使用   
  26. <login-config></login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。   
  27. <security-role></security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素   
  28.                    的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。   
  29. <env-entry></env-entry>声明Web应用的环境项。   
  30. <ejb-ref></ejb-ref>声明一个EJB的主目录的引用。   
  31. < ejb-local-ref></ ejb-local-ref>声明一个EJB的本地主目录的应用。   
  32. </web-app>   
  33.   
  34.   
  35. 相应元素配置   
  36.   
  37. 1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标   
  38. <icon>   
  39. <small-icon>/images/app_small.gif</small-icon>   
  40. <large-icon>/images/app_large.gif</large-icon>   
  41. </icon>   
  42. 2、Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称   
  43. <display-name>Tomcat Example</display-name>   
  44. 3、Web 应用描述: 给出于此相关的说明性文本   
  45. <disciption>Tomcat Example servlets and JSP pages.</disciption>   
  46. 4、上下文参数:声明应用范围内的初始化参数。   
  47.   <context-param>   
  48.     <param-name>ContextParameter</para-name>   
  49.     <param-value>test</param-value>   
  50.     <description>It is a test parameter.</description>   
  51.   </context-param>   
  52.   在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到   
  53.   
  54. 5、过滤器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。   
  55.   <filter>   
  56.         <filter-name>setCharacterEncoding</filter-name>   
  57.         <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>   
  58.         <init-param>   
  59.             <param-name>encoding</param-name>   
  60.             <param-value>GB2312</param-value>   
  61.         </init-param>   
  62.   </filter>   
  63.   <filter-mapping>   
  64.         <filter-name>setCharacterEncoding</filter-name>   
  65.         <url-pattern>/*</url-pattern>   
  66.   </filter-mapping>   
  67. 6、监听器配置   
  68.   <listener>   
  69.       <listerner-class>listener.SessionListener</listener-class>   
  70.   </listener>   
  71. 7、Servlet配置   
  72.    基本配置   
  73.    <servlet>   
  74.       <servlet-name>snoop</servlet-name>   
  75.       <servlet-class>SnoopServlet</servlet-class>   
  76.    </servlet>   
  77.    <servlet-mapping>   
  78.       <servlet-name>snoop</servlet-name>   
  79.       <url-pattern>/snoop</url-pattern>   
  80.    </servlet-mapping>   
  81.    高级配置   
  82.    <servlet>   
  83.       <servlet-name>snoop</servlet-name>   
  84.       <servlet-class>SnoopServlet</servlet-class>   
  85.       <init-param>   
  86.          <param-name>foo</param-name>   
  87.          <param-value>bar</param-value>   
  88.       </init-param>   
  89.       <run-as>   
  90.          <description>Security role for anonymous access</description>   
  91.          <role-name>tomcat</role-name>   
  92.       </run-as>   
  93.    </servlet>   
  94.    <servlet-mapping>   
  95.       <servlet-name>snoop</servlet-name>   
  96.       <url-pattern>/snoop</url-pattern>   
  97.    </servlet-mapping>   
  98.    元素说明   
  99.      <servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:   
  100.      <servlet-name></servlet-name> 指定servlet的名称   
  101.      <servlet-class></servlet-class> 指定servlet的类名称   
  102.      <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径   
  103.      <init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数   
  104.      <load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。   
  105.                                  当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.   
  106.                                  当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它   
  107.      <servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素   
  108.        <servlet-name></servlet-name> 指定servlet的名称   
  109.        <url-pattern></url-pattern> 指定servlet所对应的URL   
  110. 8、会话超时配置(单位为分钟)   
  111.    <session-config>   
  112.       <session-timeout>120</session-timeout>   
  113.    </session-config>   
  114. 9、MIME类型配置   
  115.    <mime-mapping>   
  116.       <extension>htm</extension>   
  117.       <mime-type>text/html</mime-type>   
  118.    </mime-mapping>   
  119. 10、指定欢迎文件页配置   
  120.    <welcome-file-list>   
  121.       <welcome-file>index.jsp</welcome-file>   
  122.       <welcome-file>index.html</welcome-file>   
  123.       <welcome-file>index.htm</welcome-file>   
  124.    </welcome-file-list>   
  125. 11、配置错误页面   
  126.   一、 通过错误码来配置error-page   
  127.    <error-page>   
  128.       <error-code>404</error-code>   
  129.       <location>/NotFound.jsp</location>   
  130.    </error-page>   
  131.   上面配置了当系统发生404错误时,跳转到错误处理页面NotFound.jsp。   
  132. 二、通过异常的类型配置error-page   
  133.    <error-page>   
  134.        <exception-type>java.lang.NullException</exception-type>   
  135.        <location>/error.jsp</location>   
  136.    </error-page>   
  137.   上面配置了当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp   
  138. 12、TLD配置   
  139.    <taglib>   
  140.        <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri>   
  141.        <taglib-location>/WEB-INF/jsp/debug-taglib.tld</taglib-location>   
  142.    </taglib>   
  143.    如果MyEclipse一直在报错,应该把<taglib> 放到 <jsp-config>中   
  144.    <jsp-config>   
  145.       <taglib>   
  146.           <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri>   
  147.           <taglib-location>/WEB-INF/pager-taglib.tld</taglib-location>   
  148.       </taglib>   
  149.    </jsp-config>   
  150. 13、资源管理对象配置   
  151.    <resource-env-ref>   
  152.        <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>   
  153.    </resource-env-ref>   
  154. 14、资源工厂配置   
  155.    <resource-ref>   
  156.        <res-ref-name>mail/Session</res-ref-name>   
  157.        <res-type>javax.mail.Session</res-type>   
  158.        <res-auth>Container</res-auth>   
  159.    </resource-ref>   
  160.    配置数据库连接池就可在此配置:   
  161.    <resource-ref>   
  162.        <description>JNDI JDBC DataSource of shop</description>   
  163.        <res-ref-name>jdbc/sample_db</res-ref-name>   
  164.        <res-type>javax.sql.DataSource</res-type>   
  165.        <res-auth>Container</res-auth>   
  166.    </resource-ref>   
  167. 15、安全限制配置   
  168.    <security-constraint>   
  169.       <display-name>Example Security Constraint</display-name>   
  170.       <web-resource-collection>   
  171.          <web-resource-name>Protected Area</web-resource-name>   
  172.          <url-pattern>/jsp/security/protected/*</url-pattern>   
  173.          <http-method>DELETE</http-method>   
  174.          <http-method>GET</http-method>   
  175.          <http-method>POST</http-method>   
  176.          <http-method>PUT</http-method>   
  177.       </web-resource-collection>   
  178.       <auth-constraint>   
  179.         <role-name>tomcat</role-name>   
  180.         <role-name>role1</role-name>   
  181.       </auth-constraint>   
  182.    </security-constraint>   
  183. 16、登陆验证配置   
  184.    <login-config>   
  185.      <auth-method>FORM</auth-method>   
  186.      <realm-name>Example-Based Authentiation Area</realm-name>   
  187.      <form-login-config>   
  188.         <form-login-page>/jsp/security/protected/login.jsp</form-login-page>   
  189.         <form-error-page>/jsp/security/protected/error.jsp</form-error-page>   
  190.      </form-login-config>   
  191.    </login-config>   
  192. 17、安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。   
  193.     分别地声明角色可使高级IDE处理安全信息更为容易。   
  194.   <security-role>   
  195.      <role-name>tomcat</role-name>   
  196.   </security-role>   
  197. 18、Web环境参数:env-entry元素声明Web应用的环境项   
  198.   <env-entry>   
  199.      <env-entry-name>minExemptions</env-entry-name>   
  200.      <env-entry-value>1</env-entry-value>   
  201.      <env-entry-type>java.lang.Integer</env-entry-type>   
  202.   </env-entry>   
  203. 19、EJB 声明   
  204.   <ejb-ref>   
  205.      <description>Example EJB reference</decription>   
  206.      <ejb-ref-name>ejb/Account</ejb-ref-name>   
  207.      <ejb-ref-type>Entity</ejb-ref-type>   
  208.      <home>com.mycompany.mypackage.AccountHome</home>   
  209.      <remote>com.mycompany.mypackage.Account</remote>   
  210.   </ejb-ref>   
  211. 20、本地EJB声明   
  212.   <ejb-local-ref>   
  213.      <description>Example Loacal EJB reference</decription>   
  214.      <ejb-ref-name>ejb/ProcessOrder</ejb-ref-name>   
  215.      <ejb-ref-type>Session</ejb-ref-type>   
  216.      <local-home>com.mycompany.mypackage.ProcessOrderHome</local-home>   
  217.      <local>com.mycompany.mypackage.ProcessOrder</local>   
  218.   </ejb-local-ref>   
  219. 21、配置DWR   
  220.   <servlet>   
  221.       <servlet-name>dwr-invoker</servlet-name>   
  222.       <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>   
  223.   </servlet>   
  224.   <servlet-mapping>   
  225.       <servlet-name>dwr-invoker</servlet-name>   
  226.       <url-pattern>/dwr/*</url-pattern>   
  227.   </servlet-mapping>   
  228. 22、配置Struts   
  229.     <display-name>Struts Blank Application</display-name>   
  230.     <servlet>   
  231.         <servlet-name>action</servlet-name>   
  232.         <servlet-class>   
  233.             org.apache.struts.action.ActionServlet   
  234.         </servlet-class>   
  235.         <init-param>   
  236.             <param-name>detail</param-name>   
  237.             <param-value>2</param-value>   
  238.         </init-param>   
  239.         <init-param>   
  240.             <param-name>debug</param-name>   
  241.             <param-value>2</param-value>   
  242.         </init-param>   
  243.         <init-param>   
  244.             <param-name>config</param-name>   
  245.             <param-value>/WEB-INF/struts-config.xml</param-value>   
  246.         </init-param>   
  247.         <init-param>   
  248.             <param-name>application</param-name>   
  249.             <param-value>ApplicationResources</param-value>   
  250.         </init-param>   
  251.         <load-on-startup>2</load-on-startup>   
  252.     </servlet>   
  253.     <servlet-mapping>   
  254.         <servlet-name>action</servlet-name>   
  255.         <url-pattern>*.do</url-pattern>   
  256.     </servlet-mapping>   
  257.     <welcome-file-list>   
  258.         <welcome-file>index.jsp</welcome-file>   
  259.     </welcome-file-list>   
  260.   
  261.     <!– Struts Tag Library Descriptors –>   
  262.     <taglib>   
  263.         <taglib-uri>struts-bean</taglib-uri>   
  264.         <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>   
  265.     </taglib>   
  266.     <taglib>   
  267.         <taglib-uri>struts-html</taglib-uri>   
  268.         <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>   
  269.     </taglib>   
  270.     <taglib>   
  271.     <taglib-uri>struts-nested</taglib-uri>   
  272.     <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>   
  273.     </taglib>   
  274.     <taglib>   
  275.         <taglib-uri>struts-logic</taglib-uri>   
  276.         <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>   
  277.     </taglib>   
  278.     <taglib>   
  279.         <taglib-uri>struts-tiles</taglib-uri>   
  280.         <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>   
  281.     </taglib>   
  282. 23、配置Spring(基本上都是在Struts中配置的)   
  283.   
  284.    <!– 指定spring配置文件位置 –>   
  285.    <context-param>   
  286.       <param-name>contextConfigLocation</param-name>   
  287.       <param-value>   
  288.        <!–加载多个spring配置文件 –>   
  289.         /WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml   
  290.       </param-value>   
  291.    </context-param>   
  292.   
  293.    <!– 定义SPRING监听器,加载spring –>   
  294.   
  295.   <listener>   
  296.      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
  297.   </listener>   
  298.   
  299.   <listener>   
  300.      <listener-class>   
  301.        org.springframework.web.context.request.RequestContextListener   
  302.      </listener-class>   
  303.   </listener>   

 转自:http://zhxing.iteye.com/blog/399668