10.request和response

来源:互联网 发布:网络育人工作心得体会 编辑:程序博客网 时间:2024/05/22 20:42

1. response

  • 作用:往浏览器写东西
  • 组成部分:响应行 响应头 响应体

1.1 操作响应行

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

状态码:

1xx:已发送请求2xx:已完成响应    200:正常响应3xx:还需浏览器进一步操作    302:重定向 配合响应头:location    304:读缓存4xx:用户操作错误    404:用户操作错误.    405:访问的方法不存在5xx:服务器错误    500:内部异常

常用方法:

setStatus(int 状态码):针对于 1 2 3 sendError(int 状态码):针对于 4xx和5xx

1.2 操作响应头

格式:key/value(value可以是多个值)

1.2.1 常用的方法:

setHeader(String key,String value):设置字符串形式的响应头了解:setIntHeader(String key,int value):设值整形的响应头了解:setDateHeader(String key,long value):设值时间的响应头addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置了解:addIntHeader(String key,int value):添加整形的响应头了解:addDateHeader(String key,long value):添加时间的响应头

1.2.2 常用的响应头:

  • location:重定向
  • refresh:定时刷新
  • content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
  • content-disposition:文件下载
重定向:
方式1:    ★response.sendRedirect("/day10/loc2");方式2:    response.setStatus(302);    respooen.setHeader("location","/day10/loc2");
定时刷新:
方案1:设置头 refresh     respooen.setHeader("refresh","秒数;url=跳转的路径");方案2:http的meta标签    <meta http-equiv="refresh" content="3;url=/day10/refresh2.html">

1.3 操作响应体:页面上要展示的内容

1.3.1 常用方法:

Writer getWriter():字符流ServletOutputStream getOutputStream() :字节流自己写的东西用字符流,其他一概用字节流.

1.3.2 处理响应中文乱码:

方式1:★    response.setContentType("text/html;charset=utf-8");方式2:理解    response.setHeader("content-type", "text/html;charset=utf-8");

注意:

两个流互斥当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)

文件下载

  1. 设置文件的mime类型

    String mimeType=context.getMimeType(文件名)response.setContentType(mimeType);
  2. 设置下载头信息 content-disposition

    response.setHeader("content-disposition", "attachment;filename="+文件名);
  3. 提供流

    response.getOutputStream();
  4. 文件名乱码

    String filename = request.getParameter("name");filename = new String(filename.getBytes("iso8859-1"), "utf-8");
扩展:使用commons-io工具类
//方式3 使用工具类编码    String _filename = DownLoadUtils.getName(request.getHeader("user-agent"), filename);    response.setHeader("content-disposition","attachment;filename="+_filename );
对拷流:IOUtils.copy(is,os);
实例代码
String filename = request.getParameter("name");//注意中文乱码filename = new String(filename.getBytes("iso8859-1"), "utf-8");ServletContext context = this.getServletContext();context.getMimeType(filename);InputStream is = context.getResourceAsStream("/download/"+filename);//获取输出流    ServletOutputStream os = response.getOutputStream();IOUtils.copy(is,os);os.close();is.close();

2. request(请求)

  • 作用:获取浏览器发送过来的数据
  • 组成部分:请求行 请求头 请求体

2.1 操作请求行

  • 格式:请求方式 请求资源 协议/版本

2.1.1 常用方法:HttpServletRequest

掌握    String getMethod():获取请求方式    String getRemoteAddr():获取ip地址    String getContextPath() :在java中获取项目名称  (/day10)了解:    getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist    getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist    String getQueryString():get请求的所有参数   username=tom&password=123    String getProtocol():获取协议和版本例如:请求行GET /day10/row?username=tom&password=123 HTTP/1.1   

2.2 操作请求头

  • 格式:key/value(value可以是多个值)

2.2.1 常用方法:

String getHeader(String key):通过key获取指定的value (一个)了解:    Enumeration getHeaders(String name) :通过key获取指定的value(多个)    Enumeration getHeaderNames() :获取所有的请求头的名称    int getIntHeader(String key):获取整型的请求头    long getDateHeader(String key):获取时间的请求头

2.2.2 重要的请求头:

user-agent:浏览器内核 msie firefox chromereferer:页面从那里来 防盗链

2.3 操作请求参数

username=tom&password=123&hobby=drink&hobby=sleep

2.4 常用方法:

String getParameter(String key):获取一个值String[] getParameterValues(String key):通过一个key获取多个值Map<String,String[]> getParameterMap():获取所有的参数名称和值

2.3 请求的中文乱码:

  • 对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
  • 对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码

2.3.1 通用的方法:

new String(参数.getBytes("iso-8859-1"),"utf-8");针对于post请求来说:只需要将请求流的编码设置成utf-8即可    request.setCharacterEncoding("utf-8");

处理中文响应乱码

response.setContentType("text/html;charset=utf-8");

3. 域对象:

3.1 request:

  • 创建:一次请求来的时候
  • 销毁:响应生成的时候
  • 作用:一次请求里面的数据
  • 请求转发(请求链,请求串)

    request.getRequestDispatcher("内部路径").forward(request,response);

4. 封装对象:apache提供的一个工具类,BeanUtils

  • 封装数据
  • 使用步骤:

    • 导入jar包(commons-beanutils-1.8.3.jar)
    • 调用 BeanUtils.populate(Object bean,Map<> 参数);

      BeanUtils.populate(user, request.getParameterMap());

请求转发和重定向区别:

  • 重定向发送两次请求,请求转发一次请求

  • 重定向地址栏发生改变,请求转发不变

  • 重定向是从浏览器发送,请求转发是服务器内部

  • 重定向不存在request域对象,请求转发可以使用request域对象

  • 重定向是response的方法,请求转发是request的方法

  • 重定向可以请求站外资源,请求转发不可以,如跳转到银行页面

    request.getRequestDispatcher("/内部路径").forward(request,response);
原创粉丝点击