Servlet3.0中的web组件注册

Servlet3.0中的注册

1.依赖

TomCat官网标准:
在这里插入图片描述
导入maven依赖:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>   <!--这里的版本不能低于3.0-->
    <scope>provided</scope>
</dependency>

2.Servlet注册

定义一个servlet,通过注解将其注入到Servlet容器中

  • 使用@WebServlet注解标识该类
    • name属性对应xml中servlet标签的servlet-name属性
    • urlPatterns属性对应servletMapping标签中的url-pattern属性,可以指定一个也可以指定多个
    • loadOnStartUp属性对应servlet标签的loadOnStartUp属性
    • initParams属性对应servlet标签中的init-param属性
@WebServlet(name = "abc",urlPatterns ="/abc" ,loadOnStartup = 2,
        initParams = {
            @WebInitParam(name = "cs1",value = "z1"),
            @WebInitParam(name = "cs2",value = "z2")
})
public class DemoServlet extends HttpServlet {
    //用来获取init参数
    @Override
    public void init() throws ServletException {
        System.out.println(this.getInitParameter("cs1"));
        System.out.println(this.getInitParameter("cs2"));
    }
    //构造方法,用来检验loadOnStartUp
    public DemoServlet() {
        System.out.println("demo被实例化");
    }
    //配合urlPatterns表示请求地址
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("demo servlet");
    }
}

显示结果:
在这里插入图片描述
在这里插入图片描述

3.Listener注册

  • 使用@WebListener注解标识该类
  • 该类实现对应的监听器接口
@WebListener
public class DemoListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext被创建");

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext被销毁");

    }
}

在这里插入图片描述
在这里插入图片描述

4.Filter注册

  • 使用@WebFilter注解标识该类
    • filterName属性对应xml中filter标签的name属性
    • urlPatterns属性对应filter标签的url-pattern属性
    • initParams属性对应init-param标签
  • 实现Filter接口
@WebFilter(filterName = "aaa",urlPatterns = "/abc",
        initParams ={
            @WebInitParam(name = "f1",value="ff1"),
            @WebInitParam(name = "f2",value="ff2"),
        } )
public class DemoFilter implements Filter {
    //初始化获取Init参数
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(filterConfig.getInitParameter("f1"));
        System.out.println(filterConfig.getInitParameter("f2"));

    }
    //拦截后放行
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request,response);
    }
    //销毁
    @Override
    public void destroy() {
        System.out.println("Filter destory");
    }
}

在这里插入图片描述
在这里插入图片描述

5.动态注册web组件

web组件的优先级:Listener—>Filter—>Servlet
动态注册web组件主要适用于第三方开发的web组件,我们没办法直接加web注解
通过ServletContext对象来注册
在这里插入图片描述

  • 创建时机:
    • 在ServletContextListener中进行创建,限制性是没办法新增ServletContextListener

模拟第三方监听器

public class Demo3Listener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Demo3SessionListener创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Demo3SessionListener销毁");
    }
}

ServletContextListener监听器进行加载


@WebListener
public class Demo2Listener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        servletContext.addListener(Demo3Listener.class);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

在servlet中获取session(目的是防止session对象没有被创建)

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        resp.getWriter().write("demo servlet");
    }

显示结果:
在这里插入图片描述

模拟第三方过滤器


public class Demo2Filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Demo2Filter被创建");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("Demo2Filter被销毁");
    }
}
@WebListener
public class Demo2Listener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        //新增Filter
        FilterRegistration.Dynamic demo2 = servletContext.addFilter("Demo2", Demo2Filter.class);
        //放置参数
        Map initParam = new HashMap();
        initParam.put("2f","fff2");
        //传递init参数
        demo2.setInitParameters(initParam);
        //dispatcherTypes设置为null时默认为DispatcherType.REQUEST
        demo2.addMappingForUrlPatterns(null,false,"/abc");
    }

显示结果:
在这里插入图片描述

在这里插入图片描述
模拟第三方servlet

public class Demo2Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("Demo2Servlet被创建");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void destroy() {
        System.out.println("Demo2Servlet被销毁");
    }
}
@WebListener
public class Demo2Listener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        //放置参数
        Map initParam = new HashMap();
        initParam.put("2f","fff2");
        //新赠servlet
        ServletRegistration.Dynamic demo21 = servletContext.addServlet("demo2", Demo2Servlet.class);
        //设置启动时机
        demo21.setLoadOnStartup(2);
        //设置init参数
        demo21.setInitParameters(initParam);
        //设置请求路径
        demo21.addMapping("/abc");
    }

在这里插入图片描述
在这里插入图片描述
* ServletContainerInitializer 新增API
创建自己的 DemoServletContainerInitializer实现ServletContainerInitializer接口

public class DemoServletContainerInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
    	 //创建Listener
        ctx.addListener(DemoListener.class);
        //新增Filter
        FilterRegistration.Dynamic demo2 = ctx.addFilter("Demo2", Demo2Filter.class);
        //放置参数
        Map initParam = new HashMap();
        initParam.put("2f","fff2");
        demo2.setInitParameters(initParam);//传递init参数
        //dispatcherTypes设置为null时默认为DispatcherType.REQUEST
        demo2.addMappingForUrlPatterns(null,false,"/abc");


        //新赠servlet
        ServletRegistration.Dynamic demo21 = ctx.addServlet("demo2", Demo2Servlet.class);
        //设置启动时机
        demo21.setLoadOnStartup(2);
        //设置init参数
        demo21.setInitParameters(initParam);
        //设置请求路径
        demo21.addMapping("/abc");

    }
}

DemoListener

public class DemoListener implements ServletContextListener   {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext被创建");

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext被销毁");

    }

}

Filter

public class Demo2Filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Demo2Filter被创建");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("Demo2Filter被销毁");
    }
}

servlet

public class Demo2Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("Demo2Servlet被创建");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void destroy() {
        System.out.println("Demo2Servlet被销毁");
    }
}

在这里插入图片描述

在文件中写入自己创建的实现类的全包名
在这里插入图片描述
显示结果:
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值