一)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. sqlserver年月日转汉字大写

    也是今天sql群里有人问,看起来这个问题挺简单,但是我不知道具体该怎么实现.百度了一把,找到一个高手贡献的答案,记一下. 参考链接 sql中转换中文日期 ------ 配合相关函数 ------ cr ...

  2. 云数据库HBase助力物联网,免费申请中

    云数据库HBase免费申请地址:https://cn.aliyun.com/product/hbase 引言 从有线互联网到无线互联网,本质是加强了人与人之间随时随地的关联.下一个互联的时代是万物互联 ...

  3. git 错误error: failed to push some refs to

    今天使用VSCODE 学习node.js,  想在git上push代码 于是在git上建立了一个私有的长裤, 连接后push代码时提示如下错误: error: failed to push some ...

  4. Date()对象的设置与解析

    怎么获取当前时间? 怎么给Date对象设置特定时间? 将Date对象解析为毫秒数? 将Date对象解析为日月年?获取小时/分钟/秒? 直接new Date()新建对象,可以获取当前时间的Date对象: ...

  5. linux 链接命令

    ln link /bin/ln -s 创建软链接ln -s [原文件] [链接文件] 软链接 ln -s /etc/issue /tmp/issue.soft硬链接ln /etc/issue /tmp ...

  6. Pig parallel reduce并行执行数

    parallel语句可以附加到Pig Latin中任一个关系操作符后面,然后它会控制reduce阶段的并行,因此只有对与可以触发reduce过程的操作符才有意义.     可以触发reduce过程的操 ...

  7. MQTT介绍(3)java模拟MQTT的发布,订阅

    MQTT目录: MQTT简单介绍 window安装MQTT服务器和client java模拟MQTT的发布,订阅 在此强调一下mqtt的使用场景: 1.不可靠.网络带宽小的网络 2.运行的设备CPU. ...

  8. 团队项目个人进展——Day02

    一.昨天工作总结 冲刺第二天,昨天成功接入高德地图接口,并通过官方提供的文档实现了地图定位功能,通过官方在GitHub上提供的Demo可以看出还能实现天气查看,路径规划等功能: 二.遇到的问题 虽然通 ...

  9. 5.servlet 上传文件

    一.maven依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>com ...

  10. 7.log4j2的使用

    一.简介 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等.如 ...