A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kuqi3712 中级黑马   /  2018-1-22 17:26  /  877 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

读取web工程下的文件
        web项目下相对路径不好用
        web项目是相对jvm的路径,但是jvm已经交给tomcat管理了,因此不使用相对路径(可以在comcat/bin路径中读取)
       
        使用ServletContext读取web工程下的文件
       
        getResourceAsStream(String path)返回一个字节输入流
        getRealPath(String path);返回一个路径的磁盘绝对路径
        path路径的写法:/WEB-INF/classes/文件名.文件后缀
       
        String path=sc.getRealPath("WEB-INF/classes/hello.properties");
        磁盘绝对路径 path=C:\JavaDevelopTools\apache-tomcat-7.0.69\webapps\day13\WEB-INF\classes\hello.properties
        String getInitParameter(),获取 全局初始化参数
        Enumeration getInitParameterNames(),
       
        配置全局初始化参数,可以在其他Servlet中获取
        在<display-name>标签下面添加
        <context-param>
                <param-name></param-name>
                <param-value></param-value>
        </context-param>
       
获取文件的MIME类型
        每种文件都有对应的MIME类型
        String getMimeType(String file),获取文件的mime类型
读取文件加强版
        使用类加载器读取
        使用类加载器加载class文件加载到内存
        WEB-INF/classes
        InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("hello.properties");
       
文件的下载
        从服务器向浏览器写入流对象
        Response 代表一个响应对象,从服务器向浏览器输出
        Response的常用API
       
        响应行:setStatus设置状态码
        响应头:setHeader()覆盖 一个key对应一个value
                   addHeader()追加 一个key对应多个value
        响应体:getOutputStream();
                   getWriter();
       
        文件下载的方式:
                1.超链接下载 链接放在href中
                2.手动编写代码.
                        设置两个头和一个流
                        两个头:
                          Content-Type:文件的MIME类型
                          Content-Disposition:以下载的形式打开文件
                          InputStream 文件输入流
       
                1//接收参数
                String name=request.getParameter("filename");
                2//设置文件MIME类型
                ServletContext sc=this.getServletContext();
                String type= sc.getMimeType(name);
                response.setHeader("Content-Type", type);
                response.setHeader("Content-Disposition", "attachment;filename="+name);
                3//获得输入流
               
                String  realpath="E:\\音乐视频\\"+name;
                //String realpath="E:\\音乐视频\\[4K高清MV]IU - YOU&I.mp4";
                System.out.println(realpath);
                InputStream is=new FileInputStream(realpath);
                OutputStream os= response.getOutputStream();
                int len=0;
                byte[] bys=new byte[1024];
                while((len=is.read(bys))!=-1){
                        os.write(bys, 0, len);
                }
                is.close();
               
        中文文件下载:
                // 接收参数
                String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
                System.out.println(filename);
                // 设置文件MIME类型
                ServletContext sc = this.getServletContext();
                String type = sc.getMimeType(filename);
                response.setHeader("Content-Type", type);
                // 获得输入流
                String realpath = "E:\\音乐视频\\" + filename;
                // String realpath="E:\\音乐视频\\[4K高清MV]IU - YOU&I.mp4";
                System.out.println(realpath);
                // 根据浏览器类型处理中文乱码,获得请求头
                String agent = request.getHeader("User-Agent");
                System.out.println(agent);
                if (agent.contains("Firefox")) {
                        filename = base64EncodeFileName(filename);
                } else {
                        filename = URLEncoder.encode(filename, "UTF-8");
                }
                response.setHeader("Content-Disposition", "attachment;filename=" + filename);
                InputStream is = new FileInputStream(realpath);
                OutputStream os = response.getOutputStream();
                int len = 0;
                byte[] bys = new byte[1024];
                while ((len = is.read(bys)) != -1) {
                        os.write(bys, 0, len);
                }
                is.close();
               
response响应:
                getOutputStream();
                        使用字节流输出中文不一定会乱码,看浏览器编码
                        解决乱码的方式
                        write("中文".getBytes("UTF-8"))
                        然后再浏览器中设置UTF-8
                        response.setHeader("Content-Type","text/html;charset=UTF-8")
                getWriter();
                        一定会乱码,        response使用的字符流有缓冲区(外国人习惯使用IOS-8859-1的编码,这个编码不支持中文)
                        解决办法:
                                设置response的字符流缓冲区的编码,然后这只浏览器默认打开采用的字符集的编码,一定要在所有输出之前
                                response.setCharacterEncoding("UTF-8");设置response的字符流缓冲区的编码
                               
                                response.setHeader("Content-Type","text/html;charset=UTF-8");设置浏览器
                               
                                response.setContentType("text/html;charset=UTF-8");与上面两句效果一致
                                既设置了缓冲区也设置了浏览器
                        getOutputStream();getWriter();这两个方法是互斥的,做出响应的时候只能用其中的一个流.
               
               
               
Request(请求)的功能:
                获取客户机信息
                        getMethod()获得请求方式
                        getRequestURI()工程(/工程名)下开始的路径
                        getRequestURL()从http开始的
                        获得客户机相关的信息
                        getRemoteAddr()获取客户机的ip地址
                        getRemoteHost()主机名
                        getRemotePort()端口号

                        getContextPath()获取工程名
               
                获取页面中提交的参数
                        getParameter()
                        getParameMap()
                        getParameterNames()
                        getParameterValue()
                作为域对象存取数据
                        getAttribute()
                        setAttribute()
                        removeAttribute()
处理Request中文乱码问题               
                Post的解决方法:
                        post是把数据封装到servet的reuqest中,request中也有一个缓冲区
                        request缓冲区也是ISO-8859-1编码
                        设置request的缓冲区的编码
                        request.setCharacterEncoding("UTF-8");
                        一定要设置在接收参数之前(调用getParameter之前)
                get的解决办法:
                        将提交的数据编码后放到了request的缓冲区里面,
                        先从request缓冲区(ISO-8859-1)中拿到这个数据
                        再对其进行解码
                       
                        方法1:可以修改tomcate字符集的编码(不推荐)
                        方法2:使用URLEncoder和URLDecoder进行编码和解码
                   *方法3:new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
                       
Request作为域对象存取数据:
                使用request对象存取数据
                        setAttribute(String name,String value);
                        getAttribute(String name);
                request的作用范围就是一次请求的范围,客户端向服务器发送一次请求后,服务器就会创建一个request对象
                        销毁:当服务器对这次请求做出了响应之后就销毁.
               
               
               
               
                       
重定向和转发的区别(redirect与forward的区别)
        重定向:
        1.地址栏路径变了
        2.重定向执行过程请求Servlet1,等待Servlet1响应并接受状态码和重定向路径,
        然后再请求新的路径等待新路径响应
        3.两次请求,两次响应
        4.重定向的是客户端的路径,需要加工程名
        5.重定向可以跳转到任意网站
        response.sendRedirect("/day13/register/success.html");
        转发:
        1.地址栏路径没有变
        2.转发的执行过程:请求Servlet1,Servlet1直接跳转到Servlet2,Servlet2响应
        3.一次请求一次响应
        4.转发的是服务器的路径,不需要加工程名
        5.只能在服务器内部进行转发
        RequestDispatcher getRequestDispatcher(String path)  
        RequestDispatcher中有 void forward(ServletRequest request, ServletResponse response)  
       
        request.getRequestDispatcher(/xxxxx).forward(request,response);
       
       
       

4 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
学无止境   路还很长  加油哦   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马