什么是Request和Response
Request是服务器对浏览器请求的封装,Response是服务器对服务器响应的封装
Request是用来取出请求信息的,Response是添加要返回给浏览器的信息
二、使用response对象设置http响应协议中的信息
响应首行
HTTP/1.1 200 OK
setStatus
:设置正常的响应状态码 status code
setStatus
:设置正常的响应状态码,状态码描述 status message,过时,因为正常状态下,状态码信息不会显示给用户,所以没有必要设置sendError
:设置错误的状态码sendError
:设置错误的状态码,包含错误信息
响应头
key:value
setHeader
:设置一个键值对,值为stringsetDateHeader
:设置一个键值对,值为long,long常用于毫秒的表示setIntHeader
:设置一个键值对,值为int类型setHeader
:添加一个键值对,值为stringsetDateHeader
:添加一个键值对,值为long,long常用于毫秒的表示setIntHeader
:添加一个键值对,值为int类型- add 和 set 区别在于,前者直接添加(key是可以重复的),后者会修改原来的,没有才会添加
几个常见的响应头:
ContentType:text/html;charset=utf-8
Refresh:3;url=http://path 3秒后跳转网页
响应空行
;
响应正文
需要发送的资源
response.getWriter()
:获取字符流- 父类方法
getOutputSteam()
:获取输出字节流
重定向
方法一:
1. 在响应头中添加302状态码,告诉浏览器需要进行重定向
response.setStatus(302)
2.在响应头中添加Location,指定重定向的位置
response.setHeader("Location", ".....");
方法二:
response.setRedirect(".....")
通过访问Servlet向浏览器传递一个图片
// 获取图片输入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INFO/mm.jpg");
// 获取浏览器的输出流
byte[] buffer = new byte[1024];
// 将图片篇输入流写出到浏览器中
int len = -1;
while((len = is.readBuffer(buffer)) != -1){
os.write(buffer, 0, len);
os.flush();
}
通过访问Servlet下载文件
ServletContext sc = getServletContext();
String mimeType = sc.getMimeType("下载的文件名称"); // 传入下载的文件名称,会根据名称的拓展名识别mime类型
response.setContentType(type);
通过request对象获取http请求协议中的内容
请求首行
请求方式 请求路径 协议/版本号
request.getMethod() 请求方式
request.getContextPath(),getServletPath()…获取请求路径
父类方法 request.getScheme() 获取请求协议
请求头
键值对
request.getHeader(String name)
request.getIntHeader(String name)
request.getDateHeader(String name)
request.getHeaderNames()
request.getHeaders(Sring name)一个key对应多个value
请求空行
请求正文(post才有)
但是以下方法,无论是get还是post请求都可以获得参数值
父类方法 String getParameter(String name)
Map<String, String[]> getParameterMap()
Enumeration getParameterNames()
String[] getParameterValues(String name)
解决响应和请求的乱码问题
处理get请求编码问题
解决方案:在conf/server.xml中URIEncoding="UTF-8" 69行
<Connector URIEncoding="UTF-8"
connectionTimeout="20000"
port="8888"
protocol="HTTP/1.1"
redirectPort="8443"/>
处理post请求编码问题
服务器响应时的数据,即服务器向浏览器传递的数据的编码格式由服务器决定:
编码:
getByte("编码表") 字节流
response.setCharacterEncoding(编码表) 字符流
解码:
response.setHeader("ContentType","text/html;charset=utf-8") 设置响应消息头
客户端发送请求时的乱码解决:
GET提交,参数在URL中,设置URL的解码配置,服务器默认使用IOS-8855-1拉丁码表解码URL,我们可以通过 tomcat/config/server.xml
配置文件中:
<Connector
connectionTimeout="20000"
port="8080"
URIEncoding="UTF-8" //添加属性
protocol="HTTP/1.1"
redirectPort="8443"/>
POST提交:
request.setCharacterEncoding("utf-8");
参考文章