自动加载servlet,非常棒的方式
- 这个有什么作用呢?
自动加载我们的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)