Servlet学习(二)

监听器Listener

负责监听web的各种操作,当相关的事件触发后将产生事件,
并对事件进行处理。

监听对象:
1.ServletRequest:request
(1)ServletRequestListener接口:监听请求的创建和撤消,该接口用来监听请求到达和结束,因此可以在请求达到前和请求结束前执行一些用户行为。
在request(HttpServletRequest)对象建立或被消灭时,会分别调用requestInitialized()和requestDestroyed()方法。
(2)ServletRequestAttributeListener接口:监听请求中(request对象中)的属性变化。
若有属性加入到某个request对象中时则会调用attributeAdded(),同理在替换属性与删除属性时,会分别调用attributeReplaced()、 attributeRemoved()。

2.HttpSession:session
(1)HttpSessionListener接口:监听Http会话的创建和撤消,并在某个session对象建立和销毁之前调用某个方法
创建session对象:sessionCreated()
删除session对象:sessionDestroyed()

(2)HttpSessionActivationListener接口:监听Http会话的active和passivate状态
session对象被保存到磁盘: sessionWillPassivate()
session对象被调入内存:sessionDidActivate()
Activate与Passivate是用于置换session对象的动作,当Web服务器因为资源利用或负载平衡等原因要将内存中的 session对象暂时储存至硬盘或其它储存器时(通过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加 载到JVM中时所采的动作称之为Activate。sessionDidActivate()方法与 sessionWillPassivate()方法分别于Activeate后与Passivate前被调用。

(3)HttpSessionAttributeListener接口:监听Http会话中属性的设置信息
向某个session对象中增加新属性:attributeAdded()
删除某个session对象中的属性:attributeRemoved()
修改某个session对象中的属性:attributeReplaced()

(4)HttpSessionBindingListener接口:这是唯一一个不需要在web.xml中进行配置的监听器接口,监听Http会话中属性的变化情况
属性被加入到session中:valueBound()
属性被从session中删除:valueUnbound()

3.ServletContext:application
(1)ServletContextListener接口:用于监听ServletContext对象的创建和删除
创建:contextInitialzed()
撤销:contextDestroyed()

(2)ServletContextAttributeListener接口:用于监听ServletContext对象的属性操作。
增加:attributeAdded()
删除:attributeRemoved()
修改:attributeReplaced()
web.xml配置

<listener>
        <listener-class>com.sunsharing.listener.TestListener</listener-class>
    </listener>

web.xml的加载顺序是:Context-Param->Listener->Filter->Servlet

常用场景
1.单态登陆:一个账号只能在一台机器上登录
2.显示在线人数:
(1)ContextListener:获取服务启动的时间等。
(2)RequestListener:获取客户端的IP、访问地址,访问次数等。
(3)SessionListener:需要监听 Session 的创建与属性变化。

拦截器interceptor

拦截器interceptor是面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,与过滤器十分相似,通过层层拦截,处理用户的请求和响应。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。

生命周期:
以struts的拦截器为例,加载了struts.xml以后,初始化相应拦截器。当action请求来时调用intercept方法,服务器停止销毁interceptor。

Servlet单例多线程

当客户端第一次请求某个Servlet时,Servlet会根据web.xml配置文件实例化这个Servlet类。
当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。
Servlet单实例,减少了生成Servlet的开销。通过线程池响应请求,避免了不断创建线程和销毁线程的开销,提高了性能。
产生问题:同一个Servlet的的多个请求到来时,如果该Servlet中存在成员变量,可能发生多线程同时访问该资源时,都来操作它,造成数据的不一致,因此产生线程安全问题。
解决方法:
1.同步对共享数据的操作
2.避免使用实例变量(成员变量)
使用实例变量会造成线程安全问题,在高并发的情况下。

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
(1)服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
(2)浏览器将这些信息存储在本地计算机上,以备将来使用。
(3)当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。

设置最大生存周期:cookie.setMaxAge(60*60*24);
发送Cookie到HTTP响应头:response.addCookie(cookie);
设置响应内容类型: response.setContentType(“text/html;charset=UTF-8”);
获取Cookie数组:request.getCookies();

删除Cookie
1.读取一个现有的 cookie,并把它存储在 Cookie 对象中。
2.使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
3.把这个 cookie 添加到响应头。

应用场景
1.利用cookie实现自动登录
2.根据用户的爱好定制站点(网站可以使用cookie记录用户的意愿。)

HTTP请求过程

1.域名解析(搜索顺序,如果找到对应的条目且没有过期,则解析结束,不进入下一步搜索)
(1)搜索浏览器自身的DNS缓存
(2)搜索操作系统自身的DNS缓存
(3)读取hosts文件(hosts文件是一个没有扩展名的系统文件,它的主要作用是能加快域名解析,还可以屏蔽网站等)
(4)向本地配置的首选DNS服务器发起域名解析请求,没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求
(5)操作系统查找NetBIOS name Cache,凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。
(6)查询WINS 服务器
(7)客户端进行广播查找
(8)客户端读取LMHOSTS文件
如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。

2.发起TCP的3次握手
(1)client发送连接请求
(2)server监听到请求报文,同意建立连接
(3)client收到后再次发送确认

3.建立TCP连接后发起http请求
请求的方法
请求的URL
http协议版本

4.服务器响应http请求,浏览器得html代码
服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件。
状态码信息:
响应成功:200
请求的URL资源不存在:404
服务器内部错误:500
1XX消息:代表请求已被接受,需要继续处理
2xx成功:代表请求已成功被服务器接收、理解、并接受。
3xx重定向:代表需要客户端采取进一步的操作才能完成请求。通常用来重定向
4xx客户端错误:代表客户端看起来可能发生了错误,妨碍了服务器的处理
5xx服务器错误:代表服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理

5.浏览器解析html代码中的资源(js,css,图片等)
浏览器拿到html文件后,开始解析其中的html,遇到js、css、image等静态资源时,向服务端请求下载。建立一次HTTP连接,请求多个资源,下载资源的顺序就是按照代码里的顺序

6.浏览器对页面进行渲染呈现给用户
构建dom Tree > 构建Render Tree > 布局Render Tree,Layout - 定位坐标和大小,是否换行,各种position,overflow,z-index属性等等 > 正式绘制

猜你喜欢

转载自blog.csdn.net/qq_41372922/article/details/82417052
今日推荐