Servlet编程专题10之Servlet3.0注解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet编程专题10之Servlet3.0注解相关的知识,希望对你有一定的参考价值。

-  Servlet3.0规范是JavaEE6.0规范中的子规范。其要求运行环境最低是JDK6.0,Tomcat7.0。而之前学习的是Servlet2.5版本的规范,其是JavaEE5.0规范的子规范。其要求运行环境最低是JDK5.0,Tomcat5.0。

-  在Eclipse中使用Serlvet3.0规范,则需要在创建动态Web工程时就要指定。其具体用法是,在Eclipse中创建动态Web工程时,指定创建的“动态Web模块版本”为3.0版本。此时创建的Web工程中默认是没有web.xml文件的。


1、Servlet3.0的注解:

-  Servlet3.0中允许在定义Servlet、Filter与Listener三大组件时使用注解,而不用在web.xml进行注册。Servlet3.0规范允许Web项目没有web.xml配置文件。

a、Servlet3.0规范中使用@WebServlet()注解来注册自定义的Servlet类。该注解具有多个属性,常用属性的类型与意义如下表所示:(需要注意的是,能够省略的只有value属性,其他属性一概不能够省略)

技术分享


-  示例代码:

-  使用@WebServlet()注解自定义Servlet类:

package com.geeklicreed.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//@WebServlet("/someServlet") 此处完整写法为:@WebServlet(value="/someServlet")
/*
@WebServlet(value={"/some","/xxx", "/yyy"}) 
这种写法可以使用http://localhost:8080/annotation-servlet/xxx、
http://localhost:8080/annotation-servlet/yyy和
http://localhost:8080/annotation-servlet/yyy三种方式访问这个Servlet
*/
@WebServlet(value="/some", //设置属性urlPattern与属性value功能相同
            name="some-servlet", //设置ServletName
            initParams={@WebInitParam(name="username", value="geeklicreed"),  //设置初始化参数
            @WebInitParam(name="password", value="888888")},
            loadOnStartup=2  //默认是-1,如果设置为大于0,则在应用启动时创建Servlet实例(参看之前专题)
        )
public class SomeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //获取ServletName
        String servletName = this.getServletName();
        //获取初始化参数
        Enumeration<String> names = this.getInitParameterNames();
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.append("Servlet at Servlet3.0 <br/>");
        out.append("servletName = " + servletName + "<br/>");
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = this.getInitParameter(name);
            out.print(name + " = " + value + "<br/>");
        }
        
    }
}

-  启动web应用,访问该servlet,在浏览器中的显示结果如下:

技术分享

-  需要注意的是,如果注解编写错误(如value="some"),则会无法启动tomcat服务器。

技术分享


b、Servlet3.0规范中使用@WebFilter()注解来注册自定义的Filter类。该注解具有多个属性,常用属性的类型与意义如下表所示:

技术分享


-  示例代码:

-  使用@WebFilter()注解自定义Filter类:

package com.geeklicreed.fillter;

import java.io.IOException;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class SomeFilter implements Filter {

    public SomeFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //System.out.println("执行Servlet前的请求过滤代码");
        chain.doFilter(request, response);
        //System.out.println("执行Servlet后的响应过滤代码");
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

-  启动web应用,可以发现已经在控制台中打印如下内容:

技术分享


c、Servlet3.0规范中使用@WebListener注解来注册自定义的Listener类。(该注解没有任何属性,在自定义Listener类中使用@WebListener注解即可)

-  示例代码:

-  使用@WebListener注解自定义Listener类:

package com.geeklicreed.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyServletContextListener implements ServletContextListener {

    public MyServletContextListener() {
    }

    public void contextDestroyed(ServletContextEvent sce) {
    }

    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("应用启动");
    }
    
}

-  当应用启动时,可以看到控制台打印如下信息,说明该Listener已经起作用:

技术分享


d、采用Servlet2.5规范的web.xml配置和Servlet3.0的注解两种方式同时存在的情况,需要注意的问题:

-  注册Servlet:若两种方式的url-pattern值相同,则应用无法启动;若两种方式的url-pattern值不同,那么相当于该Servlet具有两个url-pattern。

-  注册Filter:若对于Filter采用这两种方式同时进行注册,无论url-pattern的值是否相同,其都是作为两个独立的Filter出现的。

-  注册Listener:若对于Listener采用这两种方式同时进行注册,其仅仅相当于一个Listener。

-  <web-app/>中的属性metadata-complete的值若为true,则表示对三大组件的注册方式,只有web.xml的注册起作用,将忽略注解的注册;若为false,则表示两种注册方式同时起作用。(默认)




本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1977779

以上是关于Servlet编程专题10之Servlet3.0注解的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解驱动开发-AOPTx和Servlet3.0

spring boot基础之servlet3.0和spring4.x零配置相关文章

Servlet3.0新特性之web-fragment.xml模块化配置文件

Servlet3.0学习总结——使用注解标注Servlet

Servlet3.0

转载 Servlet3.0中使用注解配置Servle