Servlet 3.0 介绍

1. 概述

  • 注解代替 web.xml 配置文件
  • 异步处理
  • 对上传的支持

2. 注解代替 web.xml 配置文件

  1. 使用方法
    • 在 Servlet 类上添加 @WebServlet(urlPatterns={"/AServlet"})
    • 在 Filter 类上添加 @WebFilter(urlPatterns={"/AFilter"})
    • 在 Listener 类上添加 @WebListener
  2. 优缺点
    • 优点:配置信息较少.
    • 缺点:不方便修改.

3. 异步处理

  1. 什么是异步处理
    以前,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果!
    现在,在服务器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束!

  2. 实现异步的步骤

// 使用异步之前
    @WebServlet("/AServlet")
    public class AServlet extends HttpServlet{

        public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{

            response.getWriter().println("hello");
            response.getWriter().flush();
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){

            }
            response.getWriter().println("world!");
            response.getWriter().flush();
        }
    }

// 使用异步
    @WebServlet(urlPatterns={"/AServlet"}, asyncSupported=true)
    public class AServlet extends HttpServlet{

        public void doGet(final HttpServletRequest req, final HttpServletResponse resp)
                throws ServletException, IOException{
                // 处理编码问题
                resp.setContextType("text/html;charset=utf-8");

                // 1. 得到异步上下文对象
                final AsyncContext ac = req.startAsync(req,resp);

                // 2. 给上下文一个 Runnable 对象, 启动它!
                //    也就是给上下文一个任务,让它完成
                ac.start(new Runnable(){
                    println("现在马上开始....<br/>",resp);
                    sleep(2000);
                    for(char c='A'; c<="Z"; c++){
                        println(c+"",resp);
                        sleep(250);
                    }

                    // 通知 tomcat , 该异步线程已经执行结束了!
                    // 这样, tocat 才会及时的断开与浏览器的连接
                    ac.complete();
                });
            }

        private void println(String text, HttpServletResponse resp){
            try{
                resp.getWriter().print(text);
                resp.getWriter().flush();
            }catch(IOException e){}
        }

        private void sleep(long ms){
            try{
                Thread.sleep(ms);
            }catch(InterruptedException e){ }
        }
    }

4. 对上传的支持

// form.jsp
    <body>
        <h1>注册</h1>
        <form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">
            用户名: <input type="text" name="username"/><br/>
            简  历: <input type="file" name="resume"/></br>
            <input type="submit" value="注册"/>
        </form>
    </body>

// AServlet
    @WebServlet(urlPatterns="/AServlet")
    @MultipartConfig
    public class AServlet extends HttpServlet{

        public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
            // 处理编码问题
            req.setCharacterEncoding("utf-8");

            // 此时, 可以使用 getParameter
            String username = req.getParameter("username");

            // 获取文件表单字段,对应的 Part 对象
            Part part = req.getPart("resume");

            // 从 part 对象中获取数据
            // 获取上传文件的 MIME 类型
            System.out.println(part.getContentType());
            // 获取上传文件的字节数
            System.out.println(part.getSize());
            // 获取文件字段名称, 即 resume. 不是文件名称
            System.out.println(part.getName());
            // 获取指定请求头的值, 例如获取上传文件的名称
            System.out.println(part.getHeader("Content-Disposition"));
            // 保存上传文件
            part.write("/Users/xxx/Desktop/a.jpg");

        }
    }

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/7679374.html