http 的request和response 在servlet的应用文件下载
一)response
我们通过浏览器访问网站的时候,处理响应的是response。
它由三部门组成:响应行、响应头、响应体 作用:往浏览器写东西。
1)响应行
格式:协议/版本 状态码 状态码说明。
状态码:
1xx 已发送请求。
2xx 已完成响应 200 正常响应。
3xx 还需浏览器进一步操作。
302 重定向,配合响应头:location。
304 读缓存。
4xx 用户操作错误。
404 用户操作错误。
405 访问方法不存在。
5xx
500 服务器内部错误。
常用方法:
setStauts()该方法,设置http返回码的时候,如果返回的自定义的比如说111的状态码直接浏览器处于pending状态,4xx的返回码也会显示请求有问题等。
1 @WebServlet(name = "Servlet_Rsq") 2 public class Servlet_Rsq extends HttpServlet { 3 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 4 5 } 6 7 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 8 response.setContentType("text/html;charset=utf-8"); 9 response.setStatus(400); 10 response.getWriter().print("<h1>状态码400</h1>"); 11 } 12 }
操作响应头:
setHeader(String key,String val) addHeader(String key,String val)设置相应头,如果存在则追加,如果不存在添加。
1 response.getWriter().print("<div>三秒之后进行跳转!</div>"); 2 response.setHeader("refresh","3;url=/");
常用响应头:
1): 重定向建议使用第二种
1、location:需要注意必须配合setstatus()方法
1 response.setStatus(302); 2 response.setHeader("location","/local");
2:sendRedirect()
1 response.sendRedirect("/local");
2)文件下载
1、超链接下载:之前我们在部署下载服务器的时候,直接使用超链接下载,但是有的类型文件,比如说:xml 在下载的时候,直接被打开。而有的zip包取能被下载,这是为什么呢?
之所以会被下载是因为:浏览器解析不了的文件,会被浏览器下载处理,如果可以被解析的文件的,则会在浏览器呈现出来。也就是文件的mintype类型问题。所以出现之前的情况。
2、代码下载
通过指定文件mimeType的类型,通过输入IO流和输出流,返回给浏览器可以直接被下载,不会被出现上面的问题。
还有一个问题:文件名字中带有中文的时候,不同的浏览器需要编码不同。
Firefox:需要的base64编码
其他浏览器:需要utf-8
1)获取文件的mimeType类型。
2)设置头部信息。
3)对拷流。
1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 String filename=request.getParameter("filename"); 3 System.out.println(filename); 4 ServletContext context=this.getServletContext(); 5 String mi=context.getMimeType("/download/"+filename); 6 System.out.println(mi); 7 response.setContentType(mi); 8 InputStream inp=context.getResourceAsStream("WEB-INF/download/time.jpg"); 9 //设置头部信息。 10 response.setHeader("content-disposition","attachment;filename="+filename); 11 ServletOutputStream out=response.getOutputStream(); 12 //io对拷。使用common.io 13 IOUtils.copy(inp,out); 14 }
二)request
作用:获取浏览器的发送过来的数据。
组成部分:
请求行、请求头、请求体
操作请求行:
格式:
请求方式 请求资源 协议/版本
常用方法: HttpServletRequest
掌握的方法:
1 //获取请求方法:get、post等 2 String method=request.getMethod(); 3 //获取远程执行IP 4 String ip=request.getRemoteAddr(); 5 //获取项目名称。 6 String pro=request.getContextPath(); 7 System.out.println(method+" "+ip+" "+pro);
操作请求头:
1 //获取请求浏览器内核。 2 String nut=request.getHeader("user-agent"); 3 //获取页面请求的来源 防盗链 4 String com=request.getHeader("referer"); 5 System.out.println(nut+" "+com);
获取单个key多个值情况(checkbox)
1 //获取单个请求参数。 2 String finame=request.getParameter("filename"); 3 //获取多个请求参数的值。 4 String[] vals=request.getParameterValues("info"); 5 for(String i:vals){ 6 System.out.println(i); 7 } 8 //获取多组参数值。 9 Map<String,String[]> get_val=request.getParameterMap(); 10 // System.out.println(get_val); 11 for(String key:get_val.keySet()){ 12 System.out.println(Arrays.toString(get_val.get(key))); 13 }
三:
get请求和post请求中文乱码,是因为在浏览器处理中文的时候utf8但是到tomcat使用的编码的是iso-8859-1。所以,我们需要转换相应的编码。
使用String str=String.getBytes("iso-8859-1",“utf-8”)
因为得到参数已经被iso-8859-1处理过,需要用iso-8859-1解码然后用utf-8解码。new String(oldstring.getBytes("iso-8859-1"),"utf-8")
1 //获取多个请求参数的值。 2 String[] vals=request.getParameterValues("info"); 3 for(String i:vals){ 4 System.out.println(new String(i.getBytes("iso-8859-1"),"utf-8")); 5 }
下载文件扩展:
针对带有中文的下载文件处理。针对不同的浏览器进行不同的处理
1 String filename=request.getParameter("filename"); 2 filename=new String(filename.getBytes("iso-8859-1"),"utf-8"); 3 System.out.println(filename); 4 String _filename; 5 if(nut.contains("Firefox")){ 6 _filename=base64EncodeFileName(filename); 7 }else{ 8 _filename= URLEncoder.encode(filename,"utf-8"); 9 } 10 System.out.println(_filename); 11 ServletContext context=this.getServletContext(); 12 String mi=context.getMimeType("/download/"+filename); 13 System.out.println(mi); 14 response.setContentType(mi); 15 //获取输入的流的时候需要注意的是:原始的文件名字 需要转码处理。 16 InputStream inp=context.getResourceAsStream("WEB-INF/download/"+filename); 17 //设置头部信息。 18 //添加不同的转码的文件名字。 19 response.setHeader("content-disposition","attachment;filename="+_filename); 20 ServletOutputStream out=response.getOutputStream(); 21 //io对拷。使用common.io 22 IOUtils.copy(inp,out); 23 } 24 25 public static String base64EncodeFileName(String fileName) { 26 /** 27 * 该函数主要处理判断请求的浏览器内核进行处理。 28 * 针对不同的浏览器内核,进行不同转码。 29 */ 30 BASE64Encoder base64encoder = new BASE64Encoder(); 31 try { 32 return "=?UTF-8?B?" + new String(base64encoder.encode(fileName.getBytes("UTF-8"))) + "?="; 33 } catch (java.io.UnsupportedEncodingException e) { 34 e.printStackTrace(); 35 throw new RuntimeException(e); 36 } 37 } 38 39 }