一)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. 设计模式学习——工厂模式(Factory Pattern)

    1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...

  2. 关于CSRF跨域请求伪造的解决办法

    中秋节时候我们的应用在短信验证码这块被恶意刷单,比如被用来做垃圾短信之类的,如果大规模被刷也能造成不小的损失.这还只是短信验证码,如果重要的API遭到CSRF的攻击,损失不可估量.所以紧急加班解决了C ...

  3. js-权威指南学习笔记10

    第十章 正则表达式的模式匹配 1.正则表达式是一个描述字符模式的对象. 2.可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多是通过一种特殊的直接量语法来创建. 3.程序 ...

  4. Html5不可见标签,及标签属性(元素对象属性) a href target name id 相对路径

    标签属性分类(元素对象属性) 不可见标签与可见标签: <head></head>        属于不可见标签, 里面的内容一般用于css还有全局的一些变量,声明等. 而且如果 ...

  5. 构建微服务:快速搭建Spring Boot项目

    Spring Boot简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  6. .hivehistory

    在当前用户的家目录下有个.hivestory文件,里面存放了用户执行的hive操作记录,如下: [hadoop@hadoop1 hive-0.14]$ cat ~/.hivehistory show ...

  7. Eigen学习之Array类

    Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构.区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致.但是存在一个问题是数学上 ...

  8. leetcode 之 Degree of an Array

    1.题目描述 Given a non-empty array of non-negative integers nums, the degree of this array is defined as ...

  9. Vue-学习。

    ---恢复内容开始--- Vue.js 与 Angular.js 非常相似,只要学过了Angular.js然后在学Vue.js就非常的简单. 什么是Vue? 相比Angularjs和ReactJS,V ...

  10. 3.如何在Maven项目中引入自己的jar包

    1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...