有以下两种办法:
1、实现接口ServletContainerInitializer新增一个 CustomServletContainerInitializer ,它实现了javax.servlet.ServletContainerInitializer 接口,
用来在 web 容器启动时加载指定的 servlet 和 filter,代码如下:
public class CustomServletContainerInitializer implements ServletContainerInitializer {
// /hello就是在web.xml中servlet-mapping节点中注册的访问接口地址
private final static String JAR_HELLO_URL = "/hello";
@Override
public void onStartup(Set> c, ServletContext servletContext) {
System.out.println("创建 helloWorldServlet...");
ServletRegistration.Dynamic servlet = servletContext.addServlet(
// HelloWorldServlet为需要注册的业务类
HelloWorldServlet.class.getSimpleName(),
HelloWorldServlet.class);
// 添加地址映射
servlet.addMapping(JAR_HELLO_URL);
System.out.println("创建 helloWorldFilter...");
FilterRegistration.Dynamic filter = servletContext.addFilter(
HelloWorldFilter.class.getSimpleName(), HelloWorldFilter.class);
EnumSet dispatcherTypes = EnumSet.allOf(DispatcherType.class);
dispatcherTypes.add(DispatcherType.REQUEST);
dispatcherTypes.add(DispatcherType.FORWARD);
filter.addMappingForUrlPatterns(dispatcherTypes, true, JAR_HELLO_URL);
}
}
对上述代码进行一些解读。ServletContext 我们称之为 servlet 上下文,它维护了整个 web 容器中注册的 servlet,filter,listener,以 servlet 为例,可以使用 servletContext.addServlet 等方法来添加 servlet。而方法入参中 Set
这么声明一个 ServletContainerInitializer 的实现类,web 容器并不会识别它,所以,需要借助 SPI 机制来指定该初始化类,这一步骤是通过在项目路径下创建 META-INF/services/javax.servlet.ServletContainerInitializer 来做到的,它只包含一行内容:
# 这个是CustomServletContainerInitializer类的全路径名称 com.jxy.init.CustomServletContainerInitializer
下面贴上HelloWorldServlet和HelloWorldFilter的代码:
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.println("hello world");
}
}
public class HelloWorldFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("触发 hello world 过滤器...");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
需要引入依赖:
2、使用注解WebServletjavax.servlet javax.servlet-api 3.1.0
此方法只针对servlet3.0及以上版本,代码如下:
@WebServlet("/test")
public class AnnotationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.println("AnnotationServlet");
}
}
3、仍需要web.xml的情况
即使使用Servlet 3.0中引入的所有功能,在一些用例中,我们仍然需要一个web.xml文件,其中包括:
-
我们无法使用批注定义过滤器顺序-如果我们需要按特定顺序应用多个过滤器,则仍然需要部分。
-
要定义 会话超时,我们仍然需要使用部分。
-
对于基于容器的授权,我们仍然需要元素。
-
要指定欢迎文件,我们仍然需要一个部分
或者,Servlet 3.0也通过ServletContainerInitializer引入了一些编程支持,这也可以填补其中的一些空白。意思是使用注解加ServletContainerInitializer的方式可以摆脱javaweb程序对web.xml的依赖。



