zoukankan      html  css  js  c++  java
  • Servlet 3.0 特性

    Servlet 3.0 了解即可。

    在servlet3.0中可以使用注解来替代我们配置文件.简单说:在servlet3.0中可以没有web.xml文件。
    版本对应关系
                          servlet2.5      javaee5.0     tomcat 5.x tomcat6     jdk1.5
                         servlet3.0       javaee6.0      tomcat7.0               jdk1.6

    1.使用注解来替换配置文件

      @WebServlet("/hello") 用于配置servlet      @WebFilter("/*") 用于配置Filter     @WebListener 用于配置Listener 

    注意:属性urlpatterns与values它们都是描述访问当前servlet的路径,但它们不能一起出现,只能使用一个.    
    <servlet>
    <servlet-name></servlet-name>   String name() default "";
    <servllet-class></servlet-class>
    <init-param>       WebInitParam[] initParams() default {};
        <param-name>
        <param-value>
    </init-param>
    <load-on-startup>     int loadOnStartup() default -1;
    </servlet>
    <servlet-mapping>
    <servlet-name></servlet-name>
    <url-pattern></url-pattern>     String[] urlPatterns() default {};   String[] value() default {};
    </servlet-mapping>
                    
    在servlet中怎样获取初始化参数ServletConfig对象获取.
                
    在web.xml文件中的属性 metadata-complete,可以取值为true,false,如果为false,代表servlet3.0中的注解可以使用,如果为true,代表不可以使用注解。
    View Code

       实例:@WebServlet("/hello") 用于配置servlet     

    @WebServlet(urlPatterns = { "/hello", "/h1" },initParams={@WebInitParam(name="username",value="tom"),@WebInitParam(name="encode",value="utf-8")})
    public class MyServlet extends HttpServlet {
    
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            System.out.println("hello servlet");
    
            // 获取初始化参数
            ServletConfig config = this.getServletConfig();
            String username = config.getInitParameter("username");
            System.out.println(username);
        }
    }
    View Code

     2.servlet3.0中的文件上传  

    @WebServlet("/upload")
    @MultipartConfig
    public class UploadServlet extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            req.setCharacterEncoding("utf-8");// 解决乱码
    
            Part part = req.getPart("f"); // 得到上传文件信息.
            
    //        req.getParts();
    
            // 获取上传文件名称
            String cd = part.getHeader("Content-Disposition");
    
            System.out.println(cd); // form-data; name="f";
                                    // filename="C:UsersAdministratorDesktop鎹曡幏.PNG"
    
            String filename = cd.substring(cd.lastIndexOf("\") + 1,
                    cd.length() - 1);
    
            System.out.println(filename);
    
            part.write("d:/upload/"+filename);// 完成文件上传.
    
        }
    
    }
    View Code

       2.1. 关于上传文件中文名称乱码问题。因为上传是post请求,直接使用post乱码解决方案就可以 request.setCharacterEncoding("utf-8");

       2.2.  关于获取上传文件名称 通过Part获取一个header;String cd = part.getHeader("Content-Disposition");

              在这个header中包含了上传文件名称,直接截取出来就可以。 String filename = cd.substring(cd.lastIndexOf("\") + 1,cd.length() - 1);
       2.3. 如果多文件上传怎样处理?request.getParts(); 

    3.servlet3.0中异步处理

       质就是在服务器端开启一个线程,来完成其它的操作。   

    @WebServlet(value = "/reg", asyncSupported = true)
    public class RegistServlet extends HttpServlet {
    
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            resp.setCharacterEncoding("utf-8");
            final PrintWriter out = resp.getWriter();
            // 1.注册操作
            System.out.println("开始注册");
            // try {
            // Thread.sleep(1000);
            // } catch (InterruptedException e) {
            // // TODO Auto-generated catch block
            // e.printStackTrace();
            // }
    
            System.out.println("注册结束");
    
            // 开启线程。进行发邮件操作.
    
            AsyncContext context = req.startAsync();// 获取一个异步 上下文对象.
    
            context.addListener(new AsyncListener() {
    
                @Override
                public void onTimeout(AsyncEvent event) throws IOException {
    
                }
    
                @Override
                public void onStartAsync(AsyncEvent event) throws IOException {
    
                }
    
                @Override
                public void onError(AsyncEvent event) throws IOException {
    
                }
    
                @Override
                public void onComplete(AsyncEvent event) throws IOException {
                    // 监听到线程结束。
                    out.flush();
                    out.close();
                }
            });
    
            new Thread(new SendEmail(context)).start();
    
        }
    }
    
    class SendEmail implements Runnable {
    
        private AsyncContext context;
    
        public SendEmail(AsyncContext context) {
            this.context = context;
        }
    
        @Override
        public void run() {
    
            PrintWriter out;
            try {
                out = context.getResponse().getWriter();
    
                // 2.发送邮件---重新开启一个线程来完成。
                System.out.println("开始发送邮件");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println("邮件发送成功");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
    
        }
    }
    View Code

       3.1.必须在注解添加一项

           @WebServlet(value = "/reg", asyncSupported = true)         asyncSupported=true,代表当前servlet支持异步操作.
      3.2.需要一个异步上下文对象,通过这个对象,可以获取request,response对象.
           AsyncContext context = req.startAsync(); 还可以对异步上下文进行监听,在它的监听器方法中有一个onComplete,可以用于判断结束。

  • 相关阅读:
    高性能MySQL--创建高性能的索引
    error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
    高性能MySQL--MySQL数据类型介绍和最优数据类型选择
    Elasticsearch入门和查询语法分析(ik中文分词)
    裁员浪潮,互联网人该何去何从?
    django+mysql的使用
    很详细的Django入门详解
    (2021年1月5日亲测有效)最新PyCharm 安装教程&激活破解,Pycharm激活,Pycharm破解
    (2021年1月5日更新)!最新的pycharm永久激活办法,亲测有效
    太干了!一张图整理了 Python 所有内置异常
  • 原文地址:https://www.cnblogs.com/java-oracle/p/7086450.html
Copyright © 2011-2022 走看看