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

简介: 告别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

可以简写:

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对象销毁后执行");
    }
}

相关文章
|
25天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
79 44
|
4天前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
21 5
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1
|
5天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
7天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
25 2
WK
|
7天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
10 0
|
30天前
|
设计模式 测试技术 持续交付
开发复杂Web应用程序
【10月更文挑战第3天】开发复杂Web应用程序
33 2
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
41 3
|
9天前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
10 0