• JavaWeb 之Servlet3.0新特性全解


    一、Servlet3.0 新增特性

      (1)注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;

      (2)支持Web模块;

      (3)Servlet异步处理;

      (4)文件上传API简化;

      注意:Tomcat 7以上的版本都支持Servlet 3.0,JavaEE 版本必须6.0以上才支持Servlet3.0,可以不创建 web.xml 文件。

    二、Servlet3.0 的注解

      1、注解

    @WebServlet :修饰Servlet类,用于部署该Servlet类。
    @WebFilter:修饰Filter类,用于部署该Filter类
    @WebInitParam:与@WebServlet或@WebFilter注解连用,为它们配置参数
    @MultipartConfig:修饰Servlet类,指定该Servlet类负责处理multipart/form-data类型的请求(主要用于处理上传文件)
    @ServletSecurity:修饰Servlet类,与JAAS(Java验证和授权API)有关的注解
    @HttpConstrait:与@ServletSecurity连用
    @HttpMethodConstrait:与@ServletSecurity连用
    

      

      2、代码案例

        (1)修饰servlet

        (2)修饰过滤器 Filter

        (3)修饰监听器 Listener

    @WebServlet 代码

     1 //
     2 // Source code recreated from a .class file by IntelliJ IDEA
     3 // (powered by Fernflower decompiler)
     4 //
     5 
     6 package javax.servlet.annotation;
     7 
     8 import java.lang.annotation.Documented;
     9 import java.lang.annotation.ElementType;
    10 import java.lang.annotation.Retention;
    11 import java.lang.annotation.RetentionPolicy;
    12 import java.lang.annotation.Target;
    13 
    14 @Target({ElementType.TYPE})
    15 @Retention(RetentionPolicy.RUNTIME)
    16 @Documented
    17 public @interface WebServlet {
    18     String name() default "";          //相当于<Servlet-name>
    19 
    20     String[] value() default {};       //代表urlPatterns()属性配置
    21 
    22     String[] urlPatterns() default {}; //相当于<url-pattern>
    23 
    24     int loadOnStartup() default -1;    //相当于<load-on-startup>
    25 
    26     WebInitParam[] initParams() default {};
    27 
    28     boolean asyncSupported() default false;
    29 
    30     String smallIcon() default "";
    31 
    32     String largeIcon() default "";
    33 
    34     String description() default "";
    35 
    36     String displayName() default "";
    37 }

    三、Servlet3.0 的Web模块支持

    原来一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差。现在可通过Web模块来部署管理它们。
    Web模块对应一个Jar包,即Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INFlib中。
    每个模块都有自己的配置文件,这个配置文件的名称为 web-fragment.xml 。
    制作一个Servlet模块的步骤:

    1. 正常编写Servlet,并编译;
    2. 将此编译class文件及所在包通过jar包命令打成jar包;
    3. 将此jar包用winrar打开,将META-INF中的manifest删除后添加 web-fragment.xml;
    4. 将此jar包放入WEB-INFlib中即可;

    web-fragment.xml说明:

    <web-fragment>为根元素;
    <name></name>表示模块名称(模块的唯一标识);
    <ordering></ordering>定义模块加载顺序的标签,当然可以不设置模块加载顺序;
    <before><others/></before>表示在所有模块前面加载(第一个加载);
    <after><name>A</name></after>表示在A模块后面加载;
    可以在里面部署listener、filter、servlet
    值得注意的是,web.xml中用<absolute-ordering>标签指定的模块加载顺序将会覆盖web模块的web-fragment.xml文件中指定的加载顺序。

    如何用myEclipse打jar包(有些人不知道)
    右键你web项目里的编写的servlet(或filter或listener)类——>Export…——>JAR file——>NEXT——>(Browse)填写导出名字和存放位置——>finish
    这样就生成了我们需要的jar包了

    示例:

    在web-fragment.xml里的配置和之前的web.xml里类似,如果是注解实现的servlet的配置,则在web-fragment.xml里就将不再写配置了,如果不是,则还需要写配置。
    打成jar包放在一个项目里面启动后,就可通过上面servlet注解配置的/basic.do路径访问上面的servle了。

    四、Servlet3.0提供的异步处理

      1、提供异步原因

        在以前的servlet中,如果作为控制器的servlet调用了一个较为耗时的业务方法,则servlet必须等到业务执行完后才会生成响应,这使得这次调用成了阻塞式调用,效率比较差。

      2、实现异步原理

        重新开一个线程单独去调用耗时的业务方法。

      3、配置servlet类成为异步的servlet类

      4、异步监听器

    异步监听器用来监听异步Servlet的异步处理事件,通过实现AsyncListener接口实现,代码如下:

      5、

    五、改进的ServletAPI(上传文件)

      1、改进内容

    HttpServletRequest增加了对上传文件的支持
    ServletContext允许通过编程的方式动态注册Servlet、Filter
    

      

      2、HttpServletRequest提供了如下两个方法处理文件的上传

    Part getPart(String name) 根据名称获取文件上传域
    Collection<Part> getParts() 获取所有文件上传域
    

      

      3、上传文件时一定要为表单域设置enctype属性,它表示表单数据的编码方式,有如下三个值:

        (1)application/x-www-form-urlencoded (默认),它只处理表单里的value属性值,它会将value值处理成URL编码方式。如果此时表单域里有上传文件的域(type=”file”),则只会获取该文件在上传者电脑里的绝对路径串,该串没什么实际意义。

        (2)multipart/form-data 此处编码方式会以二制流的方式来处理表单数据,此时会将文件内容也封装到请求参数里。

        (3)texst/plain 当表单的action属性为mailto:URL的形式时比较方便,主要适用于直接通过表单发送邮件的方式

      4、上传文件的Servlet需要加上@MultipartConfig注解

      5、通过request获取的Part对象就可以操作文件域了

      6、示例

     1 @WebServlet(name="uploadServlet",urlPatterns="/upload.do")
     2 @MultipartConfig
     3 public class UploaderServlet extends HttpServlet {
     4 
     5     public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
     6         //获得Par对象(每个Part对象对应一个文件域)
     7         Part part = request.getPart("file");
     8         long size = part.getSize(); //获取上传文件大小
     9         String info = part.getHeader("content-disposition");//获得包含原始文件名的字符串
    10         //获取原始文件名
    11         String fileName = info.substring(info.indexOf("filename="")+10,info.length()-1);
    12         //将文件上传到某个位置
    13         part.write(getServletContext().getRealPath("/uploadFiles")+"/"+fileName);
    14     }
    15 }

     

    ServletContext提供了如下方法动态注册Servlet、Filter

    addServlet(); 动态注册Servlet
    addFilter(); 动态注册Filter
    addListener(); 动态注册Listener
    setInitParameter(String name ,String value); 为Web应用设置初始化参数。
    

      


    原文链接:https://blog.csdn.net/zcl_love_wx/article/details/52075428

     

  • 相关阅读:
    第十一章关联容器
    第十章泛型算法
    第九章
    第八章
    阅读记录
    java.lang.Class阅读笔记
    java.time包阅读笔记
    CLion运行多个main函数
    c++中lower_bound和upper_bound中的comp参数
    如何写dfs
  • 原文地址:https://www.cnblogs.com/niujifei/p/15117362.html
Copyright © 2020-2023  润新知