概述
上一篇提到原理是使用了java的SPI技术
java web项目是在容器运行,如tomcat,weblogic等
了解Tomcat的SPI机制
Tomcat容器在启动时会扫描项目中META-INF/service下面的javax.servlet.ServletContainerInitializer文件,文件中配置实现了ServletContainerInitializer接口的启动类,利用这一特性,我们可以去除掉web.xml,在容器启动是配置我们自己的启动类。
Servlet必须是3.0及其以上的版本
下面我们使用tomcat的这一特性 ,去除web.xml
1.新建maven web测试
创建完毕,默认web项目是有web.xml文件的,直接删除web.xml文件
2.pom.xml引入 servlet-api.jar
引入 servlet-api.jar scope设置为provided
不会打包到项目lib,项目在tomcat运行时 tomcat lib下已经有servlet-api.jar
如果开发阶段不引入servlet-api.jar ,包下的javax.servlet.ServletContainerInitializer 类找不到,无法实现该类
3.新建一个类实现servlet-api.jarx包下的javax.servlet.ServletContainerInitializer类
package com.wying.Web;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.Set;
/**
* description:实现servlet-api.jar包下的javax.servlet.ServletContainerInitializer class
* 重写onStartup方法 通过该方法配置 servlet 监听 等 代替 web.xml配置
* date: 2021/3/5
* author: gaom
* version: 1.0
*/
public class MyServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("MyServletContainerInitializer onStartup");
}
}
4.META-INF/service下新建javax.servlet.ServletContainerInitializer并编辑配置实现类com.wying.Web.MyServletContainerInitializer
5.配置tomcat 部署web项目
6.启动tomcat,控制台打印出
==============MyServletContainerInitializer onStartup=========
证明我们配置的spi已经生效,tomcat启动时已读取META-INF/service下面的javax.servlet.ServletContainerInitializer文件,并执行实现类的onStartup方法
7.浏览器访问项目测试
访问http://127.0.0.1:8082/JavaWebNoWebxmDemo/,成功读取到webapps默认的index.jsp文件
7.编写servlet,然后在onStartup方法中配置servlet ,代替web.xml配置
查看servletContext方法 , web.xml支持的配置,它肯定要支持,不然怎么取代web.xml..... 添加过滤器,监听器,servlet等方法都有
编写servlet
TestServlet
package com.wying.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* description:测试servlet 由于去除web.xml文件 该servlet在MyServletContainerInitializer 配置
* date: 2021/3/5
* author: gaom
* version: 1.0
*/
public class TestServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("=========TestServlet.init()=========");
super.init();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=========TestServlet.doGet()=========");
response.getWriter().write("TestServlet");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=========TestServlet.doPost()=========");
doGet(request, response);
}
}
onStartup配置servlet
package com.wying.Web;
import com.wying.servlet.TestServlet;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import java.util.Set;
/**
* description:实现servlet-api.jar包下的javax.servlet.ServletContainerInitializer class
* 重写onStartup方法 通过该方法配置 servlet 监听 等 代替 web.xml配置
* date: 2021/3/5
* author: gaom
* version: 1.0
*/
public class MyServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("==============MyServletContainerInitializer onStartup=========");
ServletRegistration.Dynamic testServlet=servletContext.addServlet("testServlet",new TestServlet());
testServlet.addMapping("/testServlet");
}
}
8.启动项目测试
浏览器访问servlet http://127.0.0.1:8082/JavaWebNoWebxmDemo/testServlet
第一次访问会执行 int初始化函数,并访问doGet(),后续不在执行init ,和web.xml配置的效果一样
监听器之类的配置查查文档都能配,但是我们实际上java web项目的spring框架都成标配,下一步学习sprng web项目无xml配置
最后
以上就是调皮百合为你收集整理的02)java web项目 使用spi技术 去除web.xml的全部内容,希望文章能够帮你解决02)java web项目 使用spi技术 去除web.xml所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复