Requet&Response学习笔记

【响应对象-Response对象】

响应行:

Response设置状态码:



响应头:

Response设置响应头:

* 一个key对应一个value


* 一个key对应多个value



响应体:

Response设置响应体:



response处理中文乱码】

字节流:

设置浏览器默认打开编码

response.setHeader("Content-Type","text/html;charset=UTF-8");

中文转成字节数组编码

response.getOutputStream().write("王守义".getBytes("UTF-8"));

字符流:

设置response的缓冲区的编码

response.setCharacterEncoding("UTF-8");

设置浏览器默认打开的编码.

response.setHeader("Content-Type","text/html;charset=UTF-8");


response.setContentType("text/html;charset=UTF-8");相当于上面两句


【文件下载】

一种:超链接方式.(不推荐)

    * <ahref=”aa.zip”>下载</a>

    * <ahref=”1.jpg”>下载</a>

二种:手动编码方式完成文件下载.

    * 设置两个头和一个流:

    *Content-Type:文件MIME的类型.

    *Content-Disposition:

    * 文件的输入流:

代码实现:

1.在页面中提供一组下载的链接:

        response.getWriter().println("<h2>手动编码方式下载</h2>");

        response.getWriter().println("<ahref='/WEB10/downloadServlet?filename=a.bmp'>a.bmp</a><br/>");

        response.getWriter().println("<ahref='/WEB10/downloadServlet?filename=WEB01.zip'>WEB01.zip</a>");

2.编写DownloadServlet:

    protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

        /**

         *  接收参数:

         *  设置两个头和一个流:

         *  文件输入流和响应的输出流对接:

         */

        // 接收参数:get乱码  new String("中文".getBytes("ISO-8859-1"),"UTF-8");

       

        String filename =request.getParameter("filename");

        System.out.println(filename);

        // 设置两个头和一个流:

        // 设置Content-Type头

        String fileType =this.getServletContext().getMimeType(filename);

        response.setContentType(fileType);

        // 设置Content-Disposition:

        response.setHeader("Content-Disposition","attachment;filename="+filename);

        // 设置文件的输入流:

        String path =this.getServletContext().getRealPath("/download/"+filename); //

        InputStream is = new FileInputStream(path);

        OutputStream os = response.getOutputStream();

        int len = 0;

        byte[] b = new byte[1024];

        while((len = is.read(b))!=-1){

            os.write(b,0, len);

        }

        is.close();

    }


中文文件名下载:

中文文件在不同的浏览器中编码方式不同:

IE          URL编码

Firefox     :Base64编码

if(agent.contains("Firefox")){

            // 火狐浏览器

            filename= base64EncodeFileName(filename);

        }else{

            //IE,其他浏览器

            filename= URLEncoder.encode(filename, "UTF-8");

        }

public static String base64EncodeFileName(StringfileName) {

        BASE64Encoder base64Encoder = newBASE64Encoder();

        try {

            return"=?UTF-8?B?"

                    +new String(base64Encoder.encode(fileName

                            .getBytes("UTF-8")))+ "?=";

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

            thrownew RuntimeException(e);

        }

    }


【请求对象-request对象】

获得客户机信息:

* getMethod();          ---获得请求方式.

* getQueryString();     ---获得请求路径后的参数.

* getRemoteAddr();     ---获得客户机的IP地址.

* getRequestURI();     ---获得请求的路径

* getRequestURL();     ---获得请求的路径

* getContextPath();     ---获得工程名

获得请求头


* request.getHeader(“User-Agent”);

* request.getHeader(“Referer”);


请求参数:


用来作为域对象存取值:




参数接收中的乱码处理.

POST乱码处理:

* <form method=”post”>的时候,这种提交才是POST提交.其他的都是get.

* POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.

* 处理方式:设置request的缓冲区的编码.

* request.setCharacterEncoding(“UTF-8”);

 

GET方式乱码处理:

* GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码.

* 处理方式:

     * 修改服务器提交的编码.

     * 采用URLEncoder URLDecoder类对中文进行编码和解码.

     * 使用String类的构造方法:

         username = newString(username.getBytes("ISO-8859-1"),"UTF-8");


转发和重定向的区别:

【重定向】

response.sendRedirect(String path); -- 完成重定向

【转发】

request.getRequestDispatcher(Stringpath).forward(request,response);

【区别】

1.转发的地址栏不变的.重定向的地址栏发生变化的.

2.转发是一次请求一次响应,重定向是两次请求两次响应.

3.request域对象存取的值在转发中是有效的,在重定向无效的.

4.转发的路径不需要加工程名.重定向的路径需要加工程名.


猜你喜欢

转载自blog.csdn.net/YaoChung/article/details/80782106