告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
服务器软件:apache-tomcat-8.5.27



一. Servlet、Filter、Listener的注解方式是什么?

Servlet、Filter和Listener都支持使用注解的方式进行配置:

  • Servlet常用的注解是@WebServlet,可以在Servlet类上添加该注解并指定Servlet的url-pattern等属性来配置Servlet。
  • Filter常用的注解是@WebFilter,可以在Filter类上添加该注解并指定要过滤的url-pattern等属性来配置Filter。
  • Listener常用的注解是@WebListener,可以在Listener类上添加该注解来声明一个Listener。

二. 为什么要使用Servlet、Filter、Listener的注解方式?

主要原因:

替代原来配置文件web.xml的写法

使用注解的好处:

  1. 使开发更加方便和快速,相比于传统的在web.xml中配置相关节点,使用注解的方式可以将配置信息直接写在对应的类上,降低了配置的复杂性,也不用手动添加大量的xml节点,减少了出错的可能性
  2. 可以提高代码的可读性和可维护性,注解可以直接放在代码中,对于开发团队来说更容易理解,而且当应用有变化时,只需要修改对应的代码就可以了,无需再去寻找web.xml文件并修改其中的配置

三. 如何使用Servlet、Filter、Listener的注解方式?

3.1 Servlet的注解方式

3.1.1 常用用法

位置:

在Servlet实现类的上方写注解

语法:

//设置当前Servlet的名称为HelloServlet,访问其路径为/hello
@WebServlet(name="HelloServlet",value="/hello"

name:相当于配置文件的servlet-name的值
value:相当于配置文件的url-pattern

扫描二维码关注公众号,回复: 14983867 查看本文章

可以简写:

name可以省略,如果只剩下value属性,属性名可以省略,如 @Webservlet(“/hello”)

注意:

value属性和urlPatterns属性都可以用来指定Servlet能够处理的请求路径。
如果同时指定了两个属性,则以urlPatterns属性的值为准。

例如@WebServlet(name=“HelloServlet”,value=“/hello”,urlPatterns =‘’/first"),最终以/first作为访问路径**

3.1.2 案例

案例:使用Servlet的注解代替原来的web.xml映射Servlet,演示其效果

代码示例如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//设置HelloServlet的访问路径 :/hello
@WebServlet(name = "HelloServlet",value = "/hello")
public class HelloServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("访问了HelloServlet.......");
    }
}

在这里插入图片描述

在这里插入图片描述

3.2 Filter的注解方式

3.2.1 常用用法

位置:

在Filter实现类的上方写注解

语法:

//声明一个Filter,指定该Filter名为HelloFilter,指定了该Filter处理请求的url-pattern为"/hello"
@WebFilter(filterName="HelloFilter",urlPatterns="/hello")

filterName:相当于web.xml中的filter-name标签的值
urlPatterns:相当于web.xml中的url-pattern标签的值

注意:

value属性和urlPatterns属性都可以用来指定Servlet能够处理的请求路径。
如果同时指定了两个属性,则以urlPatterns属性的值为准。

3.2.2 案例

案例:使用F1lter注解代替原来的web.xml映射的形式设置HelloFilter的过滤路径,演示其效果

代码示例如下:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//设置HelloFilter的过滤路径:/hello
@WebFilter(filterName="HelloFilter",urlPatterns="/hello")
public class HelloFilter 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("HelloFilter放行前的代码...");
        filterChain.doFilter(servletRequest,servletResponse);//放行请求
        System.out.println("HelloFilter放行后的代码...");
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述

在这里插入图片描述

3.3 Listener的注解方式

3.3.1 常用用法

位置:

在 Listener实现类的上方写注解

语法:

@WebListener

ps:

此注解方式一般不用写属性值,且它默认只有一个属性value(默认属性值为空字符串)

3.3.2 案例

案例:使用Listener的注解代替原来的web.xml注册监听器的形式,演示其效果

代码示例如下:

@WebListener
public class MyListener implements ServletContextListener {
    
    
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    
    
        System.out.println("ServletContext对象创建后执行");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    
    
        System.out.println("ServletContext对象销毁后执行");
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/siaok/article/details/130354710