作用:tomcat启动时,给ServletContext容器中注册组件
本文章需预先了解的知识点:
Java四大域对象:
根据有作用范围由小到大:
page(jsp有效)------》page域指的是pageContext.
request(一次请求)---》request域request HttpServletContext
session(一次会话)---》session域session HttpSession
application(当前web应用)---》application域指的是application ServletContext;
之所以他们是域对象,原因是他们都内置了map集合,都有setAttribute和getAttribute方法。
Web三大组件:
Servlet、Filter、Listener
ServletContext的获取方法:
1)、ServletContainerInitializer得到的ServletContext;tomcat容器启动的时候,会自动运行该实现类的onStartup方法;
2)、ServletContextListener得到的ServletContext;在监听事件的方法参数中获得arg0.getServletContext();
给ServletContext容器中注册组件流程:
1、tomcat启动时,会自动执行
META-INF/services/javax.servlet.ServletContainerInitializer文件中的内容
com.atguigu.servlet.MyServletContainerInitializer
2、新建MyServletContainerInitializer.java,注意看文中的注释
package com.atguigu.servlet;
import java.util.EnumSet;
import java.util.Set;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.HandlesTypes;
import com.atguigu.service.HelloService;
//容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类,子接口等)传递过来;
//传入感兴趣的类型;
@HandlesTypes(value={HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {
/**
* 应用启动的时候,会自动运行onStartup方法;
*
* Set<Class<?>> arg0:感兴趣的类型的所有子类型;
* ServletContext arg1:代表当前Web应用的ServletContext;一个Web应用一个ServletContext;
*
* 1)、使用ServletContext注册Web三大组件(Servlet、Filter、Listener)
* 2)、使用编码的方式,在项目启动的时候给ServletContext里面添加组件;
* 必须在项目启动的时候来添加;
* 1)、ServletContainerInitializer得到的ServletContext;
* 2)、ServletContextListener得到的ServletContext;
*/
@Override
public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException {
// TODO Auto-generated method stub
System.out.println("感兴趣的类型:");
for (Class<?> claz : arg0) {
System.out.println(claz);
}
//注册组件 ServletRegistration
ServletRegistration.Dynamic servlet = sc.addServlet("userServlet", new UserServlet());
//配置servlet的映射信息
servlet.addMapping("/user");
//注册Listener
sc.addListener(UserListener.class);
//注册Filter FilterRegistration
FilterRegistration.Dynamic filter = sc.addFilter("userFilter", UserFilter.class);
//配置Filter的映射信息
filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
}
}
3、编写 MyServletContainerInitializer.java中需要的类
3.1)@HandlesTypes(value={HelloService.class})需要新建HelloService接口及其子类,主要来测试容器启动时是否加载
3.2)UserServlet.java,当容器被访问时如果有响应表示容器启动加载成功,且以设置的/user进行访问
package com.atguigu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.getWriter().write("tomcat...");
}
}
3.3)UserListener.java 用来监听各种事件
package com.atguigu.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听项目的启动和停止
* @author lfy
*
*/
public class UserListener implements ServletContextListener {
//监听ServletContext销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("UserListener...contextDestroyed...");
}
//监听ServletContext启动初始化
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
ServletContext servletContext = arg0.getServletContext();
System.out.println("UserListener...contextInitialized...");
}
}
3.4)UserFilter.java 过滤器,在服务器有访问时先进行过滤,执行doFilter方法
package com.atguigu.servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class UserFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// 过滤请求
System.out.println("UserFilter...doFilter...");
//放行
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
3.5)测试,启动容器
容器启动后控制台打印:
访问/user
说明:user对象已被加入容器中
同时看过滤器是否执行:
说明:filter也执行了,说明UserFilter.java 对象也被加入容器中
关闭容器:
说明:监听事件起了作用 ,监听器被添加到了容器中
======以下于你或许是个好消息======
好消息就是:欢迎访问下面的博客网站哈哈哈......
网站名称:Java学习笔记网 (点击进入)
url:https://www.javaxxbj.com/ (点击进入)
网站特点:
- java主要网站的导航目录
- 你可以记录自己的博客,并可以控制显示和隐藏,可利于管理啦!!!
- 可以添加收藏各个网站的链接!!!
- 甚至也可以文章收藏,点赞,关注,查看我的消息等功能哦!!1
看一小点点的截图:
或可一试哦!