一.Listener
[1]监听器简介
> Listener是JavaWeb中三大组件之一。Servlet、Filter、Listener
> 三大组件都有的共同特点,都需要实现一个接口,并在web.xml文件配置。
监听器:朝阳群众
监听对象:明星
监听的事件:干坏事
调用方法:报警
> JavaWeb中的监听器的监听对象是谁?
ServletContext
HttpSession
ServletRequest
[2]监听器分类
> JavaWeb中的监听器共有三种,共8个监听器
- 生命周期监听器,监听三个对象的创建和销毁的事件。(3个)
- 属性监听器,监听三个对象中属性的变化。(3个)
- session对象监听器,将它session中的属性,以及session的活化和钝化。(2个)
[3]生命周期监听器
ServletContextListener
- ServletContext生命周期监听器
- void contextDestroyed(ServletContextEvent sce)
- 该方法在ServletContext对象销毁前调用
- void contextInitialized(ServletContextEvent sce)
- 该方法在ServletContext对象创建之后调用。
- ServletContextEvent 对象可以获取到ServletContext对象
ServletContextEvent.getServletContext();
HttpSessionListener
- HttpSession生命周期监听器
- void sessionCreated(HttpSessionEvent se)
- 该方法在Session创建时调用
- void sessionDestroyed(HttpSessionEvent se)
- 在session销毁时调用
- HttpSessionEvent
- 可以获取HttpSession对象
ServletRequestListener
- void requestDestroyed(ServletRequestEvent sre)
- 在request请求响应时调用
- void requestInitialized(ServletRequestEvent sre)
- 在request请求开始时调用
- ServletRequestEvent
可以获取ServletContext对象和ServletRequest
编写一个监听器的步骤:
1.创建一个类并实现一个接口。
2.在web.xml文件中注册监听器。
[4]属性监听器
> 属性监听器,监听三个域中的属性的变化:添加一个属性,替换一个属性,移除一个属性
> ServletContextAttributeListener
- 监听ServletContext中的属性的变化
void attributeAdded(ServletContextAttributeEvent scab)
- 当向ServletContext中添加属性时调用
attributeRemoved(ServletContextAttributeEvent scab)
- 移除属性时调用
attributeReplaced(ServletContextAttributeEvent scab)
- 替换一个属性时调用
> HttpSessionAttributeListener
void attributeAdded(HttpSessionBindingEvent se)
void attributeRemoved(HttpSessionBindingEvent se)
void attributeReplaced(HttpSessionBindingEvent se)
- HttpSessionBindingEvent
1.可以获取到属性名 getName()
2.可以获取属性的旧值 getValue()
3.可以获取到HttpSession对象 getSession();
> ServletRequestAttributeListener
void attributeAdded(ServletRequestAttributeEvent srae)
void attributeRemoved(ServletRequestAttributeEvent srae)
void attributeReplaced(ServletRequestAttributeEvent srae)
> 以下两个监听器监听session域中的属性的。
[5]HttpSessionBindingListener
> 监听session域中某一个类的实例的添加和移除。
> 该接口由JavaBean来实现,不需要再web.xml文件配置
valueBound(HttpSessionBindingEvent event)
- 当该类的实例,作为属性设置进session域中时调用
valueUnbound(HttpSessionBindingEvent event)
- 当该类的实例,从session域中被移除时调用
[6]HttpSessionActivationListener
> 监听session域中的某类属性,和session一起活化和钝化的事件。
> 该接口由JavaBean来实现,同样不需要再web.xml中配置,但是该JavaBean需要实现Serializable接口!
void sessionDidActivate(HttpSessionEvent se)
- 当前对象和session一起被活化到内存时调用
void sessionWillPassivate(HttpSessionEvent se)
- 当前对象和session一起钝化到硬盘时调用
2.Filter
[1] Filter简介
> Filter翻译为中文是过滤器的意思。
> Filter是JavaWeb的三大web组件之一:Servlet、Filter、Listener
> Filter的作用是在请求到达WEB资源(HTML、CSS、Servlet、JSP)之前进行拦截。
> Filter需要交给Tomcat访问器来管理
二. Filter的作用:
1.Filter可以在请求到达目标资源之前进行拦截
2.Filter也可以放行请求
3.Filter可以在响应到达浏览器之前做一个预处理
[2] Filter的HelloWorld
> 步骤:
1.创建一个类实现Filter接口
2.在web.xml文件中对Filter进行配置
<filter>
<filter-name>Filter的别名</filter-name>
<filter-class>Filter的全类名</filter-class>
</filter>
<filter-mapping>
<filter-name>别名</filter-name>
<url-pattern>需要Filter拦截的资源地址</url-pattern>
</filter-mapping>
[3] Filter的生命周期
> 一个请求的发送,到响应返回是一个线程。
> Filter的生命周期,指的是Filter对象由被创建到被销毁的过程。
> Filter的生命周期方法:
- 构造器:Filter的构造器在服务器启动时调用。 构造器只会调用一次,说明Filter也是单例多线程的。
- init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。
- doFilter():每一次拦截请求时都会调用。
参数
ServletRequest request
> 请求报文
ServletResponse response
> 响应报文
FilterChain chain
> 该对象的作用就是放行请求:
可以通过 chain.doFilter(request,response) 放行请求。
当调用chain.doFilter()就相当于调用目标的资源的service方法。
- destroy方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。
> url-pattern的设置规则:
1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter
2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
例子2:/* , 会拦截项目根目录下所有资源
3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
例子:*.jsp 只要是以jsp结尾的请求都会拦截
- 以上规则适用于Servlet的url-pattern配置
- 当使用Filter拦截一个Servlet时,可以将Filter的url-pattern和Servlet的url-pattern一样
这样Filter就会拦截发送到Servlet的请求。
- 也可以通过在filter-mapping中添加一个servlet-name标签来设置要拦截的Servlet的name
[4] Filter的执行顺序
> 我们可以为一个资源设置多个过滤器,
当我们为一个资源设置了多个过滤器时,这些过滤器就组成一个Filter链的结构。
当我们去掉用chain.doFilter(),如果该过滤器后边还有其他的过滤,
相当于调用了下一个过滤器doFilter()方法
如果过滤器后没有其他的过滤器,我们调用chain.doFilter()
相当于调用了目标资源的service()方法。
> 多个Filter的执行顺序,有filter-mapping标签的配置顺序决定,
filter-mappint靠前,则filter先执行,靠后则后执行。
> 我们可以通过修改filter-mapping的顺序来修改Filter的执行顺序,
[5] dispatcher
> Filter默认只会拦截直接向目标资源发送的请求,而像转发之类的请求不会拦截
> 可以在在filter-mapping的dispatcher标签中来指定过滤器要拦截的请求类型:
<dispatcher>REQUEST</dispatcher>
代表拦截发送到目标资源的直接请求,如果不指定dispatcher默认值就是request
如果在filter-mapping设置了dispatcher则按照设置的内容来
<dispatcher>FORWARD</dispatcher>
FORWARD代表会拦截通过转发访问目标资源的请求。
<dispatcher>INCLUDE</dispatcher>
INCLUDE会拦截动态包含的请求。
<dispatcher>ERROR</dispatcher>
ERROR是拦截在web.xml中声明的错误页面的
- 我们可以在web.xml文件进行一个错误页面的映射,通过如下标签:
<error-page>
<error-code>404</error-code>
<location>/4.jsp</location>
</error-page>
error-code指的是发生错误的代码
location 发生错误以后去到的页面
。
三.servlet的配置
<!-- 向服务器注册servlet -->
<servlet>
<!-- servlet-name是给我们使用的,我们使用这个servlet-name对servlet进行配置! -->
<servlet-name>AServlet</servlet-name>
<!-- servlet-class指定全类名,给服务器使用,服务器使用这个全类名创建一个servlet实例【对象】 -->
<servlet-class>com.neuedu.servlet.AServlet</servlet-class>
</servlet>
<!-- servlet-mapping做请求映射 -->
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<!-- 请求映射是通过这个url-pattern来实现的! -->
<url-pattern>/BServlet</url-pattern>
</servlet-mapping>
注意点:
1.<url-pattern>标签中指定的映射路径不必和<servlet-name>标签指定的内容保持一致!
2.只有你浏览器地址栏中请求的url和我们这里<url-pattern>标签中的映射一致的时候,我们自定义的servlet类才会处理这个请求!
5.生命周期
servlet是由tomcat服务器来管理的!
servlet生命周期:是指servlet对象由产生到销毁的过程!
servlet生命周期涉及的几个方法:
1.构造器方法:只会在第一次访问这个servlet的时候调用一次,调用一次就说明servlet是单例的,但是servlet是多线程的,
非线程安全的,也就是说在servlet中我们尽量不要在service方法中操作全局变量!
2.init方法:init方法只会在第一次访问servlet的时候调用一次,对servlet对象进行初始化操作!
3.service:service方法会在每次访问这个servlet的时候都调用一次,而且我们的业务逻辑也是写在这个service方法!
4.destroy方法::destroy方法只会在我们的项目卸载的时候调用一次,也就是说在服务器关闭的时候会在服务器关闭的时候调用一次!
6.servletConfig
ServletConfig:是一个接口,一个ServletConfig对象只代表当前的servlet类的配置信息。
1) represent:
* <servlet>
<!-- servlet-name是给我们使用的,我们使用这个servlet-name对servlet进行配置! -->
<servlet-name>AServlet</servlet-name>
<!-- servlet-class指定全类名,给服务器使用,服务器使用这个全类名创建一个servlet实例【对象】 -->
<servlet-class>com.neuedu.servlet.AServlet</servlet-class>
</servlet>
2).如何获取:
由服务器创建,通过init方法的参数直接传递给我们,我们直接在init方法使用就可以了!
3)功能:
getServletName():获取当前servlet-name值,也就是获取servletname
getInitParameter("password"):获取servlet的初始化参数!
getServletContext():获取当前web应用!
7.ServletContext
1) 代表:代表的是当前web应用,也就是指的web.xml文件中的信息!
2)获取:通过ServletConfig对象的getServletContext()获取!
3) 功能:
1)getInitParameter:获取整个web应用的初始化参数,也就是如下:
<context-param>
<param-name>user</param-name>
<param-value>lisi</param-value>
</context-param>
2)获取资源的真实路径:getRealPath()
虚拟路径:http://localhost:8080/servlet-demo1/index.html
真实路径:E:LHF teachermarsworkspaceservlet-demo1WebContentindex.html
8.MyGenericServlet
1.定义一个抽象类实现servlet接口,保留service方法不去实现,其余方法都实现了!
2.自定义抽象类子类,在web.xml文件中注册一下这个子类!
9.HttpServlet
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
10.HttpServletRequest
1)代表:代表浏览器向服务器发送的请求报文
2) 获取:由tomcat服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
3) 功能:
getParameter()获取请求参数
getContextPath():获取当前项目名
setAttribute/getAttribute:本身就是一个域对象!
request.getRequestDispatcher("1.html").forward(request, response);可以实现转发功能!
11.HttpServletResponse
1)代表:服务器响应给浏览器的响应报文
2)获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
3)功能:
response.getWriter().println("<h3>hello world!</h3>");可以返回给浏览器一个页面或者一个页面片段!
response.sendRedirect("/servlet1/1.html"); :可以做请求的重定向
12.转发和重定向
转发:当浏览器向服务器发送请求的时候,服务器自己不处理,而是调用其它的web资源进行处理!
重定向:当浏览器向服务器发送请求的时候,服务器返回给浏览器一个特殊的响应,这个特殊的响应告诉浏览器再向另一个地址发送一个请求!
转发和重定向的区别:
发生在浏览器端还是服务器 浏览器的请求次数 浏览器地址栏是否发生变化 浏览器是否能够感知到
转发[request] 发生在服务器端 1 不发生变化 感知不到
重定向[response] 发生在浏览器端 2 发生变化 能感知到!