一)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();
  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();
  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. }

http 的request和response 在servlet的应用文件下载的更多相关文章

  1. JavaWeb(一)Servlet中的request与response

    一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...

  2. Servlet(四):request和response对象

    Request对象:问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器. 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性. 解决: 使用对象进行存储,服务器每 ...

  3. 说一下Servlet里面得request和response

    当一个servlet被调用的时候,我们一般继承带协议的httpServlet,大方向上是下图这样 在这里面request和response起了什么作用呢? 来细究一下. request:1.封装了客户 ...

  4. servlet中request和response

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  5. JSP Servlet中Request与Response所有成员方法的研究

    HttpServletRequest与HttpServletResponse作为Servlet中doGet.doPost等方法中传递的参数,承接了Http请求与响应中的大部分功能,请求的解析与响应的返 ...

  6. servlet之request和response的使用区分

    有的时候在写servlet程序时,我总是被一个方法该用request去调用.还是用response去调用而困惑.从而造成编程时间的延长. 我在区分request和response的使用时,使用的方法是 ...

  7. JSP Servlet中的Request和Response的简单研究

    本文参考了几篇文章所得,参考目录如下: 1.http://www.cnblogs.com/guangshan/p/4198418.html 2.http://www.iteye.com/problem ...

  8. 【转载】Servlet中的request与response

      一.HttpServletRequest概述   1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时, ...

  9. javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response

    - Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件&quo ...

随机推荐

  1. css 相对单位rem详解

      CSS3新增了一个相对单位rem(root em,根em),这个单位引起了广泛关注.这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素. ...

  2. java-集合小结

    Java集合框架提供了一套性能优良.使用方便的接口和类,包括Collection和Map两大接口,它们都位于   java.util           包中.其中 Collection集合包含两个常 ...

  3. 洛谷P4783 【模板】矩阵求逆(高斯消元)

    题意 题目链接 Sol 首先在原矩阵的右侧放一个单位矩阵 对左侧的矩阵高斯消元 右侧的矩阵即为逆矩阵 // luogu-judger-enable-o2 #include<bits/stdc++ ...

  4. 用Struts2实现列表显示和分页功能

    引用自http://www.2cto.com/kf/201309/243730.html BlogDAO.java文件 /** 根据条件(默认一张表所有数据)返回多条记录 */ public List ...

  5. eclipse中DDMS 视图中sdcard中文件导入的处理

    首先需要说明下,这里说的sdcard的权限并不是指在Android application程序中设置sdcard的权限读 取问题.而是指在DDMS看到的目录下的那个sdcard目录的权限问题.     ...

  6. Oracle SQL_TRACE使用小结

    一.关于基础表Oc_COJ^c680758 rd-A6z/&[1R1] H680758 Oracle10G之前,启用AUTOTRACE功能需要手工创建plan_table表,创建脚本为$ORA ...

  7. 读书笔记week1——涂涵越

    这次读书笔记主要是就<程序员修炼之道>这本书的前半部分做一些总结以及发表一些自己的看法. 本书前面的一部分主要是一些程序员应该在工作中时刻注意的事情,一些关键的信息如下: 1.处理问题的态 ...

  8. 【翻译&转载】shader的导数函数介绍

    原文链接:http://www.aclockworkberry.com/shader-derivative-functions/ 他人的翻译:http://blog.sina.com.cn/s/blo ...

  9. Android组件系列----Activity组件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  10. TreeSet集合的add()方法源码解析(01.Integer自然排序)

    >TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itca ...