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...");
  }
}

测试结果如下:


目录
相关文章
|
5天前
|
SQL 前端开发 关系型数据库
考古Servlet+JDBC实现简约的登录注册界面
考古Servlet+JDBC实现简约的登录注册界面
10 1
|
5月前
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
58 8
|
17天前
|
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)。
21 5
|
5月前
|
前端开发 Java 容器
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
59 0
|
5月前
|
缓存 Java Spring
servlet/filter/listener/interceptor区别与联系
servlet/filter/listener/interceptor区别与联系
38 0
|
29天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
21 1
|
29天前
|
Java
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
19 0
|
2月前
使用Servlet上传多张图片——前台页面层(Index.jsp)
使用Servlet上传多张图片——前台页面层(Index.jsp)
14 0
|
6天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
29天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
8 0