20. Servlet3.0 新特性

servlet3.0新特性之注解

在JavaEE6规范中添加了了Servlet3.0 规范,该规范中允许在定义 Servlet、Filter 与 Listener 三大组件时使用注解,而不用在web.xml 进行注册了。Servlet3.0 规范允许 Web 项目没有 web.xml 配置文件
使用servlet3.0时需要jdk6+,tomcat7+

servlet注解

在3.0规范中使用@WebServlet()注解注册一个servlet,该注解中有多个属性,常用属性如下:

属性名类型说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
name String 相当于servlet-name的值
loadOnStartup int 相当于loadOnStartup,默认值为-1
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

例: 之前都是讲解2.5版本的 现在我们版本选择3.0,Eclipse 也可以打上勾勾让其允许创建web.xml :

简单版:

package Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/servlet3")            //允许这样 相当于只设置了urlPatterns 
public class servlet3 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

}
允许这样 相当于只设置了urlPatterns如果这样的话,那么如果有 getServletName 默认返回类名【全路径】 -可以自己试试

例2:
package Servlet;

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

import javax.servlet.ServletConfig;
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;

//value 和 urlPatterns 意义相同,但不能一起使用 二选一咯! 我们学过了 url是可以多个的。
//下面注解对应着表 自己认真看  和XML中的配置也是意义对应的 但是注意格式就好
@WebServlet(value = {"/servlet3","/servlet/33"},
        name = "ServletName",
        loadOnStartup = 1,
        initParams= {@WebInitParam(name = "user",value = "abc"),@WebInitParam(name = "name",value = "bi-hu")}
        )    
public class servlet3 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //我们可以尝试上面注解的各参数:
            ServletConfig config = this.getServletConfig();
        System.out.println("Servlet名称:" + config.getServletName());
        
        Enumeration<String> iniparaments = config.getInitParameterNames();
        while (iniparaments.hasMoreElements()) {
            String name = iniparaments.nextElement();
            System.out.println("Servlet初始化参数:Name:" + name + " Value:" + config.getInitParameter(name));
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

}

运行后是可以打印的 所以说  注解很方便


filter注解

在3.0 规范中使用@WebFilter()注解来注册当前的 Filter 类目前使用注解无法指定filter的执行顺序,其会默认根据filter的名字的字母顺序执行。该注解常用属性的类型与意义如下表所示:

属性名类型说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
filterName String 相当于filter-name的值
servletNames String[] 相当于filter-mapping的子标签servlet-name,用于指定要过滤的Servlet 名称
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

 例:
package Servlet;

import java.io.IOException;
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;
import javax.servlet.annotation.WebListener;

//@WebFilter("/*")        允许这样的啊  和Servlet 差不多的 这个意思是过滤全部网站  
@WebFilter(value = {"/*"},
        filterName = "过滤器的名字"
        )            
public class fliter3 implements Filter {

    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        chain.doFilter(request, response);
        
    }


    public void init(FilterConfig fConfig) throws ServletException {
        
    }

}

这玩意和Servlet的差不多  都差不多 甚至一样啊  这里不演示了


Listener注解

Servlet3.0 规范中使用@WebListener()注解来注册当前的 Listener 类。在 Web 工程中创建好 Listener 后,直接在类上添加@WebListener 注解即可完成 Listener 的注册
该注解有一个属性 value,表示对该监听器的描述,使用不多。

因为这玩意只有一个value属性  所以呢 我们还是演示一下吧:

package Servlet;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

//@WebListener //默认这样就完了 价格备注就下面那样:
@WebListener(value = "我是备注监听器的一个备注  次例子随便监听给个Request~~~")
public class Listener implements ServletRequestListener {
    public void requestDestroyed(ServletRequestEvent sre)  { 
    }

    
    public void requestInitialized(ServletRequestEvent sre)  { 
        System.out.println("saasddlaskdoiwj");
    }
}

最后的最后 我们来讲一下 

web.xml文件

在创建项目时注意选择servlet版本,创建时可以通过勾选生成web.xml文件,默认是不会生成的。
在生成的web.xml文件中的标签中有一个属性 metadata-complete,是布尔类型。其值为 true,表示可以完全使用 web.xml 中的注册信息,对 Servlet3.0 的注解将忽略。若值为 false,则表示可以使用注解, 但 web.xml 中的注册信息也起作用若一个组件类(Servlet、Filter 或 Listener)既使用了注解,又在 web.xml 中进行了注册,则对于不同的组件,其效果是不同的

    • 使用两种方式对于同一个 Servlet 进行注册,要求 web.xml 与注解中的 url-pattern 是不能重复的。否则,服务器无法启动。
    • 使用两种方式对于同一个 Filter 进行注册,无论 url-pattern 值是否相同,其效果都相当于一个 Filter。
    • 使用两种方式对于同一个 Listener 进行注册,其效果与使用一种方式注册完全相同。

 认真看下上面三种不同  但是!!!!!!!!!!!!

最最最主要的还是 没人人会两个一起  一般现在后面学框架的话 我就直接学注解了 不回去***的去配置那个emmmmmWeb.xml了啊!! JSP学习完毕!.

本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14878340.html

原文地址:https://www.cnblogs.com/bi-hu/p/14878340.html