Java Web基础知识之Servlet容器初始化(无web.xml)
2017-08-25 09:38
836 查看
在之前典型的Java Web程序中,部署描述符
3.0中提出的一个接口
其中只有一个方法
实现
这个接口被设计在
如果要使用这个类,需要一个元数据文件来说明如何定位该接口的实现类,该文本文件在META-INF/services文件夹下,这个文本文件的名称为
1、构建
首先搭建依赖包工程,这里使用Maven管理工程,依赖项只需要一个,如下:
Maven项目目录如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/0848596d1b0f6637a2911a394b3f028e)
其中
可以看出
在
该实现类在Java Web应用启动时,会调用该方法,传递
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/8770cb7130a82b121a6f020a27a4d7c3)
在工程中必须有
这里我们定义一个
这个注解是在应用启动的时候被容器处理,并且都对应的servlet也可以通过相应的URL来访问;
在程序启动的过程中,会发现传递进来很多的servlet子类和Filter的实现类,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/3a68bec380cd29ee66b619ba185dffac)
其中也包括我们自定义的一个
web.xml是必不可少的,在这里我们需要配置各种组件,包括
Servlet、
Filter和
Listener等,如果使用过SpringMVC的话,应该会对在
web.xml中配置
org.springframework.web.servlet.DispatcherServlet十分熟悉。但是对于所有的配置文件都有的一个通病就是只有在程序部署的时候,一些配置项问题才能被发现,而不能在程序编译开发阶段就发现。所以如果通过编程的方法来设置配置项则是一个最好的选择,我们完全可以抛弃
web.xml这个部署描述符,而是换用从Servlet
3.0中提出的一个接口
javax.servlet.ServletContainerInitializer来完成Servlet容器的初始化,该接口的作用是当Web应用启动时,通知一些实现类来执行一些要求的
Servlet、
Filter和
Listener等的编程注册。
一、接口说明
ServletContainerInitializer接口细节:
其中只有一个方法
onStartup(...),在执行任何
ServletContext监听器之前,由Servlet容器调用这个方法,该方法的主要作用是注册Web对象;
实现
ServletContainerInitializer的类必须使用
@HandleTypes注解进行标注,以便声明
onStartup(...)可以处理这个类的实例,所有该类、包括它的子类都会被传递给其中的
Set<Class<?>> c字段,如果没有这个注解,或者在该注解中使用的类不存在或没有相应的子类,则会传递给该参数一个
null值;
这个接口被设计在
jar文件中使用,而无法直接在
war包中直接使用,而是通过在
jar中完成定义,然后将
jar包作为Java Web的依赖包,该接口的实现类会通过Java的
SPI的注册查询机制被发现;
如果要使用这个类,需要一个元数据文件来说明如何定位该接口的实现类,该文本文件在META-INF/services文件夹下,这个文本文件的名称为
javax.servlet.ServletContainerInitializer,其中的内容是该接口的实现类的全限定名;
二、编程实现
1、构建jar
依赖包
首先搭建依赖包工程,这里使用Maven管理工程,依赖项只需要一个,如下:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>1
Maven项目目录如下:
其中
ServletContainerInitializer的实现类为
com.demo.CustomServletContainerInitializer,为了在jar中加入
META-INF/services文件夹,只需要将该文件夹直接放到
maven的资源文件夹
resources下即可,在打包的时候就会在jar中实现该文件夹,并包括之前的文件;
可以看出
META-INF/services文件夹中的文本文件名为
javax.servlet.ServletContainerInitializer,其中的内容为
com.demo.CustomServletContainerInitializer,为该接口的实现类;
在
CustomServletContainerInitializer中的实现如下:
@HandlesTypes({HttpServlet.class}) public class CustomServletContainerInitializer implements ServletContainerInitializer { public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException { for(Class<?> clazz: c){ System.out.println(clazz.getName()); } } }1
该实现类在Java Web应用启动时,会调用该方法,传递
HttpServlet类以及其子类。
2、构建Java Web程序
Java Web程序的工程目录如下:在工程中必须有
webapp这个目录,如果没有则会导致异常
java.lang.IllegalArgumentException: Document base ... src\main\webapp does not exist or is not a readable directory;
这里我们定义一个
Servlet类
TestServlet,通过使用注解
@javax.servlet.annotation.WebServlet来标识这个
Servlet,代码如下:
@WebServlet(urlPatterns = "/testServlet", name = "testServlet") public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer writer = resp.getWriter(); writer.write("do get"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer writer = resp.getWriter(); writer.write("do post"); } }1
这个注解是在应用启动的时候被容器处理,并且都对应的servlet也可以通过相应的URL来访问;
在程序启动的过程中,会发现传递进来很多的servlet子类和Filter的实现类,如下:
其中也包括我们自定义的一个
TestServlet。
相关文章推荐
- Java Web基础知识之Servlet容器初始化(无web.xml)
- Java Web基础知识之Servlet容器初始化(无web.xml)
- javaweb基础知识整合和servlet简介
- Servlet基础知识(二)——web.xml文件的作用
- Java Web基础知识之Servlet(2):深入Servlet——HttpServlet
- 电商之梳理servlet知识---javaweb基础
- JavaWeb基础: XML基础知识
- Java Web基础知识之Servlet(1):初识Servlet
- java-web之servlet基础知识梳理(一)
- JAVA基础(三) web.xml 中的listener、 filter、servlet 加载顺序及其详解
- 【Java.Web】Servlet —— Servlet容器的启动及Servlet创建及初始化,容器默认的Servlet
- Java Web基础知识之Listener:监控Servlet的每个动作
- javaweb_关于Servlet一些基础知识笔记
- 【JavaWeb】基础知识总结03 Servlet
- JavaWeb基础知识点之Servlet
- 【JavaWeb】基础知识总结Servlet
- Java Web基础知识之Servlet(1):初识Servlet
- Listener、Filter、Servlet与Java Web项目初始化的工作
- jsp/java web基础知识回顾
- java web.xml listener filter servlet