一)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. 关于Datagridview控件用法的一些总结

    一.引言 Datagridview控件在winform开发中还是比较常用,一般的数据库系统都会使用它,但是想要友好的展示数据,形成良好的用户界面,那么就要对c#库中默认的Datagridview设置进 ...

  2. java.lang.NoSuchMethodError 报500

    1. 概述 mvc项目 接口报500 localhost 错误日志 07-Jan-2019 17:12:43.664 SEVERE [catalina-exec-21] org.apache.cata ...

  3. 【代码笔记】iOS-DropDownDemo-下拉按钮效果

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  4. CRM 安装过程 AD+SQL+CRM

    AD: 通过服务器管理器添加域服务,配置域服务器域名为crm5.lab. 注意:使用高级模式安装. 说明:服务器是windows server 2003 那么就选windows server 2003 ...

  5. 如何选择分布式事务形态(TCC,SAGA,2PC,基于消息最终一致性等等)

    各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务 基于TCC实现的分布式事务 基于SAGA实现的分布式事务 基于2PC实现的分布式事务 这些形 ...

  6. Android开发各种Utils收集库

    为方便查找,已进行大致归类,其目录如下所示: Activity相关→ActivityUtils.java→Demo isActivityExists : 判断是否存在Activity launchAc ...

  7. web service概念、架构及相关知识

    原文:http://blog.csdn.net/liu_shi_jun/article/details/51121597 一.WebService的定义 WebService有好几种定义: W3C组织 ...

  8. 自己搭建云盘 – 简单的PHP网盘程序

    自己搭建云盘 – 简单的PHP网盘程序 Veno File Manager 2.6.3 汉化版 相信大家都比较熟悉或使用过 Owncloud 网盘程序,Owncloud 虽强大,不过太过于臃肿,而 V ...

  9. UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordin al not in range(128)——解决方案备注

    在vim中使用ycm插件时,偶尔会出现: “UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ord ...

  10. Re:LieF ~親愛なるあなたへ~ 后感

    遇到烦恼就能有个安逸的地方逃避.这个想法真好.遗憾现实并不能如此.若是觉得这款纯爱作有些许的感人之处,那定时因为受众玩家正在通过玩游戏来逃避现实.“虚拟世界的感情是真实的.” 这件事在旁人看来或许是笑 ...