编译软件: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的写法
使用注解的好处:
- 使开发更加方便和快速,相比于传统的在web.xml中配置相关节点,使用注解的方式可以将配置信息直接写在对应的类上,降低了配置的复杂性,也不用手动添加大量的xml节点,减少了出错的可能性
- 可以提高代码的可读性和可维护性,注解可以直接放在代码中,对于开发团队来说更容易理解,而且当应用有变化时,只需要修改对应的代码就可以了,无需再去寻找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对象销毁后执行"); } }