zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Win10创意者更新秋季版激活秘籍
    将刷了Android的Lumia恢复为WP系统
    给Lumia 520/521/525/526/720刷Android系统
    DNS解析
    遍历对象目录
    PE注入
    利用NtCreateThreadEx注入
    利用CreateRemoteThread注入
    APC注入
    SetWindowHookEx()注入
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14878340.html
Copyright © 2011-2022 走看看