Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件

简介: Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件

【1】Servlet3.0前

① Servlet实例

实例代码如下,通常继承HttpServlet

public class HelloWorld extends HttpServlet {
  private String message;
  public void init() throws ServletException {
      // 执行必需的初始化
      message = "Hello World";
  }
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException {
      // 设置响应内容类型
      response.setContentType("text/html");
      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  public void destroy() {
      // 什么也不做
  }
}

web.xml配置如下:

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app> 

② Filter实例

实例类如下,通常继承Filter

public class UserFilter implements Filter {
  @Override
  public void destroy() {
    // TODO Auto-generated method stub
  }
  @Override
  public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
      throws IOException, ServletException {
    // 过滤请求
    System.out.println("UserFilter...doFilter...");
    //放行
    arg2.doFilter(arg0, arg1);
  }
  @Override
  public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
  }
}

web.xml配置如下:

 <filter>  
      <filter-name>FilterTest</filter-name>  
      <filter-class>com.web.UserFilter</filter-class>  
  </filter>  
  <!--映射过滤器-->  
  <filter-mapping>  
      <filter-name>FilterTest</filter-name>  
      <!--“/*”表示拦截所有的请求 -->  
      <url-pattern>/*</url-pattern>  
  </filter-mapping>  

③ Listener

按监听的对象划分,可以分为

  • ServletContext对象监听器
  • HttpSession对象监听器
  • ServletRequest对象监听器


按监听的事件划分


  • 对象自身的创建和销毁的监听器
  • 对象中属性的创建和消除的监听器
  • session中的某个对象的状态变化的监听器


对应类如下:

javax.servlet.ServletContextListener
javax.servlet.ServletContextAttributeListener
javax.servlet.ServletRequestListener
javax.servlet.ServletRequestAttributeListener
javax.servlet.http.HttpSessionListener
javax.servlet.http.HttpSessionAttributeListener


实例代码如下:

public class UserListener implements ServletContextListener {
  //监听ServletContext销毁
  @Override
  public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("UserListener...contextDestroyed...");
  }
  //监听ServletContext启动初始化
  @Override
  public void contextInitialized(ServletContextEvent arg0) {
    ServletContext servletContext = arg0.getServletContext();
    System.out.println("UserListener...contextInitialized...");
  }
}


web.xml配置如下:

<listener>
  <listener-class>com.web.UserListener</listener-class>
</listener>

【2】Servlet3.0新特性

Servlet3.0提供了注解支持,可以不用使用web.xml配置。


① @WebServlet

其参数如下:


注解实例如下:

@WebServlet(name="helloServlet",urlPatterns={"/hello"},
initParams={@WebInitParam(name="age",value="11")})

实例类如下:

@WebServlet(name="helloServlet",urlPatterns={"/hello"},initParams={@WebInitParam(name="age",value="11")})
public class HelloServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String age = getServletConfig().getInitParameter("age");
    System.out.println("age-->"+age);
    System.out.println(Thread.currentThread()+" start...");
    try {
      sayHello();
    } catch (Exception e) {
      e.printStackTrace();
    }
    resp.getWriter().write("hello...");
    System.out.println(Thread.currentThread()+" end...");
  }
  public void sayHello() throws Exception{
    System.out.println(Thread.currentThread()+" processing...");
//    Thread.sleep(3000);
  }
}


测试结果如下:

age-->11
Thread[http-apr-8080-exec-12,5,main] start...
Thread[http-apr-8080-exec-12,5,main] processing...
Thread[http-apr-8080-exec-12,5,main] end...


② @WebFilter

其参数如下:


实例类如下:

@WebFilter(urlPatterns={"/*"})
public class UserFilter implements Filter {
  @Override
  public void destroy() {
    // TODO Auto-generated method stub
  }
  @Override
  public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
      throws IOException, ServletException {
    // 过滤请求
    System.out.println("UserFilter...doFilter...");
    //放行
    arg2.doFilter(arg0, arg1);
  }
  @Override
  public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
  }
}

测试结果如下:

注意哦,这里先执行了过滤器,后执行了servlet。那如果是多个过滤器且chain.doFilter(request,response);前后都有数据呢?以FirstFilter和SecondFilter为例,次序如下:

logger.info("FirstFilter......begin");
firstFilterChain.doFilter(request, response);
logger.info("SecondFilter......begin");
secondFilterchain.doFilter(request,response);
logger.info("SecondFilter......end");
logger.info("FirstFilter......end");

③ @WebListener

其注解源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebListener {
    /**
     * @return description of the listener, if present
     */
    String value() default "";
}

实例代码如下:

@WebListener
public class UserListener implements ServletContextListener {
  //监听ServletContext销毁
  @Override
  public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("UserListener...contextDestroyed...");
  }
  //监听ServletContext启动初始化
  @Override
  public void contextInitialized(ServletContextEvent arg0) {
    ServletContext servletContext = arg0.getServletContext();
    System.out.println("UserListener...contextInitialized...");
  }
}

测试结果如下:


目录
相关文章
|
SQL 前端开发 关系型数据库
考古Servlet+JDBC实现简约的登录注册界面
考古Servlet+JDBC实现简约的登录注册界面
174 1
|
Java 应用服务中间件 数据库
Servlet实现注册登录列表页面及其相互跳转功能
Servlet实现注册登录列表页面及其相互跳转功能
145 1
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
12月前
|
前端开发 Java 数据库
玩转springboot之springboot注册servlet
在Spring Boot中注册Servlet非常灵活,可以通过 `@WebServlet`注解快速注册,也可以通过 `ServletRegistrationBean`进行细粒度控制。通过这两种方式,可以满足各种场景下的需求,确保应用能够高效处理HTTP请求。
1035 14
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
|
NoSQL Java Redis
深入理解Servlet Filter及其限流实践
深入理解Servlet Filter及其限流实践
322 44
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
前端开发 Java 开发工具
servlet技术--使用注解模拟用户登录实现页面跳转
该文章介绍了Servlet技术的使用,通过注解方式开发Servlet来模拟用户登录功能,并在登录成功后实现页面跳转,展示用户的用户名和密码。
servlet技术--使用注解模拟用户登录实现页面跳转
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
|
Unix Java 编译器
Servlet 教程 之 Servlet 环境设置 3
在Windows和Unix上配置Servlet环境涉及设置CLASSPATH。在Windows的`autoexec.bat`或&quot;环境变量&quot;中添加CATALINA路径和`servlet-api.jar`。在Unix的`.cshrc`文件中设置相同环境变量。别忘了将开发目录也添加到CLASSPATH。例如:`C:\ServletDevel`(Windows)或`/user/ServletDevel`(UNIX)。
112 5