Response

Response
 
1、Response的运行过程
 
客户端发送请求(http请求)---->Tomcat引擎(解析,内部封装request信息以及response空对象)------>对应的Web程序的Servlet-------->而后将Response响应放到response缓冲区(相似)------->Tomcat引擎取出Response缓冲区内容------>Tomcat引擎将Response缓冲区内容与引擎本身添加的信息组装成一个http响应发送给客户端
 
http响应(三部分):
http响应行
http响应头
http响应体
 
一、经过Response设置响应行
 设置响应行的状态码
    setStatus( int sc )
//手动设置http响应行中的状态码
             response.setStatus(302);
 
二、经过Response设置响应头
addHeader(String name, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
Date date = new Date();
             //设置响应头
             response.addHeader("name", "zhangsan");
             response.addIntHeader("age", 28);
             response.addDateHeader("birthday", date.getTime());
 
setHeader(String name, String value)
setDateHeader(String name, long date)
setIntHeader(String name, int value)
 
其中,add表示添加(同名,会添加多个),而set表示设置(同名的,后面的会覆盖前面的)。
 
注:本身经过抓包查看响应信息。
 
三、重定向
什么是重定向?
客户端找servlet1要资源,servlet1没有资源,但知道servlet2有资源,而后告诉客户端,客户端去找servlet2要资源的过程就叫重定向。
俗话理解:你找张三借钱,张三没钱,但知道李四有钱,而后告诉你李四有钱,让你去找李四借钱。
特定:a、访问服务器两次或屡次。b、地址栏的地址发生变化(自动变化)
 
怎样设定重定向?
状态码:302        响应头:location  (表明重定向的地址)
             //没有响应,告知客户端去重定向到Servlet2
             //1.设置状态码302
             response.setStatus(302);
             //2.设置响应头location
             response.setHeader("Location", "/WEB14_Response/servlet2");
//JavaEE已经封装了一个重定向的方法sendRedirect(url)
             response.sendRedirect("/WEB14_Response/servlet2");
替代上面代码。
 
设置定时刷新,也可以达到重定向的功能!
//设置定时刷新的头,5秒回刷新到百度
             response.setHeader("refresh", "5;url=http://www.baidu.com";);
 
四、经过Response设置响应体
a、响应体设置文本
PrintWriter  writer = response.getWriter();
writer.write("hello China");
writer.write("中国!!!");
中文乱码问题?
通知Response查询UTF-8的码表,须要在输出流以前设置。
            //设置Response查询的码表
             //response.setCharacterEncoding("UTF-8");
             
             //经过一个头Content-Type,告知客户端使用的编码表
             //response.setHeader("Content-Type", "text/html;charset=UTF-8");
             
             //封装的方法
             response.setContentType("text/html;charset=UTF-8");
             
             PrintWriter  writer = response.getWriter();
             writer.write("hello China");
             writer.write("中国!!!");
 
PrintWriter getWriter()
得到字符流,经过字符流的write(String s)方法能够将字符串设置到response    缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
 
关于设置中文的乱码问题
缘由:response缓冲区的默认编码是iso8859-1,此码表中没有中文,能够经过response的setCharacterEncoding(String charset) 设置response的编码。
 
但咱们发现客户端仍是不能正常显示文字
缘由:咱们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,由于咱们都是中文系统,因此客户端浏览器的默认编码是GBK,咱们能够手动修改浏览器的编码是UTF-8。咱们还能够在代码中指定浏览器解析页面的编码方式,经过response的setContentType(String type)方法指定页面解析时的编码是UTF-
8。response.setContentType("text/html;charset=UTF-8");
上面的代码不只能够指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,因此在实际开发中只要编写   
response.setContentType("text/html;charset=UTF-8");
就能够解决页面输出中文乱码问题。
注意:上述红色代码只能在response页面输出前生效,若是页面先有输出(非中文等),再写上述代码,再输出中文,仍是不能解决中文乱码问题。
 
b、响应头设置字节
//使用response得到字节输出流
ServletOutputStream outputStream = response.getOutputStream();
 
得到字节流,经过该字节流的write(byte[] bytes)能够向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。
             //使用response得到字节输出流
             ServletOutputStream outputStream = response.getOutputStream();
             
             //得到服务器上的图片
             String realPath = this.getServletContext().getRealPath("/WEB-INF/a.jpg");
             InputStream in = new FileInputStream(realPath);
             
             int  len = 0;
             byte[] buffer = new byte[1024];
             while ((len = in.read(buffer))>0) {
                    outputStream.write(buffer, 0, len);                  
             }
             in.close();
             outputStream.close();
 
2、文件下载的基本代码
问题:
        a、什么状况下会文件下载?
        浏览器不能解析的文件就下载。
        b、什么状况下须要在服务器端编写文件下载的代码?
        理论上,浏览器能够解析的代码须要编写文件下载代码。
        实际开发中,只要是下载的文件都编写文件代码下载。       
 
一、文件下载的本质
        文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。因此文件下载须要IO技术将服务器端的文件使用InputStream读取到,再使用ServletOutputStream写到response缓冲区中。
//使用response得到字节输出流
             ServletOutputStream outputStream = response.getOutputStream();
             //得到服务器上的图片
             String realPath = this.getServletContext().getRealPath("/WEB-INF/a.jpg");
             InputStream in = new FileInputStream(realPath);
             int  len = 0;
             byte[] buffer = new byte[1024];
             while ((len = in.read(buffer))>0) {
                    outputStream.write(buffer, 0, len);                  
             }
             in.close();
             outputStream.close();
 
上述代码能够将图片从服务器端产生到浏览器,但浏览器直接解析图片显示在页面上,而不是提供下载,咱们须要设置两个响应头,告知浏览器文件的类型和文件的打开方式。
a、告知浏览器文件的类型:
response.setContentType(文件的MIME类型)
response.setContentType(this.getServletContext().getMimeType(filename));
b、告知浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");
//告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
             response.setHeader("Content-Disposition", "attachment;filename="+filename);
             //得到要下载文件的名称
             String filename = request.getParameter("filename");         
             
             //要下载的这个文件的类型-----客户端经过文件的MIME类型去区分类型
             //MIME:字符串
              response.setContentType(this.getServletContext().getMimeType(filename));
             
             //告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
             response.setHeader("Content-Disposition", "attachment;filename="+filename);
                           
             //得到文件的绝对路径
             String realPath = this.getServletContext().getRealPath("download/" + filename);
             //得到该文件的输入流
             InputStream  in = new FileInputStream(realPath);
             //得到输出流--经过response得到的输出流,用于向客户端写内容
             ServletOutputStream out = response.getOutputStream();
             //文件拷贝的模板代码
             int len = 0;
             byte[] buffer = new byte[1024];
             while ((len = in.read(buffer)) >0) {
                    out.write(buffer, 0, len);
             }
             in.close();
             out.close();        
 
解决乱码的问题:
解决乱码方法以下(不要记忆--了解):
if (agent.contains("MSIE")) {
        // IE浏览器
        filename = URLEncoder.encode(filename, "utf-8");
        filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
        // 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
        filename = "=?utf-8?B?"
                + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
        // 其它浏览器
        filename = URLEncoder.encode(filename, "utf-8");                
}
 
download.html
<body>
       <h1>使用服务器编码实现文件下载</h1>
       <a href="/WEB14_Response/downloadServlet?filename=a.flv">a.flv</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.jpg">a.jgp</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.mp3">a.mp3</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.mp4">a.mp4</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.txt">a.txt</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.zip">a.zip</a><br>
       <a href="/WEB14_Response/downloadEncode?filename=美女.jpg">美女.jpg</a><br>
</body>
 
downloadEncodeServlet.java
//得到要下载文件的名称
             String filename = request.getParameter("filename");  //美女.jpg
             System.out.println(filename);
             //解决得到中文参数的乱码
             //filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
             
             //得到请求头中的User-Agent
             String agent = request.getHeader("User-Agent");
             String filenameEncode = "";
             //根据不一样得了浏览器进行不一样的编码
             if (agent.contains("MSIE")) {
                    // IE浏览器
                    filenameEncode = URLEncoder.encode(filename, "utf-8");
                    filenameEncode = filenameEncode.replace("+", " ");
             } else if (agent.contains("Firefox")) {
                    // 火狐浏览器
                    BASE64Encoder base64Encoder = new BASE64Encoder();
                    filenameEncode = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
             } else {
                    // 其它浏览器
                    filenameEncode = URLEncoder.encode(filename, "utf-8");
             }
 
             //要下载的这个文件的类型-----客户端经过文件的MIME类型去区分类型
             //MIME:字符串
              response.setContentType(this.getServletContext().getMimeType(filename));
             
             //告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
             response.setHeader("Content-Disposition", "attachment;filename="+filenameEncode);
             
                           
             //得到文件的绝对路径
             String realPath = this.getServletContext().getRealPath("download/" + filename);
             //System.out.println("realPath:"+realPath);
             //得到该文件的输入流
             InputStream  in = new FileInputStream(realPath);
             //得到输出流--经过response得到的输出流,用于向客户端写内容
             ServletOutputStream out = response.getOutputStream();
             //文件拷贝的模板代码
             int len = 0;
             byte[] buffer = new byte[1024];
             while ((len = in.read(buffer)) >0) {
                    out.write(buffer, 0, len);
             }
             in.close();
             out.close(); 
 
 
其中agent就是请求头User-Agent的值。
 
response细节点:
a、response 得到的流不须要手动关闭,Tomcat容器会帮助咱们关闭
b、getWriter 和 getOutputStream不能同时调用
 

java下载文件的中文名 为何要用 new String(fileName.getBytes("gb2312"),"iso8859-1");缘由是什么?

 
3、实现验证码功能
 
经过java代码或者其余生产验证码的过程,不须要很了解。可是生产的验证码图片,须要掌握怎样使用!!!
相关文章
相关标签/搜索