3大web组件是什么
3大web组件指的是Servlet、Listener、Filter
Servlet
- Servlet本质上就是java程序
- 只有实现Servlet接口,就可以说是一个Servlet
- Servle可以说是整个web开发的基石,包括Springmvc也是基于servlet开发的
Listener监听器
- 作用:监听某种变化(对象创建、销毁),当发送变化时做出相应的变化
- 实现监听器的接口就可以声明为listener,Web提供的监听器一共有8种,例如ServletContextListener,ServletContextAttributeListener
Filter过滤器
- 作用:拦截请求,过滤响应
- 通过实现Filter接口可以将一个类声明为过滤器
SpringBoot注入web三大组件
- 方案一:@ServletComponentScan + @WebFilter/@WebListener/@WebServlet
//在启动类中声明@ServletComponentScan并传入要扫描的包的范围
@ServletComponentScan(basePackages = "com.servlet")
@SpringBootApplication
public class application {
public static void main(String[] args) {
ApplicationContext ioc = SpringApplication.run(application.class, args);
}
}
@WebServlet(urlPatterns = "/abc")
public class servlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget.....");
}
}
@WebListener(value = "/*")
public class listener01 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听器init()");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听器destroy()");
}
}
@WebFilter(urlPatterns = "/*")
public class filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器init...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器dofilter...");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器destroy...");
}
}
- 方案二:
@Configuration
public class registerConfig {
//servlet注入方式2
@Bean
public ServletRegistrationBean servlet() {
servlet servlet = new servlet();
return new ServletRegistrationBean(servlet, "/servlet01");
}
@Bean
public FilterRegistrationBean filter() {
//filter注入方式2
filter filter = new filter();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
//指定拦截范围
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean listener() {
//listener注入方式2
listener listener = new listener();
ServletListenerRegistrationBean listenerRegistrationBean = new ServletListenerRegistrationBean(listener);
return listenerRegistrationBean;
}
}
public class servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget.....");
}
}
public class listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听器init()");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听器destroy()");
}
}
public class filter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器init...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器dofilter...");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器destroy...");
}
}
原生Servlet与DispacterServlet的区别
- 两者都是Servlet,都实现了Servlet接口
不同的是两者的继承体系树不一样,DispacterServlet有着更多的继承父类,那么就代表着他的功能就更加的强大 - 原生Servlet与DispacterServlet是同一级别的概念,又或者说他们是两条不同的分支,选择了DispacterServlet就不能走原生Servlet
- 两者的执行流程也是不一样的
- 原生servlet走的流程是:初始化init() -> 服务service() -> 销毁destroy()这样一个声明周期
- DispacterServlet走的流程:dispacterServlet -> 映射器 -> 适配器 -> handler -> 视图处理器 -> 视图渲染view -> 客户端返回值
- 优先级匹配问题:
- 在Springmvc中DispacterServlet拦截的请求范围是 / ,优先级最低
- 而原生Servlet一般是精准匹配,优先最高
- 优先级排位:精准匹配 > 模糊匹配 > 全部拦截
自定义监听器
一个自定义监听器需要满足3个条件
- 事件
- 监听器
- 发布器
//方案一:
//事件
//被监听的事件必须实现ApplicationEvent接口
@Data
public class Obj extends ApplicationEvent {
String Message;
public Obj(Object source, String message) {
super(source);
this.Message = message;
}
}
//监听器
//监听器需实现ApplicationListener接口,并指定监听对象
@Component
public class myListener implements ApplicationListener<Obj> {
@Override
public void onApplicationEvent(Obj event) {
//联动触发事件
System.out.println("Obj...."+event.Message);
}
}
//事件发布器
@Component
public class EventPublisher {
@Resource
ApplicationContext applicationContext;
public void publish(ApplicationEvent applicationEvent){
//发布事件
applicationContext.publishEvent(applicationEvent);
}
}
//启动类
@SpringBootApplication
public static void main(String[] args) {
ApplicationContext ioc = SpringApplication.run(application.class, args);
//获取事件发布器
EventPublisher publisher = ioc.getBean(EventPublisher.class);
//创建事件
Obj obj = new Obj(publisher,"中国");
//发布事件
publisher.publish(obj);
}
//方式二:
//事件
//被监听的事件必须实现ApplicationEvent接口
@Data
public class Obj extends ApplicationEvent {
String Message;
public Obj(Object source, String message) {
super(source);
this.Message = message;
}
}
//监听器
@Component
public class myListener implements ApplicationListener<Obj> {
@Override
public void onApplicationEvent(Obj event) {
//联动触发事件
System.out.println("Obj...."+event.Message);
}
}
//启动类 兼 发布器
@SpringBootApplication
public class application {
public static void main(String[] args) {
ConfigurableApplicationContext ioc = SpringApplication.run(application.class, args);
//发布事件
ioc.publishEvent(new Obj(new Object(),"你好"));
}
}