栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

javaweb没有web.xml设置方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javaweb没有web.xml设置方法

javaweb没有web.xml设置方法

有以下两种办法:

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> c 和 @HandlesTypes 注解在 demo 中我并未使用,感兴趣的朋友可以 debug 看看到底获取了哪些 class 。

这么声明一个 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() {

    }
}

需要引入依赖:


  javax.servlet
  javax.servlet-api
  3.1.0

2、使用注解WebServlet

此方法只针对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的依赖。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号