监听器(Listener)快速学习

来源:互联网 发布:手机小号哪个软件好 编辑:程序博客网 时间:2024/06/03 22:39

一、监听器介绍

1.1、监听器的概念

  这里写图片描述

  监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

1.2、监听器案例——监听window窗口的事件监听器

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.listener.demo;<span class="hljs-keyword">import</span> java.awt.Frame;<span class="hljs-keyword">import</span> java.awt.event.WindowEvent;<span class="hljs-keyword">import</span> java.awt.event.WindowListener;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Demo1</span> {</span>    <span class="hljs-javadoc">/**     *java的事件监听机制     *1、事件监听涉及到三个组件:事件源、事件对象、事件监听器     *2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,     *    开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        Frame f = <span class="hljs-keyword">new</span> Frame();        f.setSize(<span class="hljs-number">400</span>, <span class="hljs-number">400</span>);        f.setVisible(<span class="hljs-keyword">true</span>);        <span class="hljs-comment">//注册事件监听器</span>        f.addWindowListener(<span class="hljs-keyword">new</span> WindowListener(){            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowActivated</span>(WindowEvent e) {            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowClosed</span>(WindowEvent e) {            }            <span class="hljs-javadoc">/**             * 当window窗体关闭时就会WindowListener这个监听器监听到,             * 监听器就会调用windowClosing方法处理window窗体关闭时的动作             */</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowClosing</span>(WindowEvent e) {                <span class="hljs-comment">//通过事件对象e来获取事件源对象</span>                Frame f = (Frame) e.getSource();                System.out.println(f+<span class="hljs-string">"窗体正在关闭"</span>);                f.dispose();            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowDeactivated</span>(WindowEvent e) {            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowDeiconified</span>(WindowEvent e) {            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowIconified</span>(WindowEvent e) {            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">windowOpened</span>(WindowEvent e) {            }        });    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul>

1.3、设计一个可以被别的对象监听的对象

  我们平时做开发的时候,我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。

  下面我们来按照事件处理模型来设计一个Person对象,具体代码如下:

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.observer;<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: Person(事件源)*<span class="hljs-javadoctag"> @Description</span>: 设计一个Person类作为事件源,这个类的对象的行为(比如吃饭、跑步)可以被其他的对象监听*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午9:26:06**/</span>  <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> {</span>    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Field</span>: listener    *          在Person类中定义一个PersonListener变量来记住传递进来的监听器    */</span>     <span class="hljs-keyword">private</span> PersonListener listener;    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Method</span>: eat    *<span class="hljs-javadoctag"> @Description</span>: 设计Person的行为:吃    *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼    *    */</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">eat</span>() {        <span class="hljs-keyword">if</span> (listener != <span class="hljs-keyword">null</span>) {            <span class="hljs-javadoc">/**             * 调用监听器的doeat方法监听Person类对象eat(吃)这个动作,将事件对象Event传递给doeat方法,             * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源             */</span>            listener.doeat(<span class="hljs-keyword">new</span> Event(<span class="hljs-keyword">this</span>));        }    }    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Method</span>: run    *<span class="hljs-javadoctag"> @Description</span>: 设计Person的行为:跑    *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼    *    */</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {        <span class="hljs-keyword">if</span> (listener != <span class="hljs-keyword">null</span>) {            <span class="hljs-javadoc">/**             * 调用监听器的dorun方法监听Person类对象run(跑)这个动作,将事件对象Event传递给doeat方法,             * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源             */</span>            listener.dorun(<span class="hljs-keyword">new</span> Event(<span class="hljs-keyword">this</span>));        }    }    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Method</span>: registerListener    *<span class="hljs-javadoctag"> @Description</span>: 这个方法是用来注册对Person类对象的行为进行监听的监听器    *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼    *    *<span class="hljs-javadoctag"> @param</span> listener    */</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">registerListener</span>(PersonListener listener) {        <span class="hljs-keyword">this</span>.listener = listener;    }}<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: PersonListener(事件监听器)*<span class="hljs-javadoctag"> @Description</span>: 设计Person类(事件源)的监听器接口*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午9:28:06**/</span> interface PersonListener {    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Method</span>: doeat    *<span class="hljs-javadoctag"> @Description</span>: 这个方法是用来监听Person对象eat(吃)这个行为动作,    *                 当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作    *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼    *    *<span class="hljs-javadoctag"> @param</span> e    */</span>     <span class="hljs-keyword">void</span> doeat(Event e);    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Method</span>: dorun    *<span class="hljs-javadoctag"> @Description</span>: 这个方法是用来监听Person对象run(跑)这个行为动作,    *                 当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作    *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼    *    *<span class="hljs-javadoctag"> @param</span> e    */</span>     <span class="hljs-keyword">void</span> dorun(Event e);}<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: Event(事件对象)*<span class="hljs-javadoctag"> @Description</span>:设计事件类,用来封装事件源*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午9:37:56**/</span> class Event {    <span class="hljs-javadoc">/**    *<span class="hljs-javadoctag"> @Field</span>: source    *          事件源(Person就是事件源)    */</span>     <span class="hljs-keyword">private</span> Person source;    <span class="hljs-keyword">public</span> <span class="hljs-title">Event</span>() {    }    <span class="hljs-keyword">public</span> <span class="hljs-title">Event</span>(Person source) {        <span class="hljs-keyword">this</span>.source = source;    }    <span class="hljs-keyword">public</span> Person <span class="hljs-title">getSource</span>() {        <span class="hljs-keyword">return</span> source;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setSource</span>(Person source) {        <span class="hljs-keyword">this</span>.source = source;    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li></ul>

  经过这样的设计之后,Peron类的对象就是可以被其他对象监听了。测试代码如下:

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.observer;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PersonTest</span> {</span>    <span class="hljs-javadoc">/**     *<span class="hljs-javadoctag"> @Method</span>: main     *<span class="hljs-javadoctag"> @Description</span>: 测试Person类     *<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼     *     *<span class="hljs-javadoctag"> @param</span> args     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        <span class="hljs-comment">//</span>        Person p = <span class="hljs-keyword">new</span> Person();        <span class="hljs-comment">//注册监听p对象行为的监听器</span>        p.registerListener(<span class="hljs-keyword">new</span> PersonListener() {            <span class="hljs-comment">//监听p吃东西这个行为</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doeat</span>(Event e) {                Person p = e.getSource();                System.out.println(p + <span class="hljs-string">"在吃东西"</span>);            }            <span class="hljs-comment">//监听p跑步这个行为</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">dorun</span>(Event e) {                Person p = e.getSource();                System.out.println(p + <span class="hljs-string">"在跑步"</span>);            }        });        <span class="hljs-comment">//p在吃东西</span>        p.eat();        <span class="hljs-comment">//p在跑步</span>        p.run();    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li></ul>

运行结果:

  me.gacl.observer.Person@4a5ab2在吃东西
  me.gacl.observer.Person@4a5ab2在跑步

二、JavaWeb中的监听器

2.1、基本概念

  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

2.2、Servlet监听器的分类

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContextHttpSessionServletRequest这三个域对象
  Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

  • 监听域对象自身的创建和销毁的事件监听器。
  • 监听域对象中的属性的增加和删除的事件监听器。
  • 监听绑定到HttpSession域中的某个对象的状态的事件监听器。

2.3、监听ServletContext域对象的创建和销毁

  ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。

  • 当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。

  • 当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

  • ServletContext域对象创建和销毁时机:
        创建:服务器启动针对每一个Web应用创建ServletContext
        销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

范例:编写一个MyServletContextListener类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁

  1、编写监听器,代码如下:

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.listener;<span class="hljs-keyword">import</span> javax.servlet.ServletContextEvent;<span class="hljs-keyword">import</span> javax.servlet.ServletContextListener;<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: MyServletContextListener*<span class="hljs-javadoctag"> @Description</span>: MyServletContextListener类实现了ServletContextListener接口,*                 因此可以对ServletContext对象的创建和销毁这两个动作进行监听。*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午10:26:16**/</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyServletContextListener</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ServletContextListener</span> {</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">contextInitialized</span>(ServletContextEvent sce) {        System.out.println(<span class="hljs-string">"ServletContext对象创建"</span>);    }    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">contextDestroyed</span>(ServletContextEvent sce) {        System.out.println(<span class="hljs-string">"ServletContext对象销毁"</span>);    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul>

  2、在web.xml文件中注册监听器

  我们在上面的中讲到,要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的,如下:

<code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span><span class="hljs-tag"><<span class="hljs-title">web-app</span> <span class="hljs-attribute">version</span>=<span class="hljs-value">"3.0"</span>     <span class="hljs-attribute">xmlns</span>=<span class="hljs-value">"http://java.sun.com/xml/ns/javaee"</span>     <span class="hljs-attribute">xmlns:xsi</span>=<span class="hljs-value">"http://www.w3.org/2001/XMLSchema-instance"</span>     <span class="hljs-attribute">xsi:schemaLocation</span>=<span class="hljs-value">"http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"</span>></span>  <span class="hljs-tag"><<span class="hljs-title">display-name</span>></span><span class="hljs-tag"></<span class="hljs-title">display-name</span>></span>      <span class="hljs-tag"><<span class="hljs-title">welcome-file-list</span>></span>    <span class="hljs-tag"><<span class="hljs-title">welcome-file</span>></span>index.jsp<span class="hljs-tag"></<span class="hljs-title">welcome-file</span>></span>  <span class="hljs-tag"></<span class="hljs-title">welcome-file-list</span>></span>  <span class="hljs-comment"><!-- 注册针对ServletContext对象进行监听的监听器 --></span>  <span class="hljs-tag"><<span class="hljs-title">listener</span>></span>      <span class="hljs-tag"><<span class="hljs-title">description</span>></span>ServletContextListener监听器<span class="hljs-tag"></<span class="hljs-title">description</span>></span>      <span class="hljs-comment"><!--实现了ServletContextListener接口的监听器类 --></span>      <span class="hljs-tag"><<span class="hljs-title">listener-class</span>></span>me.gacl.web.listener.MyServletContextListener<span class="hljs-tag"></<span class="hljs-title">listener-class</span>></span>  <span class="hljs-tag"></<span class="hljs-title">listener</span>></span><span class="hljs-tag"></<span class="hljs-title">web-app</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>

  经过这两个步骤,我们就完成了监听器的编写和注册,Web服务器在启动时,就会自动把在web.xml中配置的监听器注册到ServletContext对象上,这样开发好的MyServletContextListener监听器就可以对ServletContext对象进行监听了。

2.4、监听HttpSession域对象的创建和销毁

  HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
  创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
  销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。

范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁

  1、编写监听器,代码如下:

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.listener;<span class="hljs-keyword">import</span> javax.servlet.http.HttpSessionEvent;<span class="hljs-keyword">import</span> javax.servlet.http.HttpSessionListener;<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: MyHttpSessionListener*<span class="hljs-javadoctag"> @Description</span>: MyHttpSessionListener类实现了HttpSessionListener接口,*                 因此可以对HttpSession对象的创建和销毁这两个动作进行监听。*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午11:04:33**/</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyHttpSessionListener</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">HttpSessionListener</span> {</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sessionCreated</span>(HttpSessionEvent se) {        System.out.println( se.getSession() + <span class="hljs-string">"创建了!!"</span>);    }    <span class="hljs-comment">/* HttpSession的销毁时机需要在web.xml中进行配置,如下:     * <session-config>              <session-timeout>1</session-timeout>          </session-config>          这样配置就表示session在1分钟之后就被销毁     */</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sessionDestroyed</span>(HttpSessionEvent se) {        System.out.println(<span class="hljs-string">"session销毁了!!"</span>);    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li></ul>

  2、在web.xml文件中注册监听器

<code class="hljs xml has-numbering"><span class="hljs-comment"><!--注册针对HttpSession对象进行监听的监听器--></span>   <span class="hljs-tag"><<span class="hljs-title">listener</span>></span>      <span class="hljs-tag"><<span class="hljs-title">description</span>></span>HttpSessionListener监听器<span class="hljs-tag"></<span class="hljs-title">description</span>></span>      <span class="hljs-tag"><<span class="hljs-title">listener-class</span>></span>me.gacl.web.listener.MyHttpSessionListener<span class="hljs-tag"></<span class="hljs-title">listener-class</span>></span>  <span class="hljs-tag"></<span class="hljs-title">listener</span>></span>  <span class="hljs-comment"><!-- 配置HttpSession对象的销毁时机 --></span>  <span class="hljs-tag"><<span class="hljs-title">session-config</span>></span>      <span class="hljs-comment"><!--配置HttpSession对象的1分钟之后销毁 --></span>      <span class="hljs-tag"><<span class="hljs-title">session-timeout</span>></span>1<span class="hljs-tag"></<span class="hljs-title">session-timeout</span>></span>  <span class="hljs-tag"></<span class="hljs-title">session-config</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

  当我们访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程了,我们可以写一个jsp页面观察HttpSession对象创建的过程。

如下:index.jsp

<code class="hljs xml has-numbering"><span class="vbscript"><%@ page language=<span class="hljs-string">"java"</span> import=<span class="hljs-string">"java.util.*"</span> pageEncoding=<span class="hljs-string">"UTF-8"</span> %></span><span class="hljs-doctype"><!DOCTYPE HTML></span><span class="hljs-tag"><<span class="hljs-title">html</span>></span>  <span class="hljs-tag"><<span class="hljs-title">head</span>></span>    <span class="hljs-tag"><<span class="hljs-title">title</span>></span>HttpSessionListener监听器监听HttpSession对象的创建<span class="hljs-tag"></<span class="hljs-title">title</span>></span>  <span class="hljs-tag"></<span class="hljs-title">head</span>></span>  <span class="hljs-tag"><<span class="hljs-title">body</span>></span>       一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}  <span class="hljs-tag"></<span class="hljs-title">body</span>></span><span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

运行结果如下:

这里写图片描述

2.5、监听ServletRequest域对象的创建和销毁

  ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁
  Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用
  Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用

  ServletRequest域对象创建和销毁时机:
    创建:用户每一次访问都会创建request对象
    销毁:当前访问结束,request对象就会销毁

范例:编写一个MyServletRequestListener类,实现ServletRequestListener接口,监听ServletRequest对象的创建和销毁

  1、编写监听器,代码如下:

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.listener;<span class="hljs-keyword">import</span> javax.servlet.ServletRequestEvent;<span class="hljs-keyword">import</span> javax.servlet.ServletRequestListener;<span class="hljs-javadoc">/***<span class="hljs-javadoctag"> @ClassName</span>: MyServletRequestListener*<span class="hljs-javadoctag"> @Description</span>: MyServletRequestListener类实现了ServletRequestListener接口,*                 因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼*<span class="hljs-javadoctag"> @date</span>: 2014-9-9 下午11:50:08**/</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyServletRequestListener</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ServletRequestListener</span> {</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">requestDestroyed</span>(ServletRequestEvent sre) {        System.out.println(sre.getServletRequest() + <span class="hljs-string">"销毁了!!"</span>);    }    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">requestInitialized</span>(ServletRequestEvent sre) {        System.out.println(sre.getServletRequest() + <span class="hljs-string">"创建了!!"</span>);    }}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li></ul>

  2、在web.xml文件中注册监听器

<code class="hljs xml has-numbering"><span class="hljs-comment"><!--注册针对ServletRequest对象进行监听的监听器--></span>   <span class="hljs-tag"><<span class="hljs-title">listener</span>></span>       <span class="hljs-tag"><<span class="hljs-title">description</span>></span>ServletRequestListener监听器<span class="hljs-tag"></<span class="hljs-title">description</span>></span>       <span class="hljs-tag"><<span class="hljs-title">listener-class</span>></span>me.gacl.web.listener.MyServletRequestListener<span class="hljs-tag"></<span class="hljs-title">listener-class</span>></span>   <span class="hljs-tag"></<span class="hljs-title">listener</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

测试结果如下:

这里写图片描述

  从运行结果中可以看到,用户每一次访问都会创建request对象,当访问结束后,request对象就会销毁。

  以上就是对监听器的一些简单讲解。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 台式电脑w7锁屏密码忘记了怎么办 win7电脑锁屏密码忘记了怎么办 苹果手机4s开机密码忘记了怎么办 苹果4s下载东西忘记密码怎么办 苹果4s不记得开机密码怎么办? 苹果手机id密码忘了怎么办能解锁 苹果5s id密码忘了怎么办? 苹果手机激活锁id忘记了怎么办 苹果刷了机忘了账号无法激活怎么办 三星s7指纹解开锁密码忘了怎么办 索尼手机锁屏密码忘了怎么办 金立手机开机密码忘了怎么办 如果小米手机锁屏密码忘记了怎么办 小米手机锁屏密码忘了怎么办 小米5x忘记了屏保锁屏密码怎么办 htc手机锁屏密码忘了怎么办 苹果7手机解锁密码忘了怎么办 魅族7plus锁屏密码忘了怎么办 捡到苹果手机不知道id密码怎么办 平板不知道id地址和密码怎么办 红米1s刷机变砖了怎么办 车玻璃被鞭炮炸了黑印子怎么办 出轨的事被家人知道后道处传怎么办 村霸霸占土地弱势村民该怎么办? 户户通没有插卡位置信息改变怎么办 出现重大污染天气时企业该怎么办 电子税务句注册后未绑定企业怎么办 报税的时候PIN码忘了怎么办 购房合同丢失开发商不给补怎么办 租赁合同丢了房东不退押金怎么办 小孩不愿意喝奶粉爱喝乳酸菌怎么办 长安通不记名卡丢了怎么办 农村电表箱里的开关坏了怎么办 建行手机银行登录密码忘了怎么办 手机银行登入密码忘记了怎么办 邮政手机银行登录密码忘了怎么办 建设手机银行登入密码忘记了怎么办 浪琴机械表秒针走的快怎么办 雷达晶萃陶瓷表镀金掉色怎么办 做信息稿部分人员没拍到照片怎么办 二建条件不够考后审核怎么办