Day10 上传和下载

上传

将本地文件传输到服务器

jsp:
    文件上传的请求方式必须是post
    input的type必须是file
    enctype="multipart/form-data"

<form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"><br/>
        <input type="submit" value="上传">
</form>

servlet:
//1.设置编码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //2.读(流)
        InputStream is = request.getInputStream();//从请求中获取流
        //3.写(写到upload的文件夹下)
        //路径:在服务器中位置
        String path = request.getServletContext().getRealPath("/upload");
        OutputStream out = new FileOutputStream(new File(path,"a.txt"));
        
        byte[] buf = new byte[1024];
        int data = -1;
        while((data=is.read(buf)) != -1){
            out.write(buf, 0, data);
        }
        //释放资源
        out.close();
        is.close();
        System.out.println("上传完成");

浏览器标志信息: 
------WebKitFormBoundarytd2doI29GpOG23VA
Content-Disposition: form-data; name="upload"; filename="分包.txt"
Content-Type: text/plain
获取请求头信息比较麻烦

上传框架:
  comms-upload.jar   apache
  comms-io.jar

1.    导入jar
2.    编写jsp表单
3.    servlet
//fileItemFactory工厂:配置(缓冲区的大小,临时文件存放目录)
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //临时文件存放目录
            factory.setRepository(new File("c:/"));
            //设置缓冲区大小
            factory.setSizeThreshold(1024*1024);
            
            //解析请求(获取所有的表单元素(普通表单元素/文件表单元素))
            //ServletFileUpload核心:将所有的表单元素解析为Fileitem
            ServletFileUpload upload = new ServletFileUpload(factory);
            List<FileItem> items = upload.parseRequest(request);
            //获取文件目录
            String path = request.getServletContext().getRealPath("/upload");
            //遍历处理
            for (FileItem fileItem : items) {
                //判断类型
                if(fileItem.isFormField()){//是否为普通表单元素
                    //获取普通
                    String name = fileItem.getFieldName();//表单元素name值
                    String value = fileItem.getString();//value值
                    System.out.println("name="+name+",value="+value);
                }else{//文件
                    String name = fileItem.getName();//文件名称
                    fileItem.write(new File(path, name));
                }
            }
            System.out.println("上传成功");

 

下载

将服务器的文件传输到本地。

//1.设置编码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //2.获取参数的值  download?filename=xxx
        String filename = request.getParameter("filename");
        //3.获取文件的服务器路径(获取目录的路径)
        String path = request.getServletContext().getRealPath("/res");
        //4.读取文件
        InputStream is = new FileInputStream(new File(path,filename));
        //5.通过响应写文件到本地
        //设置响应头
        response.setHeader("Content-Disposition",
                "attachment;filename="+URLEncoder.encode(filename, "utf-8"));
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int data = -1;
        while((data=is.read(buf)) != -1){
            out.write(buf, 0, data);
        }
        out.close();
        is.close();

过滤器(Filter)

过滤请求和响应。

当用户发出请求时,首先到达过滤器,过滤器如果”放行”,此时该请求就可以到达下一个过滤器或者servlet。当客户端响应时,也需要经过过滤器。

//初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    //过滤请求和响应
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("filter 接收到请求");
        //放行
        chain.doFilter(request, response);
        
        System.out.println("filter 接收到响应");
    }

    //销毁
    @Override
    public void destroy() {
        
    }


<filter>
      <filter-name>myfilter</filter-name>
      <filter-class>filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>myfilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

filter应用场景:
1)    全局的编码设置
2)    敏感字过滤
3)    权限管理

监听器(listener)

监听域的对象创建销毁。

HttpRequestListener

HttpSessionListener

ServletContextListener

监听域中数据的变化(添加,修改,删除)

ServletContextAttributeListener:监听application域中数据变化
ServletRequestAttributeListener:监听request域中数据的变化
HttpSessionActivationListener:监听session的状态(活化和钝化)
HttpSessionAttributeListener:监听session域中数据变化
HttpSessionBindingListener:实现session和对象的绑定

Ajax

  同步请求:第二次请求需要等到第一次请求获取到响应之后才可以发送。

  异步请求:请求之间没有依赖关系。

  异步 JavaScript XMLAsynchronous JavaScript And XML)。

模拟百度查询:
  原生js:
var val = document.getElementById("content").value;
        var oDiv = document.getElementById("div1");
        //借助于Ajax
        //1.创建xhr对象
        var xhr = new XMLHttpRequest();
        //2.打开连接
        xhr.open("GET","test?key="+val);   //请求方式   请求路径   是否异步
        //3.发送请求     请求体
        xhr.send(null);
        //4.监听状态并且接收响应
        xhr.onreadystatechange = function(){
            //获取请求状态   0-4                 请求正确时获取
            if(xhr.readyState == 4 && xhr.status == 200){
                oDiv.innerHTML = xhr.responseText;
            }
        }

   jQuery的Ajax:
      $.ajax({
            url:"test",
            type:"get",
            data:"key="+$("#content").val(),
            dataType:"text",
            success:function(data){
                $("#div1").html(data);
            }
        });
url:请求路径
type:请求方式   get/post
data:传输的数据  字符串或者json  {“key”:$(“#content”).val()}
dataType:服务器响应数据类型   (xml/html/json/script/text)
success:服务器响应正确时返回

 

posted @ 2018-01-31 20:08  扎心了,老铁  阅读(510)  评论(0编辑  收藏  举报