requset&response

来源:互联网 发布:mac百度云下载速度慢 编辑:程序博客网 时间:2024/05/16 23:34
1.读取web工程下的文件  : java项目可以直接用绝对路径读取, 但web项目是在服务器上;
      主要问题就是文件路径问题


     1.传统的java项项目的读取方法,相对路径是相对的Tomcat中bin路径
    
     2. 在src下创建一个文件 ,然后在包下新建一个servlet


     3.使用servletcontext来读取web项目下的文件
          public Inputstream  getresourceAsStream(); 根据提供的路径读取文件
          public  string     getRealPath();  返回一个路径的磁盘的绝对路径


          1.获得servletcontext对象,然后调用getresourceAsStream("/WEB-INF/classes/文件名");
              然后用Properties读取文件内容
 
          2.获得servletcontext对象,然后调用getRealPath("/WEB-INF/classes/文件名");得到绝对
             路径,然后用传统的的读取方法,路径就写绝对路径/


     
     4.自定义工具类读取文件;是一个java类, 用类的加载器来加载class文件,将class文件加载内存
        自定义工具类.class.getclassLoader().getresourceAsStream();




      加载器的执行流程: 应用类加载器----->扩展类加载器----->系统类加载器


    




2.servletcontext的功能:  servletcontext; 是一个域对象. 作用范围: 整个web工程;
     
      1.创建: 服务器启动时候,Tomcat服务器为每个web项目创建一个单独的servletcontext对象;


      2.销毁: 服务器关闭或项目移除时候,进行销毁;


      3.作用:  
             1.获得全局的初始化参数, 全局参数的配置,任何一个servlet都可得到;
                    <context-param>
                         <param-name>username
                         <param-value>
                  然后读取用getInitparameter("username");或 getInitparameterNames();




              2. 用来获得文件的MIME的类型,可以用来文件上传和下载的时候限制用户上传头像类型
                  getMimetype(文件名); 获得文件的类型




              3. 作为域对象存储数据,用来读取web项目下的文件.
 
              4.读取web工程下的文件 






3.登陆成功后,完成文件的下载
    
    1.Response 代表的响应对象, 从服务器向浏览器输出内容;
    
        1.常用的API:  响应行: setstatus(int) 设置响应码,
               响应头: addHeader();
                           addDateHeader(); addIntHeader(); 一个key对应多个value的响应头
                       setHeader(string name,string value); 
                            setDateHeader(string name , long date),setIntHeader();  一个key                               对应一个value的响应头


                 响应体:getoutputstream(); getwriter();


    2.文件下载方式: 
        1. 超链接下载,直接将文件的路径写到超链接的href中, ---前提:文件类型,浏览器不支持,如果
           支持,直接就打开了;
      


        2. 手写代码方式完成文件下载;


            设置两个头和一个流:
              content-type      :文件的MIME的类型
              content-disposition: 以下载中的方式打开文件
              inputstream        :文件输入流


       3.在业务层重定向到一个登陆.jsp页面,然后在跳转到文件下载页面


       4.文件下载:


             1.超链接下载:<a href="/day10/文件路径">直接下载


             2.编码下载:  <a href="/day10/servlet ? filename=hello.zip">


             3.在servlet中 设置两个头和一个流:
                接收参数的时候要解码


                 第一个头:  告知浏览器文件的类型


                  //下载的文件名要解码;


                 第二个头: 浏览器已下载的方式打开  
                 输入流的路径:this.getServletContext().getRealPath("/download/"+parameter);


                 type=  getMimetype(文件名);  得到类型   
                 response.setHeader("Content-Type",type);


                 处理中文问题;
                 response.setHeader("Content-Disposition","attachment;参数名="+参数值);


             4. 服务器输入流,(getRealPath("/文件夹/文件名");)读取文件,
                然后通过字节输出流下载;response.getoutputstream(); 关闭输入流










4.中文文件下载
   1.request 接受参数是中文的时候: new String(参数.getBytes("ISO-8859-1"),"UTF-8");


   2. 在设置头信息下载的时候,下载文件名会乱码


      IE浏览器下载中文文件时,采用URL的编码
      Firefox浏览器................Base64的编码;
      获得头信息String agent =  request.getHeader("User-Agent");
      




5.response输出响应内容的方法; print其实调用了writer方法然后获得值变为字符串;
    response.getwriter().print();
    response.getoutputstream().writer(byte);


    以上两个输出方法只能用一个;




    1.字节流getoutputstream().writer(中文.bytes("UTF-8"));


      乱码的问题: 不一定;主要是你服务器编码要和浏览器编码相同


           解决:  设置中文转出字节数组取出的时候的编码 , 设置浏览器默认打开的编码


              .response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
              .response.getoutputstream().writer(中文.bytes("UTF-8"));


          
    2.字符流 getwriter().print();
       乱码的问题: 一定会乱码; 因为字符流有缓存区 , response的字符流缓存区默认编码ISO-8859-1;
  
       解决: 设置response的字符流的缓存区的编码; 在输出之前


             设置浏览器默认打开的时候采用的编码; 和1相同;


              response.setContentType(“text/html;charset=UTF-8”);








6.Request代表用户的请求: 
     功能一: 获得客户机相关信息


            Request的API
              1. 请求行:获得请求方式 : getMethod();


                 请求路径: getrequestURL() getRequsetURI();


                 获得客户机相关信息: getRemoteAddr() IP地址


          获得工程名: getContextPath();


    功能二: 获得参数的信息;


    功能三: 作为域对象存储数据/ setAttribute() 有这些方法基本都是域对象








7. request的中文乱码问题:


      1.get提交方式: 地址栏中会乱码,然后放在request缓存区;
                      1.修改Tomcat的字符集的编码;
                      2.使用URLEncoder和URLDecoder进行编码和解码的操作          
                      3.使用String的构造方法:new String(参数.getBytes("ISO-8859-1"),"UTF-8");




      2.post提交方式:post的参数实在请求体中,直接到达后台的servlet中的request中,request也有缓                       存区request的缓存区也是ISO-8859-1编码


            解决:   request.setcharacterencoding("UTF-8");








8. Request作为域对象存取数据;                                                                                                                                                               
     作用范围就是一次请求的范围,这样只能用转发了


      创建:客户端向服务器发送了一次请求后,就会创建一个request对象 
      销毁: 当服务器对这次请求做出了响应之后;


      setatrribute();  getattribute();  








9. 重定向和转发: (redirect和forward是一样的)
   1.重定向: response.sendRedirect("地址");
   2.转发 : request.getRequestDispatcher().forword();


   3.重定向的地址栏会发生变化,转发的地址栏不变.
   4.重定向两次请求两次响应,转发一次请求一次响应.


   5.重定向路径需要加工程名,转发的路径不需要加工程名.
   6.重定向可以跳转到任意网站,转发只能在服务器内部进行转发. 这是因为路径问题











原创粉丝点击