http 的request和response 在servlet的应用文件下载
一)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的应用文件下载的更多相关文章
- JavaWeb(一)Servlet中的request与response
一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...
- Servlet(四):request和response对象
Request对象:问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器. 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性. 解决: 使用对象进行存储,服务器每 ...
- 说一下Servlet里面得request和response
当一个servlet被调用的时候,我们一般继承带协议的httpServlet,大方向上是下图这样 在这里面request和response起了什么作用呢? 来细究一下. request:1.封装了客户 ...
- servlet中request和response
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- JSP Servlet中Request与Response所有成员方法的研究
HttpServletRequest与HttpServletResponse作为Servlet中doGet.doPost等方法中传递的参数,承接了Http请求与响应中的大部分功能,请求的解析与响应的返 ...
- servlet之request和response的使用区分
有的时候在写servlet程序时,我总是被一个方法该用request去调用.还是用response去调用而困惑.从而造成编程时间的延长. 我在区分request和response的使用时,使用的方法是 ...
- JSP Servlet中的Request和Response的简单研究
本文参考了几篇文章所得,参考目录如下: 1.http://www.cnblogs.com/guangshan/p/4198418.html 2.http://www.iteye.com/problem ...
- 【转载】Servlet中的request与response
一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时, ...
- javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response
- Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件&quo ...
随机推荐
- css 相对单位rem详解
CSS3新增了一个相对单位rem(root em,根em),这个单位引起了广泛关注.这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素. ...
- java-集合小结
Java集合框架提供了一套性能优良.使用方便的接口和类,包括Collection和Map两大接口,它们都位于 java.util 包中.其中 Collection集合包含两个常 ...
- 洛谷P4783 【模板】矩阵求逆(高斯消元)
题意 题目链接 Sol 首先在原矩阵的右侧放一个单位矩阵 对左侧的矩阵高斯消元 右侧的矩阵即为逆矩阵 // luogu-judger-enable-o2 #include<bits/stdc++ ...
- 用Struts2实现列表显示和分页功能
引用自http://www.2cto.com/kf/201309/243730.html BlogDAO.java文件 /** 根据条件(默认一张表所有数据)返回多条记录 */ public List ...
- eclipse中DDMS 视图中sdcard中文件导入的处理
首先需要说明下,这里说的sdcard的权限并不是指在Android application程序中设置sdcard的权限读 取问题.而是指在DDMS看到的目录下的那个sdcard目录的权限问题. ...
- Oracle SQL_TRACE使用小结
一.关于基础表Oc_COJ^c680758 rd-A6z/&[1R1] H680758 Oracle10G之前,启用AUTOTRACE功能需要手工创建plan_table表,创建脚本为$ORA ...
- 读书笔记week1——涂涵越
这次读书笔记主要是就<程序员修炼之道>这本书的前半部分做一些总结以及发表一些自己的看法. 本书前面的一部分主要是一些程序员应该在工作中时刻注意的事情,一些关键的信息如下: 1.处理问题的态 ...
- 【翻译&转载】shader的导数函数介绍
原文链接:http://www.aclockworkberry.com/shader-derivative-functions/ 他人的翻译:http://blog.sina.com.cn/s/blo ...
- Android组件系列----Activity组件详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- TreeSet集合的add()方法源码解析(01.Integer自然排序)
>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码 TreeSet集合使用实例 package cn.itca ...