Web服务启动时自动加载Servlet,并执行service处理 监听处理

来源:互联网 发布:史上最恶搞游戏之网络 编辑:程序博客网 时间:2024/05/22 02:01

自动加载servlet,非常棒的方式

  1. 这个有什么作用呢?
    自动加载我们的Servlet,之前我也是觉得这个东西,非常的简单嘛。自动加载就自动加载啦。有什么觉得可以理解的呢?
    其实这里面的东西非常的深入的哦,好好的了解哈,非常的有必要哦。为啥这么说呢?我们先看哈我最近遇到的吧!
    需求如下:
    做一个Api接口,提供给别人使用,然后呢,我们的使用次数是有限制的,所以不能使用太多次。这个呢其实感觉很简单的,啊。就是一个简单的问题。每次请求的时候设置一个监听器,然后操作数据库相应的减少就好了。可是啊,每次操作数据库这样的请求方式真的好?这个问题很难考虑吧!我们可以考虑直接加载到内存中操作,也就是刚刚开始的时候,我们直接的就把所有的用户的数据全部加载到内存中去处理,每次请求修改哈哈,我们的数据就好了。然后设置一个定时器获取我们的数据,定期的修改数据。这里处理的时候要注意,我们不可能每个用户都去修改涩,要把修改过的数据和没有修改过的数据分开啦处理。不然数据量大了,这个修改太恐怖啦!这个其实也是减少数据库请求的次数!
    第二个就是:我们使用JMS为设置监听器,我看好多的例子都是使用直接配置的方式设置监听器的,但是我实习的公司没有这么处理,直接使用函数操作,这个就是涉及到了一个问题,我们在整个web程序启动的时候,必须注册这个监听器,不然我们没办法监听消息的创建者发送的消息。这个也是需要我们去处理的问题。
    其实还有一种解决方案,就是spring启动的时候会默认的初始化,单例模式的bean,我么也是可以在够造函数中初始化哦!其实这种方式也行,但是工程大了最后哈不清楚逻辑思路啦。

在web.xml这样定义一个servlet:

<servlet>     <servlet-name>t1</servlet-name>     <servlet-class>com.base.test.T1</servlet-class>     <!-- 如果需要自动加载,加下面一句 -->     <load-on-startup>1</load-on-startup> </servlet> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

< load-on-startup>标记web容器是否在启动的时候就加载这个servlet 当值为0或者大于0时,表示web容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载; 正数的值越小,启动该servlet的优先级越高。

在写这个Servlet里,需要重写init()方法:

package com.base.test;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;public class T1 extends HttpServlet {    public T1() {        super();    }    public void init() throws ServletException {        System.out.println("init t1 ... ");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

重启web容器,在控制台可以看到”init t1 … “这么一行信息。
所以啊,我们也是可以在这里处理加载用户的数据,在spring启动之后进行,吧加载的地位放低一点就好了涩!
应为这个servlet不是我们的请求调用的哦,会一直存在的,相当于全局函数啦,所以我们可以设置个全局的变量进行处理,每个请求都是可以得到这个静态的变量的,哈哈。就可以通过监听我们的请求修改这个变量的值,在使用定时器定时的加载到数据库中去就好了。

好啦,怎么监听呢?
监听器就是一个实现特定接口的普通Java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
servlet的监听器,我们可以继承他们完成各种各种的功能,对于那些框架中也是有各种可以使用的监听器,实质是不变的,就是进行了封装而已。
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
• 监听三个域对象创建和销毁的事件监听器
• 监听域对象中属性的增加和删除的事件监听器
• 监听绑定到 HttpSession域中的某个对象的状态的事件监听器。(查看API文档)

监听servletContext域对象创建和销毁
ServletContextListener 接口用于监听 ServletContext对象的创建和销毁事件。
当 ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
当ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

监听HttpSession域对象创建和销毁
HttpSessionListener接口用于监听HttpSession创建和销毁
创建一个Session时,sessionCreated(HttpSessionEventse) 方法将会被调用。 销毁一个Session时,sessionDestroyed(HttpSessionEvent se) 方法将会被调用。Session域对象创建和销毁的时机创建:用户每一次访问时,服务器创建session
销毁:如果用户的session30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间

监听HttpRequest域对象创建和销毁
ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁。
Request 对象被创建时,监听器的requestInitialized方法将会被调用。
Request对象被销毁时,监听器的requestDestroyed方法将会被调用。
创建:用户每一次访问,都会创建一个reqeust
销毁:当前访问结束,request对象就会销毁

监听三个域对象属性变化
Servlet规范定义了监听ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener,HttpSessionAttributeListener ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同
attributeAdded 方法当监听器的域对象中的某个属性被增加时,web容器调用事件监听器的这个方法进行相应
attributeRemoved 方法当监听器的域对象中的某个属性被删除时,web容器调用事件监听器的这个方法进行相应
attributeReplaced 方法 当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应
public void attributeRmoved(ServletRequestAttributeEvent srae)
public void attributeRemoved (HttpSessionBindingEvent hsbe)
public void attributeRemoved(ServletContextAttributeEvent scae)

阅读全文
0 0
原创粉丝点击