Servlet3.0Servlet3.0

一、要求
1. 发布到Tomcat7.0或以上版本!

二、概述
一、要求
1. 发布到Tomcat7.0或以上版本!

二、概述

  Servlete3.0底重中之重新特色如下三部分:

  Servlete3.0之重要新特点如下三有的:

  • 采取@WebServlet、@WebFilter、@WebListener三单注解来取代web.xml文件被之Servlet、Filter、Listener的布局;
  • Servlet异步处理:当Servlet处理比较吃力的题材时常,这会让客户觉得到很卡。当以非常处理时可以把已经处理好之情节先一步响应给客户端浏览器,然后使任何一个线程来形成急难的操作,也就是把内容有有些底亮出来;
  • 上传组件:不用还用fileupload等第三在的上传组件,使用Servlet3.0的上传组件会更便宜。
  • 行使@WebServlet、@WebFilter、@WebListener三单注解来代替web.xml文件中之Servlet、Filter、Listener的部署;
  • Servlet异步处理:当Servlet处理比较棘手的题材常常,这会受客户觉得到不可开交卡。当以特别处理时得把曾经处理好之情节先一步响应给客户端浏览器,然后运任何一个线程来形成艰难的操作,也即是将内容有片之显得出;
  • 上传组件:不用再采取fileupload等第三着的上传组件,使用Servlet3.0底上传组件会又便宜。

三、注解代替配置文件

1. 删除web.xml
2. 在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"})
总结:
三、注解代替配置文件

1. 删除web.xml
2. 在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"})
总结:
  • 诠释好处:配置信息少!
  • 注解缺点:不便利修改!
  • 注好处:配置信息少!
  • 诠释缺点:不便民修改!

3. 在Filter类上添加@WebFilter(urlPatterns="/AFilter")
4. 在Listener类上添加@WebListener

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

  2. 实现异步的步骤
3. 在Filter类上添加@WebFilter(urlPatterns="/AFilter")
4. 在Listener类上添加@WebListener

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

  2. 实现异步的步骤
  • 落AsyncContext,它异步上下文对象
  • 取得AsyncContext,它异步上下文对象

AsyncContext ac = request.startAsync(request,response);

AsyncContext ac = request.startAsync(request,response);

  • 让上下文一个Runnable对象,启动它!(给上下文一个任务,让它形成!)

    ac.start(new Runnable() {

    public void run() {...}
    

    });

  • @WebServlet(urlPatterns=”/AServlet”, asyncSupported=true)

  • resp.setContentType(“text/html;charset=utf-8”);
  • IE如果不能够正常输出,这说明响应体大小不足512B,那若需要多输出点废话!
  • AsyncContext#complete():通知Tomcat我们异步线程已经尽了了!这给Tomcat才会及时的断开与浏览器的连天!

    1 @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”,asyncSupported = true)
    2 public class BServlet extends HttpServlet {
    3 public void doGet(final HttpServletRequest req, final HttpServletResponse resp)
    4 throws ServletException, IOException {
    5 resp.setContentType(“text/html;charset=utf-8”);
    6
    7 // 支持IE!如果出口不足512B,没有异步效果!
    8 for(int i = 0; i <= 512; i++) { 9 resp.getWriter().print("a"); 10 } 11 resp.getWriter().flush(); 12 13 //1. 得到异步上下文对象 14 final AsyncContext ac = req.startAsync(req, resp); 15 16 //2. 给上下文对象一个Runnable对象,让她实施这个任务 17 ac.start(new Runnable() { 18 public void run() { 19 println("现在就开始
    “, resp);
    20 sleep(2000);
    21 for(char c = ‘A’; c <= 'Z'; c++) { 22 println(c+"", resp); 23 sleep(250); 24 } 25 // 通知Tomcat我们早就推行了了! 26 ac.complete(); 27 } 28 }); 29 } 30 public void println(String text, HttpServletResponse resp) { 31 try { 32 resp.getWriter().print(text); 33 resp.getWriter().flush(); 34 } catch (IOException e) { } 35 } 36 public void sleep(long ms) { 37 try { 38 Thread.sleep(ms); 39 } catch (InterruptedException e) { 40 } 41 } 42 }

    五、上传支持

    1. 上传
  • 上传对表单的渴求:

    • method=”post”
    • enctype=”multipart/form-data”,它的默认值是:application/x-www-form-urlencoded
    • <input type=”file” name=”必须给”/>
  • 上传Servlet的使用:
    • request.getParameter()不克还用
    • request.getInputStream()使用她来取整个表单的数目!
  • commons-fileupload
    • 创建工厂
    • 解析器
    • 采取解析器来解析request对象,得到List<FileItem>
  • 给上下文一个Runnable对象,启动它!(给上下文一个任务,让它们做到!)

    ac.start(new Runnable() {

    public void run() {...}
    

    });

  • @WebServlet(urlPatterns=”/AServlet”, asyncSupported=true)

  • resp.setContentType(“text/html;charset=utf-8”);
  • IE如果不克健康输出,这证明响应体大小不足512B,那尔用差不多输出点废话!
  • AsyncContext#complete():通知Tomcat我们异步线程已经执行完毕了!这被Tomcat才会及时的断开与浏览器的接连!

    1 @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”,asyncSupported = true)
    2 public class BServlet extends HttpServlet {
    3 public void doGet(final HttpServletRequest req, final HttpServletResponse resp)
    4 throws ServletException, IOException {
    5 resp.setContentType(“text/html;charset=utf-8”);
    6
    7 // 支持IE!如果出口不足512B,没有异步效果!
    8 for(int i = 0; i <= 512; i++) { 9 resp.getWriter().print("a"); 10 } 11 resp.getWriter().flush(); 12 13 //1. 得到异步上下文对象 14 final AsyncContext ac = req.startAsync(req, resp); 15 16 //2. 给上下文对象一个Runnable对象,让她执行之职责 17 ac.start(new Runnable() { 18 public void run() { 19 println("现在立刻开
    “, resp);
    20 sleep(2000);
    21 for(char c = ‘A’; c <= 'Z'; c++) { 22 println(c+"", resp); 23 sleep(250); 24 } 25 // 通知Tomcat我们曾经推行完毕了! 26 ac.complete(); 27 } 28 }); 29 } 30 public void println(String text, HttpServletResponse resp) { 31 try { 32 resp.getWriter().print(text); 33 resp.getWriter().flush(); 34 } catch (IOException e) { } 35 } 36 public void sleep(long ms) { 37 try { 38 Thread.sleep(ms); 39 } catch (InterruptedException e) { 40 } 41 } 42 }

    五、上传支持

    1. 上传
  • 上传对表单的求:

    • method=”post”
    • enctype=”multipart/form-data”,它的默认值是:application/x-www-form-urlencoded
    • <input type=”file” name=”必须给”/>
  • 上传Servlet的使用:
    • request.getParameter()不克更用
    • request.getInputStream()使用它们来取整个表单的数量!
  • commons-fileupload
    • 创立工厂
    • 解析器
    • 采取解析器来解析request对象,得到List<FileItem>

2、Servlet3.0对上传提供了支持:
2、Servlet3.0对上传提供了支持:
  • 表单不更换
  • 于Servlet中不需要更以commons-fileupload,而是使Servlet3.0提供的上传组件接口!
  • 表单不移
  • 在Servlet中不需要再行使用commons-fileupload,而是利用Servlet3.0供的上传组件接口!

  上传的步骤:
  上传的步骤:
  • 使用request.getPart(“字段名”),得到Part实例,
  • Part:
    • String getContentType():获取上污染文书之MIME类型
    • String getName():获取表单项的称谓,不是文件名称
    • String getHeader(String header):获取指定头的值
    • long getSize():获取上污染文书的深浅
    • InputStream getInputStream():获取上污染文书的内容
    • void write(String fileName):把上污染文书保留及指定路线下
  • 默认Servlet是匪支持以上传组件:需要吃Servlet添加一个注:
    @MultipartConfig
  • 使用request.getPart(“字段名”),得到Part实例,
  • Part:
    • String getContentType():获取上污染文书之MIME类型
    • String getName():获取表单项的称号,不是文件名称
    • String getHeader(String header):获取指定头的价
    • long getSize():获取上污染文书的分寸
    • InputStream getInputStream():获取上污染文书之情节
    • void write(String fileName):把上污染文书保留至指定路线下
  • 默认Servlet是匪支持用上传组件:需要让Servlet添加一个注解:
    @MultipartConfig

    它没有提供获取上传文件名称的方法:
    它没有提供获取上传文件名称的方法:
  • 即时需要我们友好自Content-Disposition头中截取!

    1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3
    4
    5 Title
    6
    7
    8

    注册

    9


    11 简 历:
    12
    13

    14
    15

    1 package web.servlet;
    2
    3 import javax.servlet.ServletException;
    4 import javax.servlet.annotation.MultipartConfig;
    5 import javax.servlet.annotation.WebServlet;
    6 import javax.servlet.http.HttpServlet;
    7 import javax.servlet.http.HttpServletRequest;
    8 import javax.servlet.http.HttpServletResponse;
    9 import javax.servlet.http.Part;
    10 import java.io.IOException;
    11
    12 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
    13 @MultipartConfig
    14 public class AServlet extends HttpServlet {
    15 protected void doPost(HttpServletRequest request, HttpServletResponse response)
    16 throws ServletException, IOException {
    17 request.setCharacterEncoding(“utf-8”);
    18 //1、getParameter()方法可以动用了
    19 String username = request.getParameter(“username”);//可以用了
    20 //2、获取文件表单字段,对应之Part对象
    21 Part part = request.getPart(“resume”);
    22 //3、从Part中获得需要之数额
    23 //获取上污染文书之MIME类型
    24 System.out.println(part.getContentType());//image/jpeg
    25 //获取上污染文书之字节数
    26 System.out.println(part.getSize());//163302
    27 //获取上传文件字段名称
    28 System.out.println(part.getName());//resume
    29 //获取头,这个腔被寓了上传文件之名称
    30 System.out.println(part.getHeader(“Content-Disposition”));//form-data; name=”resume”; filename=”WechatIMG2.jpeg”
    31
    32
    33 //截取上传文件名称
    34 String filename = part.getHeader(“Content-Disposition”);
    35 int start = filename.lastIndexOf(“filename=\””) + 10;
    36 int end = filename.length()-1;
    37 filename = filename.substring(start,end);
    38 System.out.println(filename);
    39 //保存上污染文书
    40 part.write(“/Users/Shared/”+filename);
    41 }
    42 }

  • 立刻得我们好于Content-Disposition头中截取!

    1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3
    4
    5 Title
    6
    7
    8

    注册

    9


    11 简 历:
    12
    13

    14
    15

    1 package web.servlet;
    2
    3 import javax.servlet.ServletException;
    4 import javax.servlet.annotation.MultipartConfig;
    5 import javax.servlet.annotation.WebServlet;
    6 import javax.servlet.http.HttpServlet;
    7 import javax.servlet.http.HttpServletRequest;
    8 import javax.servlet.http.HttpServletResponse;
    9 import javax.servlet.http.Part;
    10 import java.io.IOException;
    11
    12 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
    13 @MultipartConfig
    14 public class AServlet extends HttpServlet {
    15 protected void doPost(HttpServletRequest request, HttpServletResponse response)
    16 throws ServletException, IOException {
    17 request.setCharacterEncoding(“utf-8”);
    18 //1、getParameter()方法好用了
    19 String username = request.getParameter(“username”);//可以使了
    20 //2、获取文件表单字段,对应的Part对象
    21 Part part = request.getPart(“resume”);
    22 //3、从Part中获需要之多少
    23 //获取上传文书之MIME类型
    24 System.out.println(part.getContentType());//image/jpeg
    25 //获取上污染文书之字节数
    26 System.out.println(part.getSize());//163302
    27 //获取上传文件字段名称
    28 System.out.println(part.getName());//resume
    29 //获取头,这个腔挨含有了上传文件的名称
    30 System.out.println(part.getHeader(“Content-Disposition”));//form-data; name=”resume”; filename=”WechatIMG2.jpeg”
    31
    32
    33 //截取上污染文件名称
    34 String filename = part.getHeader(“Content-Disposition”);
    35 int start = filename.lastIndexOf(“filename=\””) + 10;
    36 int end = filename.length()-1;
    37 filename = filename.substring(start,end);
    38 System.out.println(filename);
    39 //保存上传文书
    40 part.write(“/Users/Shared/”+filename);
    41 }
    42 }

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注