您的位置:首页 > 其它

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

2017-08-11 09:19 288 查看

自动加载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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: