• 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");
    
            }
        }
    

    参考资料:

  • 相关阅读:
    菜单无限极分类核心代码
    获取页面中更新删除传过来的id
    CI循环数组问题
    ci框架model中的进行增删改的写法
    MySQL DBA的修炼与未来(参考篇)
    Linux学习笔记(13)linux软件安装rpm与yum--理论篇
    Linux学习笔记(12)linux文件目录与用户管理
    Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)
    Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)
    自定义流水号,前置加0
  • 原文地址:https://www.cnblogs.com/linkworld/p/7679374.html
Copyright © 2020-2023  润新知