一)response

我们通过浏览器访问网站的时候,处理响应的是response。

它由三部门组成:响应行、响应头、响应体 作用:往浏览器写东西。

1)响应行

格式:协议/版本  状态码 状态码说明。

状态码:

  1xx 已发送请求。

2xx  已完成响应  200 正常响应。

3xx   还需浏览器进一步操作。

302 重定向,配合响应头:location。

304 读缓存。

4xx  用户操作错误。

404  用户操作错误。

405   访问方法不存在。

5xx

500  服务器内部错误。

  常用方法:

      setStauts()该方法,设置http返回码的时候,如果返回的自定义的比如说111的状态码直接浏览器处于pending状态,4xx的返回码也会显示请求有问题等。

 @WebServlet(name = "Servlet_Rsq")
public class Servlet_Rsq extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setStatus();
response.getWriter().print("<h1>状态码400</h1>");
}
}

操作响应头:

    setHeader(String key,String val) addHeader(String  key,String val)设置相应头,如果存在则追加,如果不存在添加。

         response.getWriter().print("<div>三秒之后进行跳转!</div>");
response.setHeader("refresh","3;url=/");

常用响应头:

1): 重定向建议使用第二种

1、location:需要注意必须配合setstatus()方法

         response.setStatus();
response.setHeader("location","/local");

      2:sendRedirect()

 response.sendRedirect("/local");

   2)文件下载

    1、超链接下载:之前我们在部署下载服务器的时候,直接使用超链接下载,但是有的类型文件,比如说:xml 在下载的时候,直接被打开。而有的zip包取能被下载,这是为什么呢?

之所以会被下载是因为:浏览器解析不了的文件,会被浏览器下载处理,如果可以被解析的文件的,则会在浏览器呈现出来。也就是文件的mintype类型问题。所以出现之前的情况。

    2、代码下载

通过指定文件mimeType的类型,通过输入IO流和输出流,返回给浏览器可以直接被下载,不会被出现上面的问题。

    还有一个问题:文件名字中带有中文的时候,不同的浏览器需要编码不同。

    Firefox:需要的base64编码

其他浏览器:需要utf-8

     1)获取文件的mimeType类型。

     2)设置头部信息。

     3)对拷流。

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename=request.getParameter("filename");
System.out.println(filename);
ServletContext context=this.getServletContext();
String mi=context.getMimeType("/download/"+filename);
System.out.println(mi);
response.setContentType(mi);
InputStream inp=context.getResourceAsStream("WEB-INF/download/time.jpg");
//设置头部信息。
response.setHeader("content-disposition","attachment;filename="+filename);
ServletOutputStream out=response.getOutputStream();
//io对拷。使用common.io
IOUtils.copy(inp,out);
}

二)request

  作用:获取浏览器的发送过来的数据。

组成部分:

请求行、请求头、请求体

操作请求行:

格式:

请求方式  请求资源  协议/版本

常用方法: HttpServletRequest

掌握的方法:

         //获取请求方法:get、post等
String method=request.getMethod();
//获取远程执行IP
String ip=request.getRemoteAddr();
//获取项目名称。
String pro=request.getContextPath();
System.out.println(method+" "+ip+" "+pro);

  操作请求头:

         //获取请求浏览器内核。
String nut=request.getHeader("user-agent");
//获取页面请求的来源 防盗链
String com=request.getHeader("referer");
System.out.println(nut+" "+com);

  获取单个key多个值情况(checkbox)

         //获取单个请求参数。
String finame=request.getParameter("filename");
//获取多个请求参数的值。
String[] vals=request.getParameterValues("info");
for(String i:vals){
System.out.println(i);
}
//获取多组参数值。
Map<String,String[]> get_val=request.getParameterMap();
// System.out.println(get_val);
for(String key:get_val.keySet()){
System.out.println(Arrays.toString(get_val.get(key)));
}

三:

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")

         //获取多个请求参数的值。
String[] vals=request.getParameterValues("info");
for(String i:vals){
System.out.println(new String(i.getBytes("iso-8859-1"),"utf-8"));
}

下载文件扩展:

针对带有中文的下载文件处理。针对不同的浏览器进行不同的处理

       String filename=request.getParameter("filename");
filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
System.out.println(filename);
String _filename;
if(nut.contains("Firefox")){
_filename=base64EncodeFileName(filename);
}else{
_filename= URLEncoder.encode(filename,"utf-8");
}
System.out.println(_filename);
ServletContext context=this.getServletContext();
String mi=context.getMimeType("/download/"+filename);
System.out.println(mi);
response.setContentType(mi);
//获取输入的流的时候需要注意的是:原始的文件名字 需要转码处理。
InputStream inp=context.getResourceAsStream("WEB-INF/download/"+filename);
//设置头部信息。
//添加不同的转码的文件名字。
response.setHeader("content-disposition","attachment;filename="+_filename);
ServletOutputStream out=response.getOutputStream();
//io对拷。使用common.io
IOUtils.copy(inp,out);
} public static String base64EncodeFileName(String fileName) {
/**
* 该函数主要处理判断请求的浏览器内核进行处理。
* 针对不同的浏览器内核,进行不同转码。
*/
BASE64Encoder base64encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} }

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. Linux常用指令大全

    2017-03-25   16:35:42 刚开始学习Linux,由于记忆力有限,把平时常用的Linux命令整理出来,以便随时查阅:  linux 基本命令    ls     (list 显示当前目 ...

  2. java-接口和抽象类的联系和区别。

    接口和抽象类的联系和区别. 一,简单总结 1.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象. 2.抽象类要被子类继 ...

  3. 通过编写聊天程序来熟悉python中多线程及socket的用法

    1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...

  4. angular2上传图片

    话不多说,直接写 一.html页面 二.html代码:   <div class="descright"> <div class="clinic-img ...

  5. opencv3.2.0形态学滤波之膨胀

    //名称:膨胀 //日期:12月21日 //平台:QT5.7.1+opencv3.2.0 /* 膨胀(dilate)的含义: 膨胀就是求局部最大值的操作,就是将图像(或图像的一部分,A)与核 B 进行 ...

  6. git push 提示 Everything up-to-date

    第一次在 Google Code 上弄项目,注册完毕后,尝试增加一个新文件用以测试 Git 是否好好工作.结果在 Push 时却显示 Every up-to-date,检查文件时却发现实际上一个都没更 ...

  7. 180328_gVim设置tab为4个空格

    找到gVim安装目录 C:\Program Files (x86)\Vim\ 更改目录下的 _vimrc 文件,这是一个只读文件,需要管理员权限进行修改和保存. 在文件末尾添加下列内容: set ts ...

  8. 关于Vue中:key="index"的console警告

    在写vue项目时,浏览器的console出现如下警告信息: [Vue warn]: Property or method "index" is not defined on the ...

  9. Stored Properties 与 Computed Properties

    Stored Properties 与 Computed Properties About Swift Stored Properties In its simplest form, a stored ...

  10. unwrapped与wrapped变量取值的问题

    unwrapped与wrapped变量取值的问题 当我们在定义一个tableView时,是可以使用3种定义方式的,第一种就是定义成optional(AnyObject?)形式,第二种为non-opti ...