监听器(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规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
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对象就会销毁。
以上就是对监听器的一些简单讲解。
- 监听器(Listener)快速学习
- 深入分析JavaWeb Item38 -- 监听器(Listener)快速学习
- 深入分析JavaWeb 38 -- 监听器(Listener)快速学习
- 监听器(Listener)学习
- 监听器(Listener)学习进阶
- listener监听器学习笔记
- 监听器(Listener)学习
- Listener监听器学习
- 过滤器(Filter)、监听器(Listener)学习
- JavaWeb笔记之快速了解Listener监听器
- Listener监听器
- Listener监听器
- 监听器Listener
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener 监听器
- test
- HEREDOC和NOWDOC
- Intellij idea jsp web cannot resolve method getParameter(java.lang.String)
- 快的打车架构实践
- 分布式文件系统介绍
- 监听器(Listener)快速学习
- webservice-axis2 遇到问题整理
- UML类图快速入门
- 使用Android studio分析内存泄露
- Json转Map——JSONObject;Map转JSON
- R-CNN和SPP-net
- cf 484B 二分+贪心
- 注释驱动的 Spring cache 缓存介绍
- ASP.NET获取各级目录Server.MapPath详解全