服务器端组件
一、servlet
1.servlet是运行在服务器端的一个特殊的java类,它可以用于接收页面传过来的数据,由java程序来处理,也可以将处理结果返回给浏览器,也指ServletAPI。
2.servlet的主要任务:
(1)读取客户端(浏览器)发送的显式请求数据。包括 Html 表单。
(2)读取由客户端(浏览器)发送的隐式请求数据。包括 Cookies,媒体类型等。
(3)处理请求数据并生成结果。
(4)发送显式数据到客户端(浏览器),可以为各种格式。
(5)发送隐式数据到客户端(浏览器),包括设置Cookies和缓存。
3.servlet的生命周期:
(1)init() 方法
在第一次创建Servlet的时候会被调用。通常情况下,用户第一次调用对应该 Servlet 的URL时,Servlet 会被创建。
但是当服务器启动时,你也可以指定 Servlet 被加载。
当用户调用 servlet 的时候,每个 servlet 的实例就会被创建,并且每一个用户的请求都会产生一个新的线程,在适当的时刻
交给 doGet() 或是 doPost() 方法。
(2)service() 方法
是执行实际任务的主要方法。Servlet 容器(Web 服务器)调用 service() 方法来处理来自客户端的请求,并将格式化的响应返回到客户端。
每次服务器接收到一个 servlet 请求时,服务器会产生一个新的线程并调用服务。
service() 方法由容器调用,且 service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等。
所以对 service() 方法你什么都不需要做,只是根据你接收到的来自客户端的请求类型来重写 doGet() 或 doPost()。
doGet() 和 doPost() 方法在每次服务请求中是最常用的方法。下面是这两种方法的特征。
(3)destroy() 方法
destroy() 方法只在 servlet 生命周期结束时被调用一次。
4.读取表单参数
getParameterNames():如果你想要得到一个当前请求的所有参数的完整列表,那么调用该方法。
GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
二、filter
1.filter是在浏览器请求到达Web资源之前或Web资源给出的响应回到浏览器之前进行统一的拦截和过滤的服务器端组件
2.生命周期:
(1)创建对象:在Web应用加载时执行——只执行一次:说明Filter也是单实例多线程的方式运行的
(2)初始化操作:创建对象后立即执行——只执行一次
(3)拦截浏览器请求:执行doFilter()对象——多次执行
(4)对象释放前:执行清理操作——只执行一次
3.映射方式
(1)通过URL地址
精确匹配:在url-pattern标签中指定一个具体的URL地址,其中不使用任何的通配符,例如:/target.jsp
模糊匹配:在url-pattern标签中指定一个带有通配符的URL地址
<1>前缀匹配:URL地址前面确定,后面使用通配符,例如:/happy/*
<2>后缀匹配:URL地址后面确定,前面使用通配符,例如:*.jsp,*.jpg
注意:不能在URL地址中间使用通配符,例如:/happy/*.jsp是不允许的
(2)映射Servlet
4.多个filter链的执行顺序
按照 FilterMapping的顺序执行
5.常见的使用情况
(1)用户名密码的验证
(2)过滤不雅字符:HttpServletRequestWrapper,装饰者模式
*在JavaWeb应用中,很多服务器组件的对象是由服务器容器来创建的,
具体的是,我们提供了这些服务器组件的注册信息,然后容器会检测到,进而通过反射来创建对象,这是一种依赖注入的思想,
但是这样会产生一个问题,我们无法对他们的方法进行修改,通过继承的方式会导致程序的迁移性差,
所以我们使用装饰者模式来对原始的服务器容器创建的对象进行包装,修改它的某些方法,进而达到预期的效果。
三、listener
1.listener是用来监控Web应用中相关组件的行为或状态变化的服务器端组件
2.使用:
需要注册的监听器,实现对应的接口,然后在 web.xml 中注册;对于不需要注册的监听器,只要实现接口就可以了,但是实现类需要实现序列化接口。
3.Application Lifecycle监听器:
(1)随Web应用的加载而加载,随Web应用的卸载而卸载
(2)contextInitialized()表示Web应用已经加载都服务器端
(3)可以获取到ServletContext对象:getServletContext()
(4)contextDestroyed()表示Web应用即将从服务器端被卸载
4.Application 属性的监控:实现ServletContextAttributeListener
(1)构造器:监听器本身的构造器
attributeAdded(),在Web应用加载时,第一次会添加Web应用本身的一个属性。所以会触发这个方法
attributeReplaced(),Application域对象的属性被替换时。
attributeRemoved(),Application域对象的属性被移除时。
可以通过ServletContextAttributeEvent对象来获取Application域对象中的属性名和属性值。
在替换时,通过ServletContextAttributeEvent对象.getName()获取到的是旧值,可以通过getServletContext()来
获取ServletContext对象,从而通过getAttribute(String name)从ServletContext中获取新值attributeRemoved(),Application域对象的属性被移除时。
移除时,是通过属性名移除现在Application域对象中保存的属性。
5.对于HttpSessionBindingListener和HttpSessionAttributeListener来说,他们的顺序是这样的:
我进入Session域中了
session域中添加了属性
我离开Session域了
从Session中移除了属性
就是说,HttpSessionBindingListener在HttpSessionAttributeListener之前
6.HttpSessionAttributeListener监听的是所有的Session属性域的变化,而HttpSessionBindingListener是监听某一个类的进出Session域的变化