servlet   filter  listener  web.xml

DispatcherServlet  web.xml

后期 servlet3.0我们去除web.xml 通过注解方式

同时需要servlet7以上

创建web项目:

不需要生成web.xml了

此时是没有web.xml文件的

jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="hello"> hello </a>
</body>
</html>

servlet:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello");
} }

其他的注解 @WebFilter  @WebListener  @WebInitParam

接口:

public interface HelloService {

}

子类:

public interface HelloServiceExt extends HelloService {

}

实现类:

public class HelloServiceImpl implements HelloService {

}

抽象类:

public abstract class AbstractHelloService implements HelloService {

}

实现指定接口:

// 容器启动的时候会将@HandlesTypes指定的这个类下面的子类(实现类,子接口)传递过来
@HandlesTypes(value= {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer{ @Override
public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException {
System.out.println("感兴趣的类型:");
for(Class<?> clazz : arg0) {
System.out.println(clazz);
} }
}

创建目录结构:

写入全类名:

com.toov5.servlet.MyServletContainerInitializer

运行:

我们可以通过这个进行反射呢 可以获取反射后的对象

过程原理:

servlet容器启动会扫描当前应用里面的 每一个jar包

ServletContainerInitializer的实现

提供ServletCOntainerInitializer的实现类,必须绑定在 META-INF/servicesjavax.ServletContainerInitializer

文件的内容就是 ServletContainerInitializer实现类的全类名

总结: 容器在启动时候,会扫描当前应用每一个jar包里面

META-INF/services/javax.servlet.ServletContainerInitializer

指定的实现类,启动并运行这个实现类的方法; 插入感兴趣的类型

感兴趣的某个子类可以进行创建对象之类的

给 ServletContext 对象注册web容器的三大组件


使用ServletContext注册web组件的用法   web组件:Servlet、 Filter、 Listener  三大组件

如果是第三方的 原先可以通过配置web.xml进行设置

监听器:

//监听项目的启动和停止
public class UserListener implements ServletContextListener { //监听ServletContext销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("UserListener...contextDestroyed"); }
//监听ServletContext启动初始化
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("UserListener...contextInitialized"); } }

过滤器:

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 } }

servlet:

public class UserServlet extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("toov5");
} }

注册组件:

// 容器启动的时候会将@HandlesTypes指定的这个类下面的子类(实现类,子接口)传递过来
@HandlesTypes(value= {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer{ @Override
public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException {
System.out.println("感兴趣的类型:");
for(Class<?> clazz : arg0) {
System.out.println(clazz);
}
//注册组件
Dynamic servlet = (Dynamic) sc.addServlet("UserServlet", new UserServlet());
//配置Servlet的映射信息
servlet.addMapping("/user");
//注册Listener
sc.addListener(UserListener.class);
//注册Filter
javax.servlet.FilterRegistration.Dynamic filter = sc.addFilter("userFiter", UserFilter.class);
//配置Filter的映射信息
filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
}
}

监听到容器启动:

同时访问首页  filter也运行了

访问之:

拦截器被调用

servlet被触发执行

这样就使用了编码方式,在项目启动时候给ServletContext 里面添加组件

必须在项目启动时候添加

ServletContainerInitializer 得到 ServletContext

ServletContextListener 得到 ServletContext

Servlet3.0与Spring的更多相关文章

  1. Spring MVC3.2 通过Servlet3.0实现文件上传

    Servlet3.0规范增加了对文件上传的原生支持,这里记录一下Spring MVC3通过Servlet3上传文件的实现. 配置文件: applicationContext.xml <!-- s ...

  2. Spring之WebContext不使用web.xml启动 初始化重要的类源码分析(Servlet3.0以上的)

    入口: org.springframework.web.SpringServletContainerInitializer implements ServletContainerInitializer ...

  3. WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用

    本文转自http://hitmit1314.iteye.com/blog/1315816 大家应该都已经知道Spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spri ...

  4. Spring注解驱动开发(七)-----servlet3.0、springmvc

    ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描, ...

  5. Spring注解开发系列VII --- Servlet3.0

    Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...

  6. DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题

    上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ...

  7. springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的

    writedby 张艳涛 基于web.xml配置,有人说麻烦,tomcat给按照servlet3.0,实现了基于注解@WebServlet,有人说springmvc的springmvc.xml配置麻烦 ...

  8. Servlet3.0+springmvc5+log4j2正确的开启姿势(WebLookUp)

    前言 java社区占据市场份额比较大的日志组件由log4j 1.×,到logback,再到整合后的升级版 log4j 2.×,有网友测试后据说log4j2的性能最NB.于是开始往自己的springmv ...

  9. 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强

    l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { ...

随机推荐

  1. UIScrollView 去掉下面的滚动条

        [_scrollView setShowsHorizontalScrollIndicator:NO];

  2. PHP Version 7.0.13-0ubuntu0.16.04.1 mysql-server-5.7

    https://zh.wikipedia.org/wiki/Linux发行版 一个典型的Linux桌面发行版包括一个Linux 内核,来自GNU的工具和库,和附加的软件.文档,还有一个窗口系统,窗口管 ...

  3. 转:Java多线程学习(吐血超详细总结)

    版权声明:本文为博主林炳文Evankaka原创文章,转载请注明出处http://blog.csdn.net/evankaka 目录(?)[+] 林炳文Evankaka原创作品.转载请注明出处http: ...

  4. 如何在 windows 配置 libtorch c++ 前端库?

    如何在 windows 配置 libtorch c++ 前端库? 下载 pytorch 已经编译好的库: 此库不带 gpu,主要方便演示.支持 win7 win10 系统. 下载地址:https:// ...

  5. Python在向CSV文件写中文时乱码的处理办法

    前言 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode.当list.tuple.dict里面有中文时,打印出来的是Unicode编码,这个是无解的.对中文 ...

  6. 使用Standford coreNLP进行中文命名实体识别

    因为工作需要,调研了一下Stanford coreNLP的命名实体识别功能. Stanford CoreNLP是一个比较厉害的自然语言处理工具,很多模型都是基于深度学习方法训练得到的. 先附上其官网链 ...

  7. 转:C语言的编译链接过程的介绍

    11:42:30 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接 ...

  8. 013-HQL中级3-Hive四种数据导入方式介绍

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  9. nodejs 视频教程《一起学nodejs》

    一起学nodejs 讲师:   matthew vscode+nodejs4.6 http://list.youku.com/albumlist/show/id_27966955.html?spm=a ...

  10. JavaWeb—Base64编码(转载)

    基本概念 Base64这个术语最初是在“MIME内容传输编码规范”中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种“二进制到文本”的编码方法,它能够将给定 ...