request;response 对象

response

1. response简介

response的类型为HttpServletResponse,它是Servlet的service()方法的参数。

当客户端发出请求时,tomcat会创建request和rsponse来调用Servlet的service()方法,每次请求都会创建新的request和response。

response是用来向客户端完成响应。

2 response的两个流,用来响应正文

response.getWriter() ,返回值为PrintWriter,用响应字符数据。

response.getOutputStream(),返回值为ServletOutputStream,用来响应字节数据。

在一个请求范围内,这两个流不能同时使用!不然会输出非法状态异常。

3 response字符流的编码问题

response的字符流默认使用ISO-8859-1编码,可以使用response.setCharaceterEncoding(“utf-8”)来设置编码;

浏览器在没有得到Content-Type头时,会使用GBK来解读字符串,当如果你设置了Content-Type,会使用你指定编码来解读字符串。response.setContentType(“html/texgt;charset=utf-8”);

4 response字符流的缓冲区

response字符流缓冲区大小为8KB;

可以调用response.getWriter().flush()方法完成刷新,这会把当前缓冲区中的数据发送给客户端。

当response一旦开始了发送,那么response的内部会有一个提交状态为true。可以调用response的isCommitted()方法来查看当前的提交状态。

5 自动刷新

有一个响应头:Refresh,它的作用是在指定的时间后,自动重定向到指定路径。例如:response.setHeader(“Refresh”, “5;URL=http://www.baidu.com”);,表示在5秒后自动跳转到百度。

6 设置状态码

response.sendError(404, “没找到您访问的资源”)

response.sendStatus(302);

7 重定向

重定向:两个请求。

Ø 第一个请求,服务器响应码:302

Ø 第一个请求的响应头有一个Location头,它说明了要重定向的URL;

Ø 第二个请求,浏览器重新向Location头指定的URL发出。

重定向:可以重定向到本项目之外的页面。例如可以重定向到百度!

重定向:可以重定向到本项目内的其他资源,可以使用相对路径,以“/项目名”开头

重定向:会使浏览器的地址栏发生变化!

注意事项:

当response为以提交状态,就不能再重定向了!

当使用了response的输出流响应后,再重定向。如果没有造成response提交,那么说明数据还在缓冲区中,tomcat会把缓冲区清空,然后重定向。

request

post请求方式

有主体(正文)

有Content-Type,表示主体的类型,默认值为application/x-www-form-urlencoded;

2 request功能:

可以获取请求方式:String getMethod()

可以获取请求头:String getHeader(String name)

可以获取请求参数(包含主体或路径后面的参数):String getParameter(String name)

3 请求编码

地址栏的参数是GBK的;

在页面中点击链接或提交表单,参数都由当前页面的编码来决定,而页面的编码由当初服务器响应的编码来决定。

服务器请求form.html,服务器响应utf-8的页面给浏览器,然后在form.html页面上点击链接和提交表单发送的参数都是utf-8。

如果服务器的所有页面都是utf-8的,那么只要不在浏览器的地址栏中给出中文,那么其他的参数都是utf-8的。

服务器:

服务器默认使用ISO-8859-1来解读请求数据。(tomcat7以前是这个编码)

可以使用request.setCharacterEncoding(“utf-8”)设置编码来解读请求参数。这个方法只对请求主体有效,而GET请求没有主体。说白了就是只对POST请求有效!

设置Tomcat 其中GET请求的默认编码:

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" URIEncoding="UTF-8"/>

因为编码的设置不能依赖tomcat的配置,所以还是需要我们自己手动转码

Ø String name = request.getParamter(“username”);//使用默认的iso来解码

Ø byte[] bytes = name.getBytes(“iso-8859-1”);//使用iso回退到字节数组

Ø name = new String(bytes, “utf-8”);//重新使用utf-8来解码

4 获取参数(详细)

*String getParameter(String name) :通过参数名称获取参数值!

String[] getParameterValues(String name):通过参数名称获取多个参数值!一般复选框会出现一个名称多个值的情况。

*Map<String,String[]> getParameterMap():获取所有参数,封装到Map中,基参数名为key,参数值为value。

Enumeration getParameterNames():获取所有参数的名称

5 request是Servlet三大域对象之

域功能:

void setAttribute(String name,Object value)

Object getAttribute(String name)

void removeAttribute(String name)

request 的存储范围:整个请求链!如果一个请求经过了多个Servlet,那么这些Servlet可以共享request域!

6 request获取头信息

String getHeader(String name):通过头名称,获取头信息;

Enumeration getHeaderNames() :获取所有头的名称;

Enumeration getHeaders(String name):通过头名称,获取多个头信息;

int getIntHeader(String name):通过头名称,获取头信息,本方法再把String的头信息转换成int类型。

7 reuqest的请求转发

如何请求转发

一个请求内经过多个资源(Servlet,还有jsp,而且经常是jsp)

请求转发需要使用RequestDispatcher的forward(HttpServletRequest,HttpServletResponse)

RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);//参数是要转发的目标

rd.forward(request,response);//转发到BServlet

其实你可以理解成在一个Servlet中,调用另一个Servlet的service()方法。

请求转发的注意事项

在第一个Servlet中可以使用request域保存数据,在第二个Servlet中可以使用request域获取数据。因为这两个Servlet共享同一个request对象。

在转发语句之后,其他语句是否会执行?答案是“可以”!

不能在一个Servlet中即重定向,又转发。

请求转发与重定向比较

请求转发后,地址栏中的地址不变!重定向变

请求转发是一个请求,重定向是两个请求;

请求转发可以共享request域,而重定向因为是两个请求,所以不能共享request。

一个请求,只有一个请求方式!所以转发后还是原来的请求方式,如果一开始发出的是GET,那么整个请求都是GET!重定向不同,因为是多个请求,第一个无论是什么方式,第二个请求都是GET。

请转转发只能是本项目中的资源,而重定向可以其他项目。

如果要转发,就不要输出

如果输出到缓冲区的数据,没有提交,那么在转发时,缓冲区会被清空,如果已经提交,那么在转发时抛出异常。这一点与重定向相同!

留头不留体:在第一个Servlet中设置头没问题,会保留到下一个Servlet。如果在第一个Servlet中输出数据,即设置响应体,那么如果没有提交,就被清空,如果已提交,就出异常。

8 请求包含

请求包含:

RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);

rd.include(request,response);

留头又留体!

路径

客户端路径:

1. 超链接:href=”/项目名/…”

2. 表单:action=”/项目名/…”

3. response.sendRedirect(“/项目名/…”);

如果客户端路径,没有已“/项目名”开头,那么相对的是当前页面所在路径。

例如:http://localhost:8080/day10_3/a.html,当前页面所在路径是http://localhost:8080/day10_3/

以“/”开头的客户端路径相对“http://localhost:8080”,<a href=”/hello/AServlet”>

服务器端路径:

转发:必须使用“/”开头,它相对当前项目,即http://localhost:8080/day10_3

包含:同上;

<url-pattern>:同上

ServletContext.getRealPath(“/a.jpg”):它是真对真实路径,相对当前WebRoot

ServletContext.getResourceAsStream():同上

Class.getResourceAsStream():如果使用“/”开头,相对classes,如果不使用“/”,相对当前.class文件所在目录。

ClassLoader. getResourceAsStream():无论使用不使用“/”开头,都相对classes

编码:

URL编码

作用:为了在客户端与服务器之间传递中文!

把中文转换成URL编码:

Ø 首先你需要选择一种字符编码,然后把中文转换成byte[]。

Ø 把每个字节转换成16进制,前面添加上一个“%”。它不能显负号,把得到的byte先加上128,这样-128就是0了。正的127就是255了,它的范围是%00~%FF

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2017-03-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码洞

深入Python多进程通信原理与实战——图文

继上节使用原生多进程并行运行,基于Redis作为消息队列完成了圆周率的计算,本节我们使用原生操作系统消息队列来替换Redis。

832
来自专栏Android干货

Python IO编程

循环读取文件内容,一般读取文件内容一次读取完,内存是不够的,就要实现一次次少量数据读取

1022
来自专栏用户2442861的专栏

JSP常用跳转方式

http://blog.csdn.net/wanghuan203/article/details/8836326#comments

1801
来自专栏码生

Linux 权限代码解析

首先说明: 数字后面为9位由字母或-组成的 每三位对应前面的一个数字 例如:755 rwx 对应第一个7 r-x 对应第二个5 r-x 对应第三个5

1364
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(二十八) ——Redis集群节点结构与槽分配

《Redis设计与实现》读书笔记(二十八) ——Redis集群节点结构与槽分配 (原创内容,转载请注明来源,谢谢) 一、概述 redis集群是...

4366
来自专栏技巅

Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(1)

1703
来自专栏Python爬虫与算法进阶

Python函数超时,用装饰器解决

我们在自定义一个函数后,会调用这个函数来完成我们想要的功能。 就拿爬虫来举例,你发送请求,服务器给你响应,但是有可能服务器没有给你任何数据,无论是他识别了爬虫、...

2312
来自专栏有趣的Python

Python文件处理 - 专题笔记文件简介文件基础操作文件属性及OS模块使用文件练习

任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。掌握文件的基本概念、基本操作,了解文件属性、 linux 系统的文件管理机制及os模块对...

3706
来自专栏程序员同行者

django基础之二

1294
来自专栏python3

python3--队列Queue,管道Pipe,进程之间的数据共享,进程池Pool,回调函数callback

既打印了主进程put的值,也打印了子进程put的值,在进程中使用队列可以完成双向通信

2961

扫码关注云+社区